Hallo,
komme mit while nicht zu recht. While wird doch solange durchlaufen wie die Bedingung wahr ist. Also Taster gedrückt, LOW Signal liegt an.
µC reseten, Sketch geht los. Taster drücken, Zufallszahlen werden ohne Ende erzeugt, ich lasse Taster los, aber es ändert sich nichts. Zahlen werden weiterhin erzeugt. Er springt nicht aus der while Schleife raus. Dabei wird doch am Loop Anfang permanent der Taster abgefragt.
Ersetze ich while durch if funktioniert es? Sollte doch keinen Unterschied machen?
der komplette Sketch. Das Pause Array hat nur zu Testzwecken solche seltsamen Werte. Also nicht wundern.
// Arduino Mega 2560
// Würfelaugen LED Zusammenfassung
int GruppeA = 22; // Port.A.22 LED Nr. 4 (mittelste)
int GruppeB = 23; // Port.A.23 LED Nr. 1 + 7
int GruppeC = 24; // Port.A.24 LED Nr. 3 + 5
int GruppeD = 25; // Port.A.25 LED Nr. 2 + 6
int WuerfelAugen = 0; // Wert zwischen 1 und 6
int TASTER = 2; // Start-Taster zum würfeln, im Setup mit internen PullUp Widerstand aktiv
int TasterStatus; // Zustand vom Taster
// Geschwindigkeitssteigerung des Kometenschweifs bzw. abbremsen
int PAUSE [44] = {173,73,73,74,74,74,75,75,75,75,76,76,76,76,77,77,77,77,77,78,78,78,78,78,79,79,79,79,79,79,80,80,80,80,80,80,80,81,81,81,81,81,81,181};
int SPEED = 43;
// Anfangsposition vom Kometenschweif
int LEDPOS_1 = 3; // auf sichere LED Position setzen für ersten Durchlauf
int LEDPOS_2 = 4; // auf sichere LED Position setzen für ersten Durchlauf
int LEDPOS_3 = 5; // auf sichere LED Position setzen für ersten Durchlauf
int LAST_LED = 6; // auf sichere LED Position setzen für ersten Durchlauf
int LED_1, LED_2, LED_3; // zum zwischen speichern der LED Position zum umdrehen
unsigned long ZEIT_NEW;
unsigned long ZEIT_OLD = 0;
int LED_H1 = 255; // 255, Helligkeiten der LEDs
int LED_H2 = 96; // 96
int LED_H3 = 16; // 16
boolean TASTER_Pressed = false; // Taster Anfangsstatus definieren ( Wurde Taster schon gedrückt oder nicht? )
void setup()
{
Serial.begin(9600);
pinMode(TASTER, INPUT); // Start-Taster zum würfeln und
digitalWrite(TASTER, HIGH); // internen PullUp Widerstand aktiviert
// Pins 3 bis 6 für den Kometenschweif setzen
for (int thisPin = 3; thisPin <= 6; thisPin++) {
pinMode(thisPin, OUTPUT);
}
// Pins für die Würfelaugen setzen und kurz einschalten
DDRA = 15; // Port.A, Bit 0 bis 3 Ausgang
PORTA = 15; // Port.A, Bit 0 bis 3 eingeschalten
delay(500);
PORTA = 0; // Port.A alle Ausgänge Aus
// Serial.println("\n[memCheck]");
// Serial.println(freeRAM(), DEC);
}
void loop() {
TasterStatus = digitalRead(TASTER); // Taster abfragen, wenn nicht gedrückt liegt HIGH Signal an
if (TASTER_Pressed == true && TasterStatus == HIGH) {
Schweif_nach_links_drehen (); // LEDs werden in der Reihenfolge umgedreht
TASTER_Pressed = false; // Hilfsvariable wird geändert
}
if (TASTER_Pressed == false && TasterStatus == LOW) {
Schweif_nach_rechts_drehen (); // LEDs werden in der Reihenfolge umgedreht
TASTER_Pressed = true; // Hilfsvariable wird geändert
}
if (TasterStatus == LOW) { // wenn Taster gedrückt wird liegt LOW Signal an
Kometenschweif_Rechts (); // Schweif dreht rechts herum und beschleunigt
}
if (TasterStatus == HIGH) { // wenn Taster nicht gedrückt wird liegt HIGH Signal an
Kometenschweif_Links (); // Schweif dreht links herum und bremst ab
}
if (TASTER_Pressed == true) {
Wuerfel_loeschen (); // Wuerfelaugen Anzeige löschen
}
if (TASTER_Pressed == false) {
Wuerfelzahl_anzeigen (WuerfelAugen); // Zahl der Würfelaugen mittels LEDs anzeigen
}
while (TasterStatus == LOW) { // Zufallszahl erzeugen solange Taster gedrückt ist
WuerfelAugen = random(1,7);
Serial.println(WuerfelAugen); // zu Testzwecken
}
} // Loop Ende
/* *** Funktionen *** */
void Kometenschweif_Rechts ()
{
if (LEDPOS_1 > 6) { LEDPOS_1 = 3; } // wenn "letzte" LED erreicht, auf Anfangsposition setzen
analogWrite(LEDPOS_1, LED_H1); // 5, Schweifspitze ganz hell
analogWrite(LEDPOS_2, LED_H2); // 4, LED dahinter etwas dunkler
analogWrite(LEDPOS_3, LED_H3); // 3, nächste LED noch dunkler
analogWrite(LAST_LED, LOW); // letzte alte LED ausschalten
LAST_LED = LEDPOS_3; // 3
LEDPOS_3 = LEDPOS_2; // 4
LEDPOS_2 = LEDPOS_1; // 5
LEDPOS_1++; // 6
// delay(1000);
delay(PAUSE[SPEED]); // Kometenschweif beschleunigen
SPEED--;
if (SPEED < 1) { SPEED = 0; } // schnellsten Wert beibehalten
}
void Kometenschweif_Links ()
{
if (LEDPOS_1 < 3) { LEDPOS_1 = 6; } // wenn "letzte" LED erreicht, auf Anfangsposition setzen
analogWrite(LEDPOS_1, LED_H1); // Schweifspitze ganz hell
analogWrite(LEDPOS_2, LED_H2); // LED dahinter etwas dunkler
analogWrite(LEDPOS_3, LED_H3); // nächste LED noch dunkler
analogWrite(LAST_LED, LOW); // letzte alte LED ausschalten
LAST_LED = LEDPOS_3;
LEDPOS_3 = LEDPOS_2;
LEDPOS_2 = LEDPOS_1;
LEDPOS_1--;
// delay(1000);
delay(PAUSE[SPEED]); // Kometenschweif abbremsen
SPEED++;
if (SPEED > 43) { SPEED = 43; } // langsamsten Wert beibehalten
}
void Schweif_nach_links_drehen ()
{
LED_1 = LAST_LED; //5, LED Positionen zwischen speichern
LED_2 = LEDPOS_3; //6
LED_3 = LEDPOS_2; //7
LEDPOS_1 = LED_1; //5, LED Positionen umdrehen
LEDPOS_2 = LED_2; //6
LEDPOS_3 = LED_3; //7
if (LEDPOS_3 >= 6) { LAST_LED = 3;}
else { LAST_LED = LEDPOS_3 + 1; }
}
void Schweif_nach_rechts_drehen ()
{
LED_1 = LAST_LED; // LED Positionen zwischen speichern
LED_2 = LEDPOS_3;
LED_3 = LEDPOS_2;
LEDPOS_1 = LED_1; // LED Positionen umdrehen
LEDPOS_2 = LED_2;
LEDPOS_3 = LED_3;
if (LEDPOS_3 <= 3) { LAST_LED = 6;}
else { LAST_LED = LEDPOS_3 - 1; }
}
// Zahl der Würfelaugen mittels LEDs anzeigen
void Wuerfelzahl_anzeigen (int Augen)
{
if (Augen%2 != 0) {digitalWrite(GruppeA, HIGH);} // ist der Augenwert ungerade ? (Modulo, ist Restwert ungleich 0)
if (Augen > 1) {digitalWrite(GruppeB, HIGH);} // ist der Augenwert größer 1 ?
if (Augen > 3) {digitalWrite(GruppeC, HIGH);} // ist der Augenwert größer 3 ?
if (Augen == 6) {digitalWrite(GruppeD, HIGH);} // ist der Augenwert gleich 6 ?
}
// Würfelaugen löschen
void Wuerfel_loeschen ()
{
digitalWrite(GruppeA, LOW); // Wuerfelaugen löschen
digitalWrite(GruppeB, LOW);
digitalWrite(GruppeC, LOW);
digitalWrite(GruppeD, LOW);
}
int freeRAM() // Funktion im WWW gefunden, zeigt freien Speicher an
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}