wjtuzi 发表于 2013-7-5 10:07:39

蓝牙小车控制延迟

做了一个蓝牙小车,附带舵机控制、超声波、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);                   //延时
      }

wjtuzi 发表于 2013-7-5 11:40:04

沙发。。。。。

wjtuzi 发表于 2013-7-6 11:54:40

给点建议吧
页: [1]
查看完整版本: 蓝牙小车控制延迟