Eisebaer:
und darum geht's auch bei Dir, herbert, es kommt darauf an, ob Du's lernen willst oder eine fertige lösung.
wenn ersteres, mußt Du Dich ein wenig einlesen, im zweiten fall wartest Du auf jurs
.
Meine Demoprogramme sind ganz normale Demoprogramme im Quelltext, die man an eigene Anforderungen anpassen kann und aus denen man lernen kann, wie man ein Problem lösen kann. Nichts anderes als die "fertigen Arduino-Demoprogramme", vielleicht mit ein paar mehr Zeilen Code und ein wenig zusätzlicher Funktionalität.
Wenn man aus "fertigen" Demoprogrammen anderer nichts lernen könnte, dann würde hier nicht jedesmal wenn es ums Blinken geht, von einem oder gleich von mehreren Leuten der Verweis auf das Tutorial-Demoprogramm "BlinkWithoutDelay" kommen.
Hier also meine Version eines Demoprogramms im Stil von "BlinkWithoutDelay":
- Steuert im Gegensatz zu "BlinkWithoutDelay" gleich mehrere blinkende LEDs auf einmal
- Steuert auch eine zufällig "flimmernde" LED
herbi39:
Hatte gehofft, daß mir jemand meinen sketch entsprechend korrigiert und mit entsprechenden Kommentarzeilen erklärt.
Wie andere schon festgestellt haben: Deinen Sketch hast Du mit dem allerersten "delay()" bereits total vergeigt, das Du in den Quellcode reingeschrieben hast. An dem Sketch gibt es nichts zu korrigieren, der muß komplett anders aufgebaut sein. Natürlich gibt es immer mehrere Möglichkeiten, so etwas zu machen. Aber alle Lösungen, um Dinge in einem Arduino-Sketch "quasi zeitlich parallel" ablaufen zu lassen, müssen ohne delay() auskommen, um praktikabel zu sein.
Das Jurs-Demoprogramm des Tages zum Thema "Blinken ohne Delay" wäre eine Möglichkeit, wie es funktionieren kann:
/* Simulation "belebtes Haus für die Modellbahn" by jurs */
byte pwmFlimmerPin=10; // PWM Pin für das "analoge" Flimmern
// LED Pins für das normale Blinken deklarieren
byte leds[] ={ 8, 9, 11, 12, 13};
// LED Blinktakt in Millisekunden für diese Pins
long ledtakt[]={1500, 2200, 3333, 5000, 7100};
// Variablen zum Merken von millis()-Zeiten beim Schalten/Blinken
long ledtime[sizeof(leds)];
void setup() {
// Serial.begin(9600);
// Alle verwendeten Pins auf OUTPUT setzen
pinMode(pwmFlimmerPin, OUTPUT);
for (int i=0;i<sizeof(leds);i++)
pinMode(leds[i], OUTPUT);
}
boolean milliSekundenTakt(long dauer, long &alterWert) {
// Parameter "dauer": Dauer einer Blinkphase (an bzw. aus)
// Parameter "alterWert": Variable zum Speichern des millis() Timers
// Rückgabewert: true wenn die Zeit bis zum nächsten Umschalten abgelaufen ist, sonst false
if (millis() - alterWert < dauer) return false;
while (millis() - alterWert >= dauer) alterWert+=dauer;
return true;
}
void blinkenImTakt() {
// Alle gleichmäßig blinkenden LEDs in ihrem eigenen Takt blinken lassen
for (int i=0;i<sizeof(leds);i++) // alle LEDs in einer Schleife durchgehen
{
if (milliSekundenTakt(ledtakt[i],ledtime[i])) // Takt für diese LED abgelaufen?
{
digitalWrite(leds[i],!digitalRead(leds[i])); // wenn ja ==> Umschalten
// Serial.print("Pin ");Serial.print(leds[i]);Serial.print(" = ");Serial.println(digitalRead(leds[i]));
}
}
}
void flimmernPwmPin() {
// Die flimmernde LED im Zufallsmodus flimmern lassen
static long alterWert;
static int flimmerDauer=200;
static byte flimmerHelligkeit;
if (milliSekundenTakt(flimmerDauer,alterWert)) // Takt abgelaufen?
{
flimmerDauer=1+random(200); // neue Flimmerdauer als Zufallswert
flimmerHelligkeit=random(256); // neue Flimmerhelligkeit als Zufallswert
analogWrite(pwmFlimmerPin, flimmerHelligkeit);
}
}
void loop() {
blinkenImTakt();
flimmernPwmPin();
}
Es ist mir schleierhaft, wie man der Meinung sein kann, aus einem Arduino-Demoprogramm wie "BlinkWithoutDelay" könne man "alles selbst lernen" und aus einem Jurs-Demoprogramm mit ein paar mehr Zeilen könne man vergleichsweise "nichts" bis "wenig" lernen.
P.S.: Verbesserte Codeversion mit "Flimmerpin", der nach der Zimmerbeleuchtung ein-, aber früher wieder ausgeschaltet wird, in Reply #19