2016-09-19 34 views
0

Ich schreibe einen einfachen Arduino-Code. Ich habe zwei LEDs und entsprechende zwei Schalter. Wenn ein Schalter gedrückt wird, ist eine LED an und andere ist aus. Dann gibt es eine Serial.read-Funktion, die von dem Computer zurückgesetzt liest. Dann sind beide Schalter aus. Danach wird ein anderer Schalter gedrückt und eine andere LED leuchtet. Mein Problem ist, wenn ein Schalter eingeschaltet ist, sollte ein anderer nicht funktionieren, bis der Serial.read passiert. Aber in meinem Fall, wenn led1 an ist, wenn ich Schalter2 drücke, ist led2 an und led1 ist aus. Aber das ist nicht meine gewünschte Operation. Ich möchte die Logik machen, dass, wenn led1 eingeschaltet ist, wenn ich presse switch2 led2 sollte nicht eingeschaltet sein und warten auf die Serial.read passieren. Hier ist mein Code. Ich muss wissen, was die Korrektur in der Logik sein sollte:Arduino: Warte auf serielle Eingabe

int switch1 = 2; 
int motorled1 = 3; 
int switch2 = 4; 
int motorled2 = 5; 
int d1=2; 
int d2=3; 
int reset1 = 0; 
int reset2= 0; 


void setup() { 
    // put your setup code here, to run once: 
    Serial.begin(9600); 
    pinMode(2, INPUT); 
    pinMode(4, INPUT); 
    pinMode(3, OUTPUT); 
    pinMode(5, OUTPUT); 
} 

void loop() { 
    // put your main code here, to run repeatedly: 
    d1=digitalRead(2); 
    d2=digitalRead(4); 

    if (d1==1) 
    { 
    digitalWrite(3, HIGH); 
    digitalWrite(5, LOW); 

    if (Serial.available() > 0) 
    { 
     Serial.write(1); 
    } 
    if (Serial.available() > 0) 
    { 
     reset1 = (Serial.read()); 

     digitalWrite(motorled1, LOW); 
     digitalWrite(motorled2, LOW); 
    } 
    } 
    else if (d2==1) 
    { 
    digitalWrite(3, LOW); 
    digitalWrite(5, HIGH); 

    if (Serial.available() > 0) 
    { 
     Serial.write(2); 
    } 
    if (Serial.available() > 0) 
    { 
     reset2 = (Serial.read()); 

     digitalWrite(motorled1, LOW); 
     digitalWrite(motorled2, LOW); 
    } 
    } 
} 

Antwort

0

Sie scheinen einige asynchrone Codestruktur zu verwenden. Das ist eine gute Sache, aber ich bin mir nicht sicher, ob Sie das beabsichtigt haben.

In seinem aktuellen Status wird der Code immer wieder durchlaufen und überprüft, ob eine der Tasten gedrückt wird.

Nun gibt es zwei Möglichkeiten, dies zu erreichen:

  • Entweder ein richtiges state machine Design machen, was die bevorzugte Art und Weise
  • Oder einfach nur warten, bis die seriellen zu einem bestimmten Zeitpunkt zur Verfügung stehen würde.

Für die zweite Lösung, könnten Sie

if (Serial.available() > 0) 
{ 
    reset1 = (Serial.read()); 

    digitalWrite(motorled1, LOW); 
    digitalWrite(motorled2, LOW); 
} 

von

while (Serial.available() <= 0) 
{} 
reset1 = (Serial.read()); 

digitalWrite(motorled1, LOW); 
digitalWrite(motorled2, LOW); 

im Wesentlichen nichts zu tun ersetzen, während es nichts an der seriellen Schnittstelle ist. Natürlich wird dies den Rest des Programms vollständig einfrieren und ist nicht sehr flexibel.

Für den ersten Weg gibt es wieder mehrere Möglichkeiten, es zu tun. Da Sie mit C-Programmierung nicht vertraut sind (nichts für ungut), wäre eine der einfachsten Möglichkeiten, dies zu tun, Ihre if (d1==1) und else if (d2==1) Aussagen von if (d1==1 && serial_read == false) und else if (d2==1 && serial_read == true) zu ändern. Dann, an der Spitze des Programms, fügen Sie hinzu:

int serial_read = false; 
if(Serial.available() > 0) 
{ 
    reset1 = (Serial.read()); 
    serial_read = true; 
} 

Dies ist die Grundidee. Ich werde Sie die verschiedenen Fehler und Verbesserungen (wie zum Beispiel serial_read bis false) wieder als eine Übung sortieren lassen.

Ich ermutige Sie auch, ein wenig über Programmierung im Allgemeinen und C-Programmierung im Besonderen zu lesen. Ich rate Ihnen auch, sich an eine Konvention zu halten, um Ihren Code einzurücken. Es gibt nichts Schlimmeres als Code mit gemischter Einrückung.

0

Dies ist die Antwort. int switch1 = 2; int motorisiert1 = 3; int switch2 = 4; int motorisiert2 = 5; int d1 = 0; int d2 = 0; int Summer; char reset1;

void setup() { 
    // put your setup code here, to run once: 
    Serial.begin(9600); 

    pinMode(2, INPUT); 
    pinMode(4, INPUT); 
    pinMode(3, OUTPUT); 
    pinMode(5, OUTPUT); 

} 

void loop() { 
    // put your main code here, to run repeatedly: 

    d1 = digitalRead(2); 
    d2 = digitalRead(4); 
    if (d1 == 1 && buzzer == 0) 

    { 
    digitalWrite(motorled1, HIGH); 
    buzzer = 1; 

    } 


    else if (d2 == 1 && buzzer == 0) 
    { 
    digitalWrite(motorled2, HIGH); 
    buzzer = 2; 
    } 

    if (Serial.available() > 0) 

    { 
    (Serial.write(buzzer)); 

    reset1 = (Serial.read()); 
    buzzer = 0; 


    if (reset1 == 'R') 
    Serial.println("LED is off"); 
    { digitalWrite(motorled1, LOW); 
     digitalWrite(motorled2, LOW); 

    } 
    } 
} 
Verwandte Themen