Arduino学习篇,基础入门

article/2025/9/22 23:46:05

什么是arduino?

简单来讲arduino就是通过源代码控制开发板的信号输入输出从而实现对一些电子元件的控制,例如LED灯,蜂鸣器,按键

arduino程序
首先来讲arduino程序是基于C语言,而实现类似对于LED灯和蜂鸣器的简单控制只需简单C语言知识即可实现。
arduino程序是基于函数的,而在arduino的库有很多函数,我们只需要调用即可。
arduino的程序主体是**setup()函数和loop()**函数以及其它在使用过程中需要构建的函数。

setup()函数
**setup()**函数主要功能是初始化变量,调用库函数,管理引脚等。

loop()函数
**loop()**函数的主要功能是循环的执行函数内的语句,简单来讲就是一个循环。

LED灯实验中用到的库函数
1.pinMode(pin,mode),数字I/O口输入输出定义函数,pin代表数字数字I/O输入输出端的1~13,mode表示输入(INPUT)输出(OUTPUT),例如你想实现从端口6输出信号,则代码是:
 

pinMode(6,OUTPUT);

2.digitalWrite(pin,vale),数字I/O口电平定义函数,pin同样代表1~13,vale代表HIGH(高电平)或LOW(低电平),对于LED灯来说,HIGH可使灯发光,LOW可使灯熄灭。例如想实现位于端口6的灯亮的代码是:

digitalWrite(6,HIGH);

3.delay(ms),延时函数,单位ms,可实现对命令的延迟,例如,实现亮灯500ms,就是让输出的高电平持续500ms,代码是:

delay(500);

4.analogWrite(pin,value);脉冲宽度调制技术

(1)作用:输出除了0V和5V之外的电压,产生一个十分接近于模拟信号的输出

(2)使用:通过带有"~"符号的端口输出,使用**analogWrite(pin,value)**函数输出模拟信号,pin代表引脚,value代表输出值(0-255)。

(3)原理:调制一串方波(只有开和关的信号)的占空比(一串方波中高低电平时间所占百分比),通过调控占空比就可以达到调控输出电压的值,例如
analogWrite(pin,127); 表示的时在引脚输出占空比为50%的方波,也就是输出2.5V的模拟电压。
 

analogWrite(pin,value);

5.digitalRead(pin)==vale(LOW or HIGH );数字I/O口电平读取函数,pin同样代表1~13,vale代表HIGH(高电平)或LOW(低电平),

digitalRead(BUTTON)==LOW

6.串口函数

(1)串口接收
在使用串口前,我们需要对串口的波特率也就是传输速度进行设置,需要用到函数 serial.begin(value),value即是设置波特率。
串口接收函数 serial.println(),在在函数中输入参数就可以使用串口输出了。

(2)串口发送
使用 serial.read()函数,它可以读取我们通过串口发送的信号
我们来实现一个简单的程序:当你通过串口发送任意信号时,让它输出
'"Hello,world"信号

void setup(){Serial.begin(9600);
}void loop(){if (Serial.available() > 0){char ch=Serial.read();Serial.println("Hello, world")
}
}

我们注意到,在loop()函数使用了Serial.available()函数,在使用串口时ARDUINO会将所有数据暂时存放在缓冲区,而当串口缓冲区没有可读数据时,Serial.read()函数返回的值会造成乱码,时泳Serial.available()函数可以检测串口缓冲区是否有可读数据,搭配 if 语句时,有可读数据则再进行命令,还特别值得注意的是,在串口监视器的右下角有一个波特率设置,这里的波特率数值需要和前面定义的数值一致
(3)在串口发送字符控制灯的亮灭
程序如下:

int LED = 9;void setup() {// put your setup code here, to run once:Serial.begin(9600);pinMode(LED,OUTPUT);}void loop() {// put your main code here, to run repeatedly:if(Serial.available()>0){char ch=Serial.read();Serial.println(ch);if (ch == 'A'){digitalWrite(LED,HIGH);Serial.println("turn on");}else if (ch == 'B'){digitalWrite(LED,LOW);Serial.println("turn off");}}
}

通过这个程序,当你向ARDUINO串口发送数据 ‘A’ 时,LED灯会亮起来,同时串口监视器会接收到一串"turn on"字符,再次发送 ‘B’ 时,LED灯会灭,同时发送"turn off"
运行结果如下

运行结果

 (4)<1>匹配一个字符串并且输出相应的内容

我们知道,串口通讯函数serial.read() 的功能是从串口缓存区读取一个字符并将之删除,此时我的想法是构建一个 Str类,用+=语法将每次读取的一个字符存入一个变量为str的字符串中,那么代码如下

void loop(){String str="";while(Serial.available()>0){char ch=Serial.read();str +=ch;}Serial.print("input the str:");Serial.println(str);
}

当我们向串口发送"hello"时,可以看到结果如下

在这里插入图片描述

(2)这个时候我又想到了用strcmp(str1,str2)函数,它的功能是对两个字符串进行比较,如果相等则返回"0”。好,我们用函数来试一下:

char trystring[6];
char serialdata[6];
void setup() {// put your setup code here, to run once:Serial.begin(9600);strcpy(trystring,"hello");
}void loop() {// put your main code here, to run repeatedly:if (Serial.available()>0){for (int i=0;i<=4;i++){char str = Serial.read();serialdata[i]=str;}}if (strcmp(trystring,serialdata)==0){Serial.print("data is: ");Serial.println(serialdata);Serial.println("hello,world!");}delay(500);}

 当我们再次向串口发送"hello"时,来看看运行结果:

在这里插入图片描述

 (5)呼吸灯

(1)呼吸灯?那是啥?呃…就是从亮到暗从再从暗到亮,我们知道数字输出要么输出5V要么输出0V,那我们如果让输出的电压从0~5V一点一点的增加再一点一点的减少不就可以了吗?
(2)要实现这个目的,我们就要用到PWM波模拟值函数analogWrite(pin,value)函数了,他和digiralWrite(pin,value)用法一样,只是value值变成了0~255,映射到了0–5V,代码如下:
 

int LED=9;
void setup(){pinMode(LED,OUTPUT);
}void loop(){for (int i=0;i<=255;i++){digital.Write(LED,i);delay(5);}for (int i=255;i>=0;i--){digital.Write(LED,i);delay(5);}
}

(6)通过光敏电阻与程序实现对LED灯的控制

话不多说,上代码:

void setup() {// put your setup code here, to run once:pinMode(2,OUTPUT);pinMode(4,OUTPUT);pinMode(A0,INPUT);pinMode(A1,INPUT);Serial.begin(9600);digitalWrite(2,HIGH);delay(500);digitalWrite(4,HIGH);delay(500);
}void loop() {// put your main code here, to run repeatedly:int a =analogRead(A0);int b= analogRead(A1);if (a>b){digitalWrite(2,LOW);digitalWrite(4,HIGH);delay(300);}else if(a<b){digitalWrite(4,LOW);digitalWrite(2,HIGH);delay(300);}delay(500);Serial.print("a: ");Serial.println(a);Serial.print("b: ");Serial.println(b);}

我们在这里用到了analogRead(pin)函数,它的功能是模拟输入,用于模拟输入引脚读取数值,可以将0–5V的电压映射到数值0–1023,也就是0V等于0,5V等于1023,

只需要测量两个光敏电阻上的电压大小,再进行比较就可以实现了,当左边电阻减小时,让右边亮起来,当右边电阻减小时,让左边亮起来,当我们挡住任意一边时,另一边永远都不会亮。

(7)光敏呼吸灯

 void setup() {// put your setup code here, to run once:pinMode(3,OUTPUT);pinMode(5,OUTPUT);pinMode(A0,INPUT);pinMode(A1,INPUT);Serial.begin(9600);analogWrite(3,127);analogWrite(5,127);for (int i=127;i<=255;i++){analogWrite(3,i);analogWrite(5,255-i);delay(10);}
}void loop() {// put your main code here, to run repeatedly:int a =analogRead(A0);int b= analogRead(A1);if (a>b){for (int i=0;i<=255;i++){analogWrite(3,255-i);analogWrite(5,i);delay(5);}}else if(a<b){for (int i=0;i<=255;i++){analogWrite(5,255-i);analogWrite(3,i);delay(5);}}delay(100);Serial.print("a: ");Serial.println(a);Serial.print("b: ");Serial.println(b);}

(8)舵机

(1)在使用舵机时需要用到ARDUINO的扩展库<Servo.h>,

该库的一些基本函数:

1. attach()

描述
将Servo变量附加到引脚,注意:在Arduino 0016及之前的版本上,Servo库仅支持将舵机连接至第9和第10脚上。
语法
servo.attach(pin)
servo.attach(pin, min, max)
参数说明
servo,一个类型为servo的变量
pin,连接至舵机的引脚编号
min(可选),舵机为最小角度(0度)时的脉冲宽度,单位为微秒,默认为544
max(可选),舵机为最大角度(180度时)的脉冲宽度,单位为微秒,默认为2400

2. write()

描述
向舵机写入一个数值,来直接控制舵机的轴。在一个标准的舵机中,这将设定齿轮的角度,将齿轮转到对应的位置。在一个连续旋转的舵机中,这将设置一个舵机的角度(0作为全速向一边,180为全速向另一边,在90附近的值为停止)。
语法
servo.write(angle)
参数说明
servo,一个类型为servo的变量
angle,写向舵机的角度,从0到180之间

3. writeMicroseconds()

描述
向舵机写入一个微秒的值来控制舵机的轴。在一个标准舵机中,这将设置舵机齿轮的角度。在标准舵机中,参数设置为1000为完全逆时针方向,2000完全顺时针方向,1500为在中间。
注意:一些生产厂商没有按照这个标准,以至于,舵机通常响应在700到2300之间的值。自由地增加终点值直到舵机不再增加它的范围。注意,让舵机旋转超过它的终点(通常会发出异常声响)是一个高电流状态,应该被避免。
连续旋转舵机对该函数的响应类似于write()函数
语法
servo.writeMicroseconds(uS)
参数说明
servo,一个类型为servo的变量
uS,一个代表微秒值的整数参数

3. writeMicroseconds()

描述
向舵机写入一个微秒的值来控制舵机的轴。在一个标准舵机中,这将设置舵机齿轮的角度。在标准舵机中,参数设置为1000为完全逆时针方向,2000完全顺时针方向,1500为在中间。
注意:一些生产厂商没有按照这个标准,以至于,舵机通常响应在700到2300之间的值。自由地增加终点值直到舵机不再增加它的范围。注意,让舵机旋转超过它的终点(通常会发出异常声响)是一个高电流状态,应该被避免。
连续旋转舵机对该函数的响应类似于write()函数
语法
servo.writeMicroseconds(uS)
参数说明
servo,一个类型为servo的变量
uS,一个代表微秒值的整数参数

4. read()

描述
读取舵机当前的角度(最后一次用write()函数写入的值)
语法
servo.read()
参数说明
servo,一个类型为servo的变量
返回值
舵机的角度,从0至180度

5. attached

描述
检查一个servo变量是否被附加到一个引脚
语法
servo.attached()
参数说明
servo,一个类型为servo的变量
返回值
返回true,如果被附加到一个引脚,反之返回false

6. detach

描述
将servo变量与引脚脱离,如果所有servo变量均被脱离,第9和第10教将可以用analogWrite()函数进行PWM输出。
语法
servo.detach()
参数说明
servo,一个类型为servo的变量

该库中有控制舵机的函数,舵机有三个接口,分别是电源、接地、控制口,先来看看我们的代码:

# include <Servo.h>      //伺服电机扩展库
Servo myservo;
void setup() {// put your setup code here, to run once:Serial.begin(9600);myservo.attach(2);
}
int INPUTdata=0;
void loop() {// put your main code here, to run repeatedly:if(Serial.available()>0){INPUTdata+=1;int toPos = Serial.parseInt();int fromPos = myservo.read();if(toPos>=fromPos){for (int i=fromPos;i<=toPos;i++){myservo.write(i);delay(15);}}else{for (int i=fromPos;i>=toPos;i--){myservo.write(i);delay(15);}}Serial.print("INPUTdata");Serial.print(INPUTdata);Serial.print("  fromPos: ");Serial.print(fromPos);Serial.print("    toPos: ");Serial.println(toPos);while(Serial.available()>0){Serial.read();}}}

语句介绍:

定义一个伺服电机对象:

Servo myservo;

将伺服电机对象接到2号口,可对伺服电机控制:

myservo.attach(2);

parseInt()函数,从串口接收数据,只读取数字;

Serial.parseInt();

伺服电机库函数,读取当前电机状态,返回电机位置:

myservo.read();

伺服电机库函数,控制电机转动到值为value的位置 0=<value<=180;

myservo.write(value);

(2)程序解释,从串口接收一个数据然后转到对应位置,但是我们将程序烧到UNO板上,发现电机转动的很快,这里我们设置一个for()循环,控制电机转动速度。

(9). 数码管

(1)数码管简介
数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管
和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数的显示);
按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳极数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)数码管。共阳数码管在应用时应将公共极
COM 接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。

(2)实验:数码管随机显示数字

int BUTTON=2;
void style_0(void){digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);digitalWrite(9,LOW);
}
void style_1(void){digitalWrite(4,LOW);digitalWrite(7,LOW);
}
void style_3(void){digitalWrite(4,LOW);digitalWrite(3,LOW);digitalWrite(5,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);
}
void style_2(void){digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,LOW);digitalWrite(8,LOW);digitalWrite(9,LOW);
}
void style_4(void){digitalWrite(4,LOW);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);
}
void style_5(void){digitalWrite(3,LOW);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);
}
void style_6(void){digitalWrite(3,LOW);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);digitalWrite(9,LOW);
}void setup() {// put your setup code here, to run once:for(int i=3;i<=9;i++){pinMode(i,OUTPUT);pinMode(BUTTON,INPUT);}}void loop() {// put your main code here, to run repeatedly:int Number = GetRandomNumber(0,7);DisplayNumber(Number);delay(250);DisplayClear();delay(250);}
int GetRandomNumber(int MinNum,int MaxNum){int RandNumber = random(MinNum,MaxNum);return RandNumber;
}
void DisplayClear(){for (int i=3;i<=9;i++){digitalWrite(i,HIGH);}}void DisplayNumber(int GetNumber){switch(GetNumber){case 1:style_1();break;case 2:style_2();break;case 0:style_0();break;case 3:style_3();break;case 4:style_4();break;case 5:style_5();break;case 6:style_6();break;}}

(10)超神波测距模块:

(1)模块介绍

US=015超声波测距模块

电气参数US-015
工作电压DC 5V
工作电流2.2mA
工作温度0~+70度
输出方式GPIO
探测距离2cm-400cm
探测精度0.1cm+1%
分辨率高于1mm

模块一共四个接口
1号pin:接VCC电源(直流5V)。
2号pin:接外部电路的Trig端,向此管脚输入一个10us以上的高电平,可触发模块测距
3号pin:接外部电路的Echod端,当测距结束时,此管脚会输出一个高电平,电平宽度会输出一个高电平,电平宽度为超声波往返时间之和
4号pin:接外部电路的地
测距原理:在Trig引脚输入一个10us以上的高电平,系统便可发出8个40KHZ的超声波脉冲,然后检测回波信号。当检测到回波信号后,通过Echo管脚输出,最后通过 L=1/2time340m/s 则可得出距离


(2)模块搭配数码管和伺服电机的实验。


现在,我们已经知道了如何使用数码管、伺服电机和超声模块,那么接下来我们要做的就是将这三部分结合:测定障碍物的距离,当障碍物与装置的距离小于10cm时,通过数码管显示当前距离,并且让舵机转动,想象一些,如果将这些东西只能装到避障小车会是什么效果?就是寻找没有障碍的方向。
首先看看代码:
 

#include <Servo.h>
Servo my_servo;
int TrigPin=11;
int EchoPin=12;
long Echo_time=0;             //接收到高电平所用时间
double distance;
void setup() {// put your setup code here, to run once:Serial.begin(9600);my_servo.attach(2);        //将伺服电机接到2号引脚pinMode(TrigPin,OUTPUT);pinMode(EchoPin,INPUT);for (int i=3;i<=9;i++){   //将所有数码管设置为输出模式pinMode(i,OUTPUT);}my_servo.write(90);
}void style_0(void){    //显示的数字设置digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);digitalWrite(9,LOW);
}void style_1(void){digitalWrite(4,LOW);digitalWrite(7,LOW);
}void style_3(void){digitalWrite(4,LOW);digitalWrite(3,LOW);digitalWrite(5,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);
}void style_2(void){digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,LOW);digitalWrite(8,LOW);digitalWrite(9,LOW);
}void style_4(void){digitalWrite(4,LOW);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);
}void style_5(void){digitalWrite(3,LOW);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);
}void style_6(void){digitalWrite(3,LOW);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);digitalWrite(9,LOW);
}void style_7(void){digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(7,LOW);
}void style_8(void){digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);digitalWrite(9,LOW);}void style_9(void){digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);
}void loop() {// put your main code here, to run repeatedly:for (int i=3;i<=9;i++){digitalWrite(i,HIGH);}digitalWrite(TrigPin,LOW);delayMicroseconds(2);digitalWrite(TrigPin,HIGH);delayMicroseconds(10);       //让测距模块开始工作发出频率电波digitalWrite(TrigPin,LOW);Echo_time=pulseIn(EchoPin,HIGH);       //读取接收到声波来回的时间if (Echo_time>1&&Echo_time<85000){distance=Echo_time*0.017;     //通过接收到高电平的时间算出当前距离}Serial.print("the distance is: ");Serial.print(distance);Serial.println(" cm");int real_dis=(int)distance;  //将浮点数类型的distance转换为整数if (real_dis<10){waring_num(real_dis);     //显示危险距离delay(200);for(int i=3;i<=9;i++){digitalWrite(i,HIGH); //熄灭所有灯管}int fromPos=my_servo.read();servo_turn(fromPos);delay(100);}delay(500);
}
void waring_num(int waring_dis){   //显示小于10的危险距离switch(waring_dis){case 1:style_1();break;case 2:style_2();break;case 0:style_0();break;case 3:style_3();break;case 4:style_4();break;case 5:style_5();break;case 6:style_6();break;case 7:style_7();break;case 8:style_8();break;case 9:style_9();break;}}
void servo_turn(int fromPos){         //舵机转动函数int toPos=30*random(1,6);if (fromPos<toPos){for (int i=fromPos;i<=toPos;i++){my_servo.write(i);delay(15);}}else{for (int i=fromPos;i>=toPos;i--){my_servo.write(i);delay(15);}}Serial.print("the formPos: ");Serial.print(fromPos);Serial.print(" the toPos: ");Serial.println(toPos);delay(100);
}

(2)模块搭配数码管和伺服电机的实验
现在,我们已经知道了如何使用数码管、伺服电机和超声模块,那么接下来我们要做的就是将这三部分结合:测定障碍物的距离,当障碍物与装置的距离小于10cm时,通过数码管显示当前距离,并且让舵机转动,想象一些,如果将这些东西只能装到避障小车会是什么效果?就是寻找没有障碍的方向。
首先看看代码:
 

#include <Servo.h>
Servo my_servo;
int TrigPin=11;
int EchoPin=12;
long Echo_time=0;             //接收到高电平所用时间
double distance;
void setup() {// put your setup code here, to run once:Serial.begin(9600);my_servo.attach(2);        //将伺服电机接到2号引脚pinMode(TrigPin,OUTPUT);pinMode(EchoPin,INPUT);for (int i=3;i<=9;i++){   //将所有数码管设置为输出模式pinMode(i,OUTPUT);}my_servo.write(90);
}void style_0(void){    //显示的数字设置digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);digitalWrite(9,LOW);
}void style_1(void){digitalWrite(4,LOW);digitalWrite(7,LOW);
}void style_3(void){digitalWrite(4,LOW);digitalWrite(3,LOW);digitalWrite(5,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);
}void style_2(void){digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,LOW);digitalWrite(8,LOW);digitalWrite(9,LOW);
}void style_4(void){digitalWrite(4,LOW);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);
}void style_5(void){digitalWrite(3,LOW);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);
}void style_6(void){digitalWrite(3,LOW);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);digitalWrite(9,LOW);
}void style_7(void){digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(7,LOW);
}void style_8(void){digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);digitalWrite(9,LOW);}void style_9(void){digitalWrite(3,LOW);digitalWrite(4,LOW);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);digitalWrite(8,LOW);
}void loop() {// put your main code here, to run repeatedly:for (int i=3;i<=9;i++){digitalWrite(i,HIGH);}digitalWrite(TrigPin,LOW);delayMicroseconds(2);digitalWrite(TrigPin,HIGH);delayMicroseconds(10);       //让测距模块开始工作发出频率电波digitalWrite(TrigPin,LOW);Echo_time=pulseIn(EchoPin,HIGH);       //读取接收到声波来回的时间if (Echo_time>1&&Echo_time<85000){distance=Echo_time*0.017;     //通过接收到高电平的时间算出当前距离}Serial.print("the distance is: ");Serial.print(distance);Serial.println(" cm");int real_dis=(int)distance;  //将浮点数类型的distance转换为整数if (real_dis<10){waring_num(real_dis);     //显示危险距离delay(200);for(int i=3;i<=9;i++){digitalWrite(i,HIGH); //熄灭所有灯管}int fromPos=my_servo.read();servo_turn(fromPos);delay(100);}delay(500);
}
void waring_num(int waring_dis){   //显示小于10的危险距离switch(waring_dis){case 1:style_1();break;case 2:style_2();break;case 0:style_0();break;case 3:style_3();break;case 4:style_4();break;case 5:style_5();break;case 6:style_6();break;case 7:style_7();break;case 8:style_8();break;case 9:style_9();break;}}
void servo_turn(int fromPos){         //舵机转动函数int toPos=30*random(1,6);if (fromPos<toPos){for (int i=fromPos;i<=toPos;i++){my_servo.write(i);delay(15);}}else{for (int i=fromPos;i>=toPos;i--){my_servo.write(i);delay(15);}}Serial.print("the formPos: ");Serial.print(fromPos);Serial.print(" the toPos: ");Serial.println(toPos);delay(100);
}

将舵机初始位置设为90°,然后每次测距之后都判断距离是否在安全范围类,如果不在安全范围内,显示当前距离,然后就让舵机随机像一个方向转动任意的30°的倍数,然后再次检测。代码本身是没有什么难度,而是在于将三个部分组合起来使用的思维,使用合适的代码将三个部分的代码组合并且使之连贯。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/7pH5XfZJ.shtml

相关文章

TCP 四次挥手,可以变成三次挥手吗?

作者&#xff1a;小林coding 计算机八股文网站&#xff1a;https://xiaolincoding.com 大家好&#xff0c;我是小林。 虽然我们在学习 TCP 挥手时&#xff0c;学到的是需要四次来完成 TCP 挥手&#xff0c;但是在一些情况下&#xff0c; TCP 四次挥手是可以变成 TCP 三次挥手的…

TCP的三次握手、四次挥手--非常详细讲解

本篇文章转自 TCP的三次握手(建立连接&#xff09;和四次挥手(关闭连接&#xff09;不过进行了一些编辑。 TCP(Transmission Control Protocol) 传输控制协议 1&#xff64;TCP三次握手和四次挥手的过程图 tcp的6种标志位的分别代表&#xff1a; SYN(synchronous建立联机) ACK…

两张动图-彻底明白TCP的三次握手与四次挥手

背景描述 通过上一篇中网络模型中的IP层的介绍&#xff0c;我们知道网络层&#xff0c;可以实现两个主机之间的通信。但是这并不具体&#xff0c;因为&#xff0c;真正进行通信的实体是在主机中的进程&#xff0c;是一个主机中的一个进程与另外一个主机中的一个进程在交换数据。…

http——三次握手四次挥手

http htttp:TCP三次握手四次挥手&#xff08;TCP连接的释放&#xff09; htttp: 超文本传输协议&#xff08;Hyper Text Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消…

HTTP的三次握手和四次挥手

目录 1. HTTP的三次握手2. HTTP的四次挥手3. HTTPS的三次握手 1. HTTP的三次握手 三次握手&#xff08;Three-way Handshake&#xff09;其实就是指建立一个TCP连接时&#xff0c;需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力…

我终于搞懂了TCP的三次握手和四次挥手(图片案例超详解)

【辰兮要努力】&#xff1a;hello你好我是辰兮&#xff0c;很高兴你能来阅读&#xff0c;昵称是希望自己能不断精进&#xff0c;向着优秀程序员前行&#xff01; 博客来源于项目以及编程中遇到的问题总结&#xff0c;偶尔会有读书分享&#xff0c;我会陆续更新Java前端、后台、…

tcp四次挥手,为什么是四次?

上一篇博客说了三次握手为什么是是三次&#xff08;点这里&#xff09;&#xff0c;那么现在就介绍一下四次挥手。大家都知道TCP是全双工的&#xff0c;再建立连接时的三次握手中的SYN和ACK一起发送&#xff0c;这里就会有疑问&#xff0c;为什么在四次挥手的时候没有将SYN和AC…

TCP三次握手,四次挥手的全过程,为什么需要三次握手,四次挥手

文章目录 前言TCP协议的介绍三次握手四次挥手 前言 主要介绍为什么TCP协议需要三次握手和四次挥手 TCP协议的介绍 传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议. 面向连接&…

TCP四次挥手

第一次挥手&#xff1a; 主动断开方&#xff08;客户端&#xff0c;服务的都可以&#xff09;向对方发送一个FIN结束请求报文&#xff0c;并设置序列号和确认号&#xff0c;随后主动断开方进入FIN_WAIT1状态&#xff0c;这表示主动断开方已经没有业务数据要发给对方了&#xff…

TCP的三次握手与四次挥手详解

文章目录 TCP 协议简述TCP包首部TCP 三次握手建立连接TCP 四次挥手关闭连接常见面试题&#xff1a; TCP 协议简述 TCP 提供面向有连接的通信传输&#xff0c;面向有连接是指在传送数据之前必须先建立连接&#xff0c;数据传送完成后要释放连接。TCP传输的是字节流 无论哪一方…

什么是“三次挥手”和“四次握手”

文章目录 一、为什么要进行三次握手二、握手为什么要三次三、挥手为什么需要三次四、挥手为什么三次不行总结 前言 首先&#xff0c;我们先说什么是”三次握手“和”四次挥手“ 1.我们先来简单介绍一下”三次握手“ &#xff08;1&#xff09;.先来介绍一下里面这些看起来比较…

简述TCP四次挥手

四次挥手主要用到了两个标志位(ACK&FIN): ACK 示意参考:TCP三次握手FIN: 终止数据传输标志位---->当FIN为1的时候代表此数据为终止断开连接的请求 四次挥手流程: 由于TCP连接是双向传输的对等的模式即双工 wiki百科定义: 全双工&#xff08;full-duplex&#xff09;的…

简述四次挥手

什么是四次挥手 由于TCP连接是全双工的,断开一个TCP连接,需要客户端与服务器发送四个包来确认连接的断开 简述四次挥手的过程: 因为TCP是全双工的,因此,每个方向都要单独关闭 当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着 一方向不会再…

三次握手四次挥手

三次握手四次挥手是tcp协议中的&#xff0c;在说三次握手四次挥手先说一下tcp协议和udp协议。 &#xff08;1&#xff09;我们常用的网络通信如浏览网页、软件聊天、看的爱奇艺上的视频都是通过tcp、udp这两种协议来进行数据传输的&#xff1b; &#xff08;2&#xff09;tcp…

TCP三次握手与四次挥手(详解)

TCP三次握手 一&#xff1a;引出 客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西&#xff1b;由于TCP不存在连接的概念&#xff0c;只存在请求和响应&#xff0c;请求和响应都是数据包&#xff0c;它们之间都是经过由TCP创建的一个从客户端…

TCP连接的四次挥手全过程

TCP通过四次挥手来释放连接 四次挥手的过程如下&#xff1a; 第一次挥手&#xff1a; 客户端向服务器发送一个 FIN 数据包&#xff08;FIN 1&#xff0c;seq u&#xff09;主动断开连接&#xff0c;报文中会指定一个序列号。告诉服务器&#xff1a;我要跟你断开连接了&am…

http三次握手四次挥手详解

1、 TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。 三次握手&#xff1a;为了对每次发送的数据量进行跟踪与协商&#xff0c;确保数据段的发送和接收同步&#xff0c;根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系&#xff0c;并建立虚连接。 四次挥…

TCP四次挥手及原因

聚散终有时&#xff0c;TCP 断开连接是通过四次挥手方式。 双方都可以主动断开连接&#xff0c;断开连接后主机中的「资源」将被释放。 上图是客户端主动关闭连接 &#xff1a; 一次挥手 客户端打算关闭连接&#xff0c;此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文&…

TCP三次握手和四次挥手详解

文章目录 三次握手和四次挥手简述三次握手的目的三次握手流程详解半连接队列和全连接队列四次挥手的目的四次挥手详解为什么客户端需要TIME_WAIT状态为什么挥手比握手多一次为什么三次挥手不行TCP报文参数释义 三次握手和四次挥手简述 三次握手&#xff0c;即客户端与服务端进…

三次握手,四次挥手,为什么是三次握手四次挥手

三次握手 两次握手&#xff08;情况1&#xff09; 两次握手&#xff08;情况2&#xff09; OK&#xff0c;下面正经地来回答下这个问题&#xff0c;要搞清楚这个问题&#xff0c;首先得了解TCP究竟是如何保证可靠传输的。 PS&#xff1a;TCP协议中&#xff0c;主动发起请求的一…