2015-12-01 68 views
0

我有一个伺服和超声波不能一致运行的问题。我的代码现在的工作原理如下:伺服器每10秒钟移动一次,超声波总是检测范围并在LED上显示结果。 我一直在寻找谷歌的参考,我发现,延迟造成伺服和超声波不能一起运行。为了使用millis(),需要多任务处理。但我仍然不能使用millis()函数。 如何用millis()更改我的代码中的延迟?如何在arduino上使用毫秒运行伺服和超声波传感器?

感谢您的帮助!

#include <Servo.h> 
#define trigPin 13 
#define echoPin 12 
#define ledM 10 
#define ledK 9 
#define ledH 8 

Servo ikiservo; //servo 
int pos = 0; //set positon servo 
int pinSpeaker = 4; //buzzer 

void setup() { 
    Serial.begin (9600); //SERIAL 
    ikiservo.attach(3); //servo 
    pinMode(pinSpeaker, OUTPUT); 
    pinMode(trigPin, OUTPUT); //ultrasonic 
    pinMode(echoPin, INPUT); //ultrasonic 
    pinMode(ledM, OUTPUT); 
    pinMode(ledK, OUTPUT); 
    pinMode(ledH, OUTPUT); 
} 

void loop() { 
    //-------------SERVO---------- 

    for(pos = 0; pos < 90; pos += 1) // goes from 0 degrees to 90 degrees 
    {         // in steps of 1 degree 
    ikiservo.write(pos);    
    delay(10000);  // waits 10s for the servo to reach the position 
    } 

    //---------ULTRASONIC----------- 
    long duration, distance; 
    digitalWrite(trigPin, LOW); 
    delayMicroseconds(2); 
    digitalWrite(trigPin, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(trigPin, LOW); 
    duration = pulseIn(echoPin, HIGH); 
    distance = (duration/2)/29.1; 
    Serial.print(distance); 
    Serial.println(" cm"); 
    delay (400); 

    if (distance > 4 && distance <7) { // turn on ledM when distance 4<distance<7 
    digitalWrite(ledM,HIGH); 
    digitalWrite(ledK,LOW); 
    digitalWrite(ledH,LOW); 
    playTone(300, 160);   //buzzer ON 
    delay(1000); 
    //buzzer 
    } else if(distance > 2 && distance <4) {// turn on ledK when 7<distance<4 
    digitalWrite(ledM,LOW); 
    digitalWrite(ledK,HIGH); 
    digitalWrite(ledH,LOW); 
    playTone(0, 0); 
    delay(1000); 
    } else if(distance <2) {//turn on ledH when distance<2 
    digitalWrite(ledM,LOW); 
    digitalWrite(ledK,LOW); 
    digitalWrite(ledH,HIGH); 
    playTone(0, 0); 
    delay(1000); 
    } else{      //turn off all 
    digitalWrite(ledM,LOW); 
    digitalWrite(ledK,LOW); 
    digitalWrite(ledH,LOW); 
    playTone(0, 0); 
    delay(1000); 
    } 
} 

void playTone(long duration, int freq) { //funtion for add tone on buzzer 
    duration *= 1000; 
    int period = (1.0/freq) * 1000000; 
    long elapsed_time = 0; 
    while (elapsed_time < duration) { 
     digitalWrite(pinSpeaker,HIGH); 
     delayMicroseconds(period/2); 
     digitalWrite(pinSpeaker, LOW); 
     delayMicroseconds(period/2); 
     elapsed_time += (period); 
    } 
} 

回答

0

你不等待10秒钟,但15分钟。这可能是你的代码中唯一的问题。

如果,在其他的方式,要跨越10秒90°区域,然后回去就写这

for(pos = 0; pos < 90; pos += 1) // goes from 0 degrees to 90 degrees 
{         // in steps of 1 degree 
    ikiservo.write(pos);    
    delay(100); // waits 0.1s for the servo to reach the position 
       // so total time will be 9 seconds 
} 

,代码

void loop() { 
    //-------------SERVO---------- 

    for(pos = 0; pos < 90; pos += 1) // goes from 0 degrees to 90 degrees 
    {         // in steps of 1 degree 
     ikiservo.write(pos); 

     //---------ULTRASONIC----------- 
     long duration, distance; 
     digitalWrite(trigPin, LOW); 
     delayMicroseconds(2); 
     digitalWrite(trigPin, HIGH); 
     delayMicroseconds(10); 
     digitalWrite(trigPin, LOW); 
     duration = pulseIn(echoPin, HIGH); 
     distance = (duration/2)/29.1; 
     Serial.print(distance); 
     Serial.println(" cm"); 

     if (distance > 4 && distance <7) { // turn on ledM when distance 4<distance<7 
      digitalWrite(ledM,HIGH); 
      digitalWrite(ledK,LOW); 
      digitalWrite(ledH,LOW); 
     } else if(distance > 2 && distance <4) {// turn on ledK when 7<distance<4 
      digitalWrite(ledM,LOW); 
      digitalWrite(ledK,HIGH); 
      digitalWrite(ledH,LOW); 
     } else if(distance <2) {//turn on ledH when distance<2 
      digitalWrite(ledM,LOW); 
      digitalWrite(ledK,LOW); 
      digitalWrite(ledH,HIGH); 
     } else{      //turn off all 
      digitalWrite(ledM,LOW); 
      digitalWrite(ledK,LOW); 
      digitalWrite(ledH,LOW); 
     } 

     delay(100); // waits 0.1s for the servo to reach the position 
    } 
} 

我不得不删除音调,因为你使用它的方式不允许其他“进程”同时工作。只要看看它是否是你想要的方法;如果它是回报,我们可以看到如何实现它也与蜂鸣器

+0

也许音需要被删除。我仍然很困惑如何让蜂鸣器同时运行。但感谢您的帮助。伺服和超声波可以同时运行。 –

+0

尝试使用'音调'功能(请参阅[这里](https://www.arduino.cc/en/Reference/Tone))。我希望它是非阻塞的 – frarugi87

相关问题