#include(servo.h) Servo myservo; const int trig = 11; const int echo = 10; const int led = 3; int pos = 15; void setup() { pinMode(trig, OUTPUT); pinMode(led, OUTPUT); pinMode(echo, INPUT); Serial.begin(9600); myservo.attach(9); } void loop() { for (pos = 15;pos <= 165 ; pos += 1){ myservo.write(pos); digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig,HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); long duration = pulseIn(echo,HIGH); int distance = duration/58; if (distance >= 2 && distance <=4){ analogWrite(led,map(distance,2,4,255,0)); } else if(distance < 2) { analogWrite(led,255); } else{ analogWrite(led,0); } Serial.print(distance); Serial.print("cm"); delay(100); } for (pos = 165;pos >= 15 ; pos -= 1){ myservo.write(pos); digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig,HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); long duration = pulseIn(echo,HIGH); int distance = duration/58; if (distance >= 2 && distance <=4){ analogWrite(led,map(distance,2,4,255,0)); } else if(distance < 2) { analogWrite(led,255); } else{ analogWrite(led,0); } Serial.print(distance); Serial.print("cm"); delay(100); } }在原代码的情况下增加三个LED来分别在15度到65度和65度到115度和115度到165度区间内亮
时间: 2024-01-25 15:01:52 浏览: 21
可以在代码中增加三个变量来控制这三个 LED 的亮灭。具体做法如下:
1. 在 setup() 函数中,添加三个 pinMode() 函数用于初始化三个 LED 引脚:
```c++
pinMode(4, OUTPUT); // 控制 15 度到 65 度之间的 LED
pinMode(5, OUTPUT); // 控制 65 度到 115 度之间的 LED
pinMode(6, OUTPUT); // 控制 115 度到 165 度之间的 LED
```
2. 在 loop() 函数中,根据舵机角度的不同来控制三个 LED 的亮灭。增加以下代码:
```c++
if (pos >= 15 && pos <= 65) {
digitalWrite(4, HIGH);
} else {
digitalWrite(4, LOW);
}
if (pos > 65 && pos <= 115) {
digitalWrite(5, HIGH);
} else {
digitalWrite(5, LOW);
}
if (pos > 115 && pos <= 165) {
digitalWrite(6, HIGH);
} else {
digitalWrite(6, LOW);
}
```
这段代码中,用 if 语句判断舵机角度的范围,如果在相应的范围内,则点亮相应的 LED;否则熄灭 LED。
最终的代码如下:
相关问题
#include <Servo.h>Servo myservo;const int trig = 11; const int echo = 10; const int led = 3; void setup() { pinMode(trig, OUTPUT); pinMode(led, OUTPUT); pinMode(echo, INPUT); Serial.begin(9600); myservo.attach(9); } void loop() { digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig,HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); long duration = pulseIn(echo,HIGH); int distance = duration/58; if (distance >= 2 && distance <=400){ analogWrite(led,map(distance,2,400,255,0)); } else if(distance < 2) { analogWrite(led,255); } else{ analogWrite(led,0); } int angle = map(distance,2,400,15,165); myservo.write(angle); delay(10); Serial.print(distance); Serial.print("cm"); delay(100); }如何让舵机自由在15度和165度之间转动不受distance的干涉
要让舵机自由在15度和165度之间转动不受距离(distance)的干涉,可以将舵机的控制语句放在距离判断语句之前,这样无论距离是多少,都不会影响舵机的转动。以下是修改后的代码:
```
#include <Servo.h>
Servo myservo;
const int trig = 11;
const int echo = 10;
const int led = 3;
void setup() {
pinMode(trig, OUTPUT);
pinMode(led, OUTPUT);
pinMode(echo, INPUT);
Serial.begin(9600);
myservo.attach(9);
}
void loop() {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
long duration = pulseIn(echo,HIGH);
int distance = duration/58;
int angle = map(distance,2,400,15,165);
myservo.write(angle);
delay(10);
if (distance >= 2 && distance <=400){
analogWrite(led,map(distance,2,400,255,0));
}
else if(distance < 2) {
analogWrite(led,255);
}
else{
analogWrite(led,0);
}
Serial.print(distance);
Serial.print("cm");
delay(100);
}
```
这样就可以实现距离检测和舵机转动的功能,而且舵机的转动不受距离的干涉。
#include <Servo.h> Servo myservo; const int trig = 11; const int echo = 10; const int led = 3; void setup() { pinMode(trig, OUTPUT); pinMode(led, OUTPUT); pinMode(echo, INPUT); Serial.begin(9600); myservo.attach(9); } void loop() { digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig,HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); long duration = pulseIn(echo,HIGH); int distance = duration/58; int angle = map(distance,2,400,15,165); myservo.write(angle); delay(10); if (distance >= 2 && distance <=400){ analogWrite(led,map(distance,2,400,255,0)); } else if(distance < 2) { analogWrite(led,255); } else{ analogWrite(led,0); } Serial.print(distance); Serial.print("cm"); delay(100); }在这个代码中实现舵机转动并且舵机转动不用map()函数
好的,这个代码中使用了map()函数将超声波测距得到的距离映射到舵机需要转动的角度,我们可以将这部分代码改为直接计算舵机需要转动的角度,不需要使用map()函数。
修改后的代码如下:
```
#include <Servo.h>
Servo myservo;
const int trig = 11;
const int echo = 10;
const int led = 3;
void setup() {
pinMode(trig, OUTPUT);
pinMode(led, OUTPUT);
pinMode(echo, INPUT);
Serial.begin(9600);
myservo.attach(9);
}
void loop() {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
long duration = pulseIn(echo,HIGH);
int distance = duration/58;
int angle = 0;
if(distance <= 2){ // 距离小于等于2cm,舵机转动到最小角度
angle = 15;
}else if(distance >= 400){ // 距离大于等于400cm,舵机转动到最大角度
angle = 165;
}else{ // 距离在2cm到400cm之间,计算舵机需要转动到的角度
angle = (distance - 2) * (165 - 15) / (400 - 2) + 15;
}
myservo.write(angle);
delay(10);
if (distance >= 2 && distance <=400){
analogWrite(led,map(distance,2,400,255,0));
}else if(distance < 2){
analogWrite(led,255);
}else{
analogWrite(led,0);
}
Serial.print(distance);
Serial.print("cm");
delay(100);
}
```
在这个代码中,我们使用if语句来确定舵机需要转动到的角度,根据距离的大小计算出来。如果距离小于等于2cm,舵机转动到最小角度(15度);如果距离大于等于400cm,舵机转动到最大角度(165度);如果距离在2cm到400cm之间,通过线性插值计算出舵机需要转动到的角度。这样就不需要使用map()函数了。
相关推荐
![ino](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)