Hey Leute, da ich noch ein ziemlicher Anfänger bin wollte ich euch mal nach Rat fragen. Mein Problem ist, dass ich meine Variable "drehZahl" von null auf 255 langsam erhöhen kann, jedoch nicht von 255 langsam auf 0 wieder runter, deshalb wollte ich euch mal fragen was an meinem Programm falsch sein könnte.
int Motor3 = 10;
int Motor4 = 11;
int MotorEnable = 9;
int drehZahl = 0;
void setup() {
pinMode(Motor3,OUTPUT);
pinMode(Motor4,OUTPUT);
pinMode(MotorEnable,OUTPUT);
Serial.begin(9600);
}
void loop() { // Aendere das Programm so ab, dass die
// Drehzahl nur langsam erhoeht und dann wieder langsam
// reduziert wird.
if(drehZahl<255){
digitalWrite(Motor3,HIGH);
digitalWrite(Motor4,LOW);
drehZahl=drehZahl+5;
Serial.println(drehZahl);
analogWrite(MotorEnable,drehZahl);
}
if (drehZahl>250){
digitalWrite(Motor3,LOW);
digitalWrite(Motor4,HIGH);
drehZahl=drehZahl-5;
analogWrite(MotorEnable,drehZahl);
Serial.println(drehZahl);
}
}
Wie kommt's , dass da überhaupt was langsam läuft?
Serial ist die einzige Bremse, die ich sehe. Nach 64 Zeichen Ausgabe brauchst du 1 ms je Zeichen (Wegen 9600)
Außerdem geht drehZahl nicht wieder unter 250...
Und was für einen Motor hast du wie angeschlossen an den drei Pins?
Was hat "Eine Variable langsam reduzieren auf Null" mit der Drehzahl des Motors zu tun ?
Es geht weder langsam noch schnell wieder runter - es geht gar nicht runter.
Du solltest die Bedingungen kritisch überprüfen.
(Edit: Das Ihr bezog sich auf die Komilitonen aus einer anderen Frage)
Modifizierter Code
int Motor3 = 10;
int Motor4 = 11;
int MotorEnable = 9;
int drehZahl = 0;
void setup()
{
pinMode(Motor3, OUTPUT);
pinMode(Motor4, OUTPUT);
pinMode(MotorEnable, OUTPUT);
Serial.begin(9600);
}
void loop()
{ // Aendere das Programm so ab, dass die
// Drehzahl nur langsam erhoeht und dann wieder langsam
// reduziert wird.
Serial.print("drehZahl vor den ifs: ");
Serial.println(drehZahl);
if (drehZahl < 255)
{
// digitalWrite(Motor3, HIGH);
// digitalWrite(Motor4, LOW);
drehZahl = drehZahl + 5;
Serial.print("in (drehZahl < 255) : ");
Serial.println(drehZahl);
// analogWrite(MotorEnable, drehZahl);
}
if (drehZahl > 250)
{
// digitalWrite(Motor3, LOW);
// digitalWrite(Motor4, HIGH);
drehZahl = drehZahl - 5;
// analogWrite(MotorEnable, drehZahl);
Serial.print("in (drehZahl > 250) : ");
Serial.println(drehZahl);
}
delay(500);
}
liefert
...
20:45:29.646 -> drehZahl vor den ifs: 235
20:45:29.646 -> in (drehZahl < 255) : 240
20:45:30.143 -> drehZahl vor den ifs: 240
20:45:30.143 -> in (drehZahl < 255) : 245
20:45:30.639 -> drehZahl vor den ifs: 245
20:45:30.639 -> in (drehZahl < 255) : 250
20:45:31.138 -> drehZahl vor den ifs: 250
20:45:31.138 -> in (drehZahl < 255) : 255
20:45:31.138 -> in (drehZahl > 250) : 250
20:45:31.648 -> drehZahl vor den ifs: 250
20:45:31.648 -> in (drehZahl < 255) : 255
20:45:31.648 -> in (drehZahl > 250) : 250
20:45:32.141 -> drehZahl vor den ifs: 250
20:45:32.141 -> in (drehZahl < 255) : 255
20:45:32.141 -> in (drehZahl > 250) : 250
Eben. Das Ergebnis davon habe ich ja mitgeteilt; da winkt schon der ganze Zaun.
Fehlersuch-Tipp für @lamito:
Wenn was nicht geht, lass Dir mit den Ausgaben nicht nur anzeigen, wie bestimmte Werte stehen, sondern auch wo das Programm langläuft. Das führt gelegentlich (auch bei mir) zu einiger Verwunderung, weil das Ergebnis manchmal so ganz anders ist als gedacht.
Kurz gesagt: Wenn drehzahl >250 werden 5 abgezogen, somit ist die Bedingung drehzahl < 255 wieder wahr...eine zusätzliche Bedingung könnte da Abhilfe schaffen.
Dem Wert von drehZahl kann man nicht ansehen, ob aktuell wachsen oder reduzieren angesagt ist. Dazu braucht es einen zusätzlichen Merker, der an den Endpunkten wechselt.
( Beispiel gabs schon in #8 )
Wenn man es gut doku-kommentiert, ein netter Trick wie man eine bool-Variable tatsächlich in einem Bit statt einem Byte speichern kann. Ob's den Aufwand wert ist?
Ach, es würde wohl schon reichen, eine der Bedingungen mit einem zusätzlichen = zu verzieren oder die zweite wegzulassen und stattdessen ein else zu benutzen.
Der TO scheint aber eine für sich befriedigende Lösung gefunden zu haben, denn seit über einer Woche haben wir hier nichts mehr dazu gehört.