2017-05-15 1 views
-2

Wir versuchen, ein Programm, das die Helligkeit einer LED mit unserem Arduino mit Tastenanschlägen ändert. Der c-serielle Port-Kommunikationsteil ist fertig, aber wir haben einige Probleme mit dem Arduino-Teil.Versuchen, die Helligkeit einer LED in Arduino durch Eingabe von Zeichen in c ändern

int LedPin = 3; 
int brightness = 90; 
char deger; 
void setup() { 
    Serial.begin(9600); 
    pinMode(LedPin, OUTPUT); 
} 

void loop() { 
    if(Serial.available()>0) 
     deger = Serial.read(); 

    if(deger== 'C') { 
     brightness = 0; 
     analogWrite (LedPin, brightness); 
    } //to set the brightness to 0 after an error 

    if(deger== 'A') { 
     if(brightness>=255) 
      brightness = 0; 
     brightness=brightness+15; // to increase led brightness by 15 with every entry 
     analogWrite (LedPin, brightness); 
    } 

    if(deger== 'B') { 
     if(brightness<=0) 
      brightness = 254; 
     brightness=brightness-15; //to decrease led brightness by 15 with every entry 
     analogWrite (LedPin, brightness); 
    } 
} 

Wir wollen, dass die Helligkeit zu erhöhen, wenn wir ‚A‘ und Abnahme geben, wenn wir ‚B‘ eingeben, aber was passiert, ist, ändert sich die Helligkeit zufällig, wenn A eingegeben und erhöht sich um 15, wenn B eingegeben wird. Sie können sehen, dass B völlig entgegengesetzt zu unseren Absichten handelt und ein A zufällig ist. Was machen wir falsch?

+1

versuchen, ein Zeichen anstelle eines int – OldProgrammer

+2

Zuerst zu machen Helligkeit, die Grenzen Test * nach * den Code bewegen, der die Helligkeit anpasst. Andernfalls senden Sie Werte außerhalb von 0-255 an analogWrite. Ich bin mit Arduinos nicht genug vertraut, um spezifischere Ratschläge zu bekommen, aber das ist ein generisches Problem auf jedem System. – Torp

+0

Einverstanden. Wenn in Ihrem Fall die Helligkeit 250 ist, ist die Bedingung Helligkeit> 255 falsch, dann werden Sie die Helligkeit um 15 erhöhen und diesen Wert in den Analogausgang schreiben. –

Antwort

1

Ein großes Problem mit Ihrem Code ist, dass, weil Sie deger als globale Variable verwenden, und loop wird wiederholt aufgerufen, die Erhöhungen/Abnahmen auf die Helligkeit wird bei jedem Durchlauf der Schleife angewendet, anstatt nur einmal wenn Tastendruck wird empfangen.

Sie können dies auf verschiedene Arten beheben. Sie können deger am Ende loop löschen. Sie könnten auch die letzten 3 if Anweisungen in Klammern basierend auf der ersten if Bedingung einschließen, so dass sie nur ausgeführt werden, wenn ein Zeichen gelesen wird.

jedoch die logischste ist nur deger eine lokale Variable zu Beginn des ‚loop`, erklärte zu machen, da es nicht notwendig ist, um es zwischen Anrufen bestehen:

void loop() { 
    char deger = 0; 
0

Zunächst einmal ich würde verwenden Schalter anstelle von 3 wenn's ist.

Zweitens ändern die innere wenn an:

switch(deger) 
{ 
case 'A': 
     if(brightness+15>=255) 
      { 
      brightness = 0; 
      } 
     brightness=brightness+15; 
     analogWrite (LedPin, brightness); 
break; 
}