0

リモートでボタンを押すと、サーボから連続的な (180 から 0 へ、0 から 180 へ戻る) 動きを取得しようとしていますが、他のボタンを押すと停止するだけです。これまでのところ、連続して動くようになりましたが、「停止」ボタンを押しても止まりません。while ループが原因であることはわかっています。ただし、switch-case、if ステートメントを試しましたが、これまでのところ何も機能していません。助けてください、それを機能させるためのアドバイスは大歓迎です。

#include <Servo.h>

#define code1 2534850111 //decimal value of button 1
#define code3 16724175   //decimal value of button 1
#define code 4294967295   //random value
#define code2 16738455   //decimal value of button 0
#define code4 3238126971   //decimal value of button 0

Servo myservo; // servo object
int RECV_PIN = 11; //receiveing pin IR remote

int pos = 0;

IRrecv irrecv(RECV_PIN); 

decode_results results;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();  //start the receiver
  myservo.attach(9);    //servo connect to pin 9
  pinMode(2, OUTPUT);   //LED connect to pin 2
}

void loop() {
  if(irrecv.decode(&results)){
     // if(results.value == code1 || results.value == code3){
     while(results.value == code1 || results.value == code3){
        digitalWrite(2,HIGH); //turn the led on
        for(pos = 0; pos <= 180; pos += 1){ //servo goes form 0 to 180             degrees in steps of 1 degree
    myservo.write(pos);
    delay(7);
    }
    for(pos = 180; pos >= 0; pos -= 1){ //servo goes back from 180 to 0 degrees with 1 degree step
    myservo.write(pos);
    delay(7);
}
    }

 while(results.value == code2 || results.value == code4){
       digitalWrite(2, LOW);  // turn the led off
       myservo.write(pos);
       delay(15);
       break;
 }

  Serial.println(results.value, DEC); //show the decimal value of the     pressed button
  irrecv.resume();  //receive the next value
    }

}
4

1 に答える 1

0

問題を解決する 1 つの方法は、 の奥深くにある「ボタン プッシュ」の存在を確認することloop()です。動きのループにボタンの押下をチェックしてfor、変更をすぐにキャッチします。2 つの開始コード (?) があるように見えるので、以下のステートメントを変更する必要があるかもしれませんが、if以下のコード サンプルで「続行」するための条件を確認する方法を示していただければ幸いです。

void loop()
{
    if(irrecv.decode(&results))
    {
        // turn one way
        for(pos = 0; pos <= 180; pos += 1)
        {
            // only continue if the start code(s) still active
            if(results.value == STARTCODE || results.value == OTHERSTARTCODE)
            {
                myservo.write(pos);
                delay(7);
                irrecv.resume();  //receive the next value
            }
        }
        // turn the other way
        for(pos = 180; pos >= 0; pos -= 1)
        {
            // only continue if the start code(s) still active
            if(results.value == STARTCODE || results.value == OTHERSTARTCODE)
            {
                myservo.write(pos);
                delay(7);
                irrecv.resume();  //receive the next value
            }
        }
    }   
}
于 2017-06-22T15:22:24.533 に答える