极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10445|回复: 2

蓝牙小车控制延迟

[复制链接]
发表于 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);                   //延时
        }
回复

使用道具 举报

 楼主| 发表于 2013-7-5 11:40:04 | 显示全部楼层
沙发。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-6 11:54:40 | 显示全部楼层
给点建议吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 13:54 , Processed in 0.034770 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表