2017-11-08 8 views
0

このスケッチでは、ArduinoはAndroidアプリに接続し、Bluetooth接続を介してデータを受信します。これは意図したとおりに動作しますが、Bluetoothが接続されておらず、スケッチがシリアルデータを受信して​​いない場合、スケッチはwhileループで停止しています。ブルートゥースが接続されていてシリアルデータを受信して​​いればうまく動作しますが、ボタンの状態を読むことができるようにスケッチをwhileループで中断させる方法はわかりません。私はボタンの状態を読むためにwhileループを壊すためにスケッチが必要です。誰にもアイデアはありますか? L178: R215: L-125: R-115: - 記号や、その後255に番号-255が続いていないマイナス記号 続いLまたはRのいずれかが常にあるデータは、これらの例のように見える受信しました常にによって:whileループを読み込みボタン

char myChar = 'a'; 
String string; 
char LorR; 

int M2INA = 8; //left 
int M2INB = 7; 
int M2PWM = 9; 

int M1INA = 11; //right 
int M1INB = 12; 
int M1PWM = 10; 

int ledB = A2; 
int ledR = A3; 
int button = 2; 

int buttonState; 
int val; 
int mode = 0; 

void setup() { 

    pinMode(M1INA, OUTPUT); 
    pinMode(M1INB, OUTPUT); 
    pinMode(M2INA, OUTPUT); 
    pinMode(M2INB, OUTPUT); 
    pinMode(M1PWM, OUTPUT); 
    pinMode(M2PWM, OUTPUT); 
    pinMode(ledB, OUTPUT); 
    pinMode(ledR, OUTPUT); 
    Serial.begin(57600); //230400 460800 921600 

    buttonState = digitalRead(button); // read the initial state 
} 

void loop() { 
    val = digitalRead(button);  // read input value and store it in val 

    if (val != buttonState) {   // the button state has changed! 
    if (val == LOW) {    // check if the button is pressed 
     if (mode == 0) {   // light is off 
     mode = 1;    // light is on! 

     } else { 
     mode = 0;    // light is on! 

     } 
    } 
    } 
    buttonState = val;     // save the new state in our variable 
    if (mode == 0) { 
    btMode(); 
    } 
    if (mode == 1) { 
    followMode(); 
    } 

} 

void followMode() { 
    digitalWrite (ledR, HIGH); 
    digitalWrite (ledB, LOW); 
    } 


void btMode() { 
    digitalWrite (ledR, LOW); 
    digitalWrite (ledB, HIGH); 

    string = ""; 
    //Add to string 

    while (true) { 

     myChar = Serial.read(); 
     if (32 <= myChar && myChar <= 127) { 
     string += myChar; 
     } 
     if (myChar == ':'){ 
     break; 

    }// While End 
    } 
    //Analyse string 
    if (string != "off:" && string != "on:") { 
     if (string != "L0:" && string != "R0:") { 
     //code for setting motor left or right 
     if (string[0] == 'L') { 
      LorR = 'L'; 
     } else { 
      LorR = 'R'; 
     } 
     string.remove(0, 1); 
     //code for putting it in reverse 
     if (string[0] == '-') { 
      string.remove(0, 1); 
      string.remove((string.length() - 1), 1); 
      //Serial.println(string); 
      if (LorR == 'L') { 
      //digitalWrite(M2EN, HIGH); 
      digitalWrite (M2INA, LOW); 
      digitalWrite (M2INB, HIGH); 
      analogWrite(M2PWM, string.toInt()); 

      } else {       //Reverse left 
      //digitalWrite(M1EN, HIGH); 
      digitalWrite (M1INA, LOW); 
      digitalWrite (M1INB, HIGH); 
      analogWrite(M1PWM, string.toInt()); 
      } 
     } else { 
      string.remove((string.length() - 1), 1); 
      if (LorR == 'L') { 
      //digitalWrite(M2EN, HIGH); 
      digitalWrite (M2INA, HIGH); 
      digitalWrite (M2INB, LOW); 
      analogWrite(M2PWM, string.toInt()); 

      } else { 
      digitalWrite (M1INA, HIGH); 
      digitalWrite (M1INB, LOW); 
      analogWrite(M1PWM, string.toInt()); 
      } 
     } 
     } else { 
     allStop(); 
     } 

    }//End of long if statment 
    if (string == "on:") { 

    } 
    if (string == "off:") { 

    }  
    } 


void allStop() { //coast 
    analogWrite(M1PWM, 0); 
    analogWrite(M2PWM, 0); 
    digitalWrite(M1INA, HIGH); 
    digitalWrite(M2INA, HIGH); 
    digitalWrite(M1INB, HIGH); 
    digitalWrite(M2INB, HIGH); 
} 
+0

'if'ステートメントの多用性、特に' else'と 'else if'について読んでください。あなたのスケッチについては、私はArduinoのためにプログラムされたことはありませんが、私はループ内のBluetooth接続の状態を確認することをお勧めします。 – Sam

答えて

0

問題は、私は、ボタンを読み込むwhileループを破ることができなかったということでしたが、これは動作するようになりました。私は

while (mode == 0) { 
readButton(); 

と小さなスケッチをクリーンアップするこの

while (true) { 

を変更しました。

char myChar = 'a'; 
String string; 
char LorR; 

int M2INA = 8; //left 
int M2INB = 7; 
int M2PWM = 9; 

int M1INA = 11; //right 
int M1INB = 12; 
int M1PWM = 10; 

int ledB = A2; 
int ledR = A3; 
int button = 2; 

int buttonState; 
int val; 
int mode = 0; 

unsigned long previousButtonMillis=0; 
const int buttonInterval = 50; // number of millisecs between button reading 
unsigned long previousSerialReadMillis=0; 
const int serialReadInterval = 10; // number of millisecs between button reading 

void setup() { 

    pinMode(M1INA, OUTPUT); 
    pinMode(M1INB, OUTPUT); 
    pinMode(M2INA, OUTPUT); 
    pinMode(M2INB, OUTPUT); 
    pinMode(M1PWM, OUTPUT); 
    pinMode(M2PWM, OUTPUT); 
    pinMode(ledB, OUTPUT); 
    pinMode(ledR, OUTPUT); 
    Serial.begin(57600); //230400 460800 921600 

    buttonState = digitalRead(button); // read the initial state 
} 

void loop() { 

    readButton(); 
    if (mode == 0) { 
    btMode(); 
    } 
    if (mode == 1) { 
    followMode(); 
    } 

} 

void readButton() { 
    if (millis() - previousButtonMillis >= buttonInterval) { 
    val = digitalRead(button);  // read input value and store it in val 
    if (val != buttonState) {   // the button state has changed! 
    if (val == LOW) {    // check if the button is pressed 
     if (mode == 0) {   
     mode = 1;    
     } else { 
     mode = 0;    
     } 
    } 
    } 
    buttonState = val;     // save the new state in our variable 
    previousButtonMillis += buttonInterval; 
} 
} 

void followMode() { 
    digitalWrite (ledR, HIGH); 
    digitalWrite (ledB, LOW); 
} 

void btMode() { 
    digitalWrite (ledR, LOW); 
    digitalWrite (ledB, HIGH); 
if (millis() - previousSerialReadMillis >= serialReadInterval){ 
    string = ""; 

    while (mode == 0) { 
    readButton(); 
    myChar = Serial.read(); 
    if (32 <= myChar && myChar <= 127) { 
     string += myChar; 
    } 
    if (myChar == ':') { 
     break; 
    } 
    } 
    previousSerialReadMillis += serialReadInterval; 
    } // While End 
    analyseString(); 
} 

void analyseString() { 

    if (string != "L0:" && string != "R0:") { 
    //code for setting motor left or right 
    if (string[0] == 'L') { 
     LorR = 'L'; 
    } else { 
     LorR = 'R'; 
    } 
    string.remove(0, 1); 
    //code for putting it in reverse 
    if (string[0] == '-') { 
     string.remove(0, 1); 
     string.remove((string.length() - 1), 1); 
     if (LorR == 'L') { 
     digitalWrite (M2INA, LOW); 
     digitalWrite (M2INB, HIGH); 
     int leftPWM = string.toInt(); 
     if (leftPWM > 80) { 
      leftPWM = 80; 
     } 
     analogWrite(M2PWM, leftPWM); 

     } else {       //Reverse left 
     digitalWrite (M1INA, LOW); 
     digitalWrite (M1INB, HIGH); 
     int rightPWM = string.toInt(); 
     if (rightPWM > 80) { 
      rightPWM = 80; 
     } 
     analogWrite(M1PWM, rightPWM); 
     } 
    } else { 
     string.remove((string.length() - 1), 1); 
     if (LorR == 'L') { 
     digitalWrite (M2INA, HIGH); 
     digitalWrite (M2INB, LOW); 
     analogWrite(M2PWM, string.toInt()); 

     } else { 
     digitalWrite (M1INA, HIGH); 
     digitalWrite (M1INB, LOW); 
     analogWrite(M1PWM, string.toInt()); 
     } 
    } 
    } else { 
    allStop(); 
    } 
    //End of long if statment 
} 

void allStop() { 

    analogWrite(M1PWM, 125); 
    analogWrite(M2PWM, 125); 
    digitalWrite(M1INA, HIGH); 
    digitalWrite(M2INA, HIGH); 
    digitalWrite(M1INB, HIGH); 
    digitalWrite(M2INB, HIGH); 
} 
関連する問題