做了一个蓝牙小车,附带舵机控制、超声波、DHT11、LED、1602显示,功能可以实现,蓝牙手机控制小车有延迟。发出前进信号后等几秒才有反映,感觉是传感器读取数据延时造成的,请高手指点如何解决。。。。。
#include <dht.h>
dht DHT;
#include <LiquidCrystal.h> //调用arduino自带的LiquidCrystal库
LiquidCrystal lcd(22,6,26,27,28,29);//设置接口
#include <Servo.h>
Servo myservo; // 定义舵机对象
int inputPin=49; // 接echo
int outputPin=48; // 接trig
int DHT11_PIN=23;
int pos = 0; // 定义舵机转动位置
char zi;
int EN1 = 2; //调速1
int IN1 = 14;
int IN2 = 15;
int EN2 = 3; //调速2
int IN3 = 16;
int IN4 = 17;
int EN3 = 4; //调速3
int IN5 = 18;
int IN6 = 19;
int EN4 = 5; //调速4
int IN7 = 20;
int IN8 = 21;
int led = 24;
void setup()
{
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(IN5, OUTPUT);
pinMode(IN6, OUTPUT);
pinMode(IN7, OUTPUT);
pinMode(IN8, OUTPUT);
pinMode(led, OUTPUT);
myservo.attach(7); // 设置舵机控制针脚
lcd.begin(16, 2); //初始化LCD
lcd.print("OK"); //使屏幕显示文字
delay(1000); //延时1000ms
pinMode(inputPin, INPUT);
pinMode(outputPin, OUTPUT);
pinMode(DHT11_PIN, INPUT);
}
void loop()
{
if(Serial.available() > 0)
{
zi = Serial.read();
if(zi == '9')
{
digitalWrite(IN1,LOW); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN2,HIGH); // 改变电平方向,电机反转
digitalWrite(IN3,LOW); // 电平相同,电机停止
digitalWrite(IN4,HIGH);
digitalWrite(IN5,LOW); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN6,HIGH); // 改变电平方向,电机反转
digitalWrite(IN7,LOW); // 电平相同,电机停止
digitalWrite(IN8,HIGH);
analogWrite(EN1, 200); //PWM 调速
analogWrite(EN2, 200); //PWM 调速
analogWrite(EN3, 200); //PWM 调速
analogWrite(EN4, 200); //PWM 调速
delay(300);
digitalWrite(IN1,LOW); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN2,LOW); // 改变电平方向,电机反转
digitalWrite(IN3,LOW); // 电平相同,电机停止
digitalWrite(IN4,LOW);
digitalWrite(IN5,LOW); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN6,LOW); // 改变电平方向,电机反转
digitalWrite(IN7,LOW); // 电平相同,电机停止
digitalWrite(IN8,LOW);
}
if(zi ==':')
{
digitalWrite(IN1,HIGH); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN2,LOW); // 改变电平方向,电机反转
digitalWrite(IN3,HIGH); // 电平相同,电机停止
digitalWrite(IN4,LOW);
digitalWrite(IN5,HIGH); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN6,LOW); // 改变电平方向,电机反转
digitalWrite(IN7,HIGH); // 电平相同,电机停止
digitalWrite(IN8,LOW);
analogWrite(EN1, 200); //PWM 调速
analogWrite(EN2, 200); //PWM 调速
analogWrite(EN3, 200); //PWM 调速
analogWrite(EN4, 200); //PWM 调速
delay(300);
digitalWrite(IN1,LOW); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN2,LOW); // 改变电平方向,电机反转
digitalWrite(IN3,LOW); // 电平相同,电机停止
digitalWrite(IN4,LOW);
digitalWrite(IN5,LOW); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN6,LOW); // 改变电平方向,电机反转
digitalWrite(IN7,LOW); // 电平相同,电机停止
digitalWrite(IN8,LOW);
}
if(zi =='7')
{
digitalWrite(IN1,LOW); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN2,HIGH); // 改变电平方向,电机反转
digitalWrite(IN3,HIGH); // 电平相同,电机停止
digitalWrite(IN4,LOW);
digitalWrite(IN5,HIGH); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN6,LOW); // 改变电平方向,电机反转
digitalWrite(IN7,LOW); // 电平相同,电机停止
digitalWrite(IN8,HIGH);
analogWrite(EN1, 200); //PWM 调速
analogWrite(EN2, 200); //PWM 调速
analogWrite(EN3, 200); //PWM 调速
analogWrite(EN4, 200); //PWM 调速
delay(150);
digitalWrite(IN1,LOW); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN2,LOW); // 改变电平方向,电机反转
digitalWrite(IN3,LOW); // 电平相同,电机停止
digitalWrite(IN4,LOW);
digitalWrite(IN5,LOW); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN6,LOW); // 改变电平方向,电机反转
digitalWrite(IN7,LOW); // 电平相同,电机停止
digitalWrite(IN8,LOW);
}
if(zi =='8')
{
digitalWrite(IN1,HIGH); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN2,LOW); // 改变电平方向,电机反转
digitalWrite(IN3,LOW); // 电平相同,电机停止
digitalWrite(IN4,HIGH);
digitalWrite(IN5,LOW); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN6,HIGH); // 改变电平方向,电机反转
digitalWrite(IN7,HIGH); // 电平相同,电机停止
digitalWrite(IN8,LOW);
analogWrite(EN1, 200); //PWM 调速
analogWrite(EN2, 200); //PWM 调速
analogWrite(EN3, 200); //PWM 调速
analogWrite(EN4, 200); //PWM 调速
delay(150);
digitalWrite(IN1,LOW); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN2,LOW); // 改变电平方向,电机反转
digitalWrite(IN3,LOW); // 电平相同,电机停止
digitalWrite(IN4,LOW);
digitalWrite(IN5,LOW); // IN1(IN3)和IN2(IN4)必须相反,才能使电机转动
digitalWrite(IN6,LOW); // 改变电平方向,电机反转
digitalWrite(IN7,LOW); // 电平相同,电机停止
digitalWrite(IN8,LOW);
}
if(zi =='3')
{
for(pos = 0; pos < 180; pos += 1)
{
myservo.write(pos);
delay(15);
}
// 180到0旋转舵机,每次延时15毫秒
for(pos = 180; pos>=1; pos-=1)
{
myservo.write(pos);
delay(15);
}
}
if(zi =='4')
{
pos=0;
myservo.write(pos);
}
if(zi =='5')
{
digitalWrite(led,HIGH);
}
if(zi =='6')
{
digitalWrite(led,LOW);
}
}
digitalWrite(outputPin, LOW);
delayMicroseconds(2);
digitalWrite(outputPin, HIGH);
delayMicroseconds(10);
digitalWrite(outputPin, LOW);
unsigned long distance = pulseIn(inputPin, HIGH);
distance = (distance*170) / 1000;
int chk = DHT.read11(DHT11_PIN);
switch (chk)
{
case 0: Serial.print("OK,\t"); break;
case -1: Serial.print("Checksum error,\t"); break;
case -2: Serial.print("Time out error,\t"); break;
default: Serial.print("Unknown error,\t"); break;
}
lcd.clear(); //清屏
lcd.print("distance"); //使屏幕显示文字
lcd.print(":");
lcd.print(distance); //显示
lcd.print("mm"); //显示字母
lcd.setCursor(0, 1) ; //设置光标位置
lcd.print("s"); //使屏幕显示文字
lcd.print(":");
lcd.print(DHT.humidity,1); //显示
lcd.print("%"); //显示字母
lcd.setCursor(8, 1) ; //设置光标位置
lcd.print("w"); //使屏幕显示文字
lcd.print(":");
lcd.print(DHT.temperature,1); //显示
lcd.print((char)223);
lcd.print("C"); //显示字母
delay(1000); //延时
}
|