要求:
问题:
把第3个要求单独弄成一个函数,在用的时候如果我把它放在setup里面,一旦一开始的距离<50,它就会执行但调到>50,就不会执行>50的要求。但是如果把这个函数放在loop里面,又会无限的循坏。请问该如何解决这个问题?
电路图和源代码:
#include <LiquidCrystal.h>
//lcd显示屏库
#include <Servo.h>//
Servo myservo; // 定义Servo对象来控制
int pos = 0; // 角度存储变量
const int RS=7,E=6,DB4=5,DB5=4,DB6=3,DB7=2;
LiquidCrystal lcd(RS,E,DB4,DB5,DB6,DB7);
int TrigPin=A0;
int EcoPin=A1;
float a;//距离传感器
int buzzer=8;//蜂鸣器引脚
int k=9;
int m=11;//电机引脚
void xiaoyu(){
lcd.setCursor(0,0);
lcd.print("Distance is");
lcd.setCursor(0,1);
lcd.print(a);//lcd屏显示
if(a<50){
myservo.attach(10); // 控制线连接数字9
myservo.write(90); // 舵机角度写入
delay(1000);
for(int i=90;i>=0;i--){
myservo.write(i);
delay(15);
pinMode(10,LOW);
}
digitalWrite(k,LOW);
digitalWrite(m,HIGH);
delay(500);
digitalWrite(k,LOW);
digitalWrite(m,LOW);//电机反转
delay(1000);//电机1秒停止
unsigned char i,j;
while(1){
for(i=0;i<80;i++){//输出一个频率声音
digitalWrite(buzzer,HIGH);//发声音
delay(1);//延时1ms
digitalWrite(buzzer,LOW);//不发声音
delay(1);
}
}
}
}//
void setup()
{
lcd.begin(16,2);//设置lcd要显示的2行16列
lcd.clear();//lcd
pinMode(TrigPin, OUTPUT);
pinMode(EcoPin,INPUT);
Serial.begin(9600);//距离
pinMode(buzzer, OUTPUT);//蜂鸣器
pinMode(k, OUTPUT);
pinMode(m, OUTPUT);//电机输出
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin,HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
a=float(pulseIn(EcoPin,HIGH)*17)/1000+2-0.3;//距离计算公式
delay(200);//速度
if(a<50){
xiaoyu();
}
}
void loop()
{
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin,HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
a=float(pulseIn(EcoPin,HIGH)*17)/1000+2-0.3;//距离计算公式
delay(200);//速度
lcd.setCursor(0,0);
lcd.print("Distance is");
lcd.setCursor(0,1);
lcd.print(a);//lcd屏显示
if(a>50){
digitalWrite(k,HIGH);
digitalWrite(m,LOW);
delay(500);
digitalWrite(k,LOW);
digitalWrite(m,LOW);//电机
// Serial.print("Servo motor in standby");
}else {
// xiaoyu();
}
}