Wenn ich folgenden Code in einen Code ohne delay übersetzen möchte, brauche ich 2 unterschiedliche Blink without delay Schleifen ooder kkann ich das in einer kombinieren?
Ich habs gerade noch mal ein wenig umgeschrieben, bleib aber ebenfalls nach wie vor beim Fehler, dass die LED aus bleibt.. vorhin hatte ich mich zu früh gefreut..
Mein aktueller Code:
int time;
int time_on;
int time_off;
int last_state;
void setup()
{
pinMode(13,OUTPUT);
time = millis();
last_state = 0;
time_on = 1000;
time_off = 9000;
}
void loop()
{
if ((last_state == 0) && (time <= millis()))
{
digitalWrite(13,HIGH);
last_state = 1;
time = millis() + time_on;
}
if ((last_state == 1) && (time <= millis()))
{
digitalWrite(13,LOW);
last_state = 0;
time = millis() + time_off;
}
}
(Ob die LED zu Beginn an ist, entscheidest du hierbei mir last_state im setup).
Ich glaub, da muss jetzt wer andres ran.. ich erkenn einfach nicht, warum er aufhört, sorry.
Wenn mit millis() gearbeitet wird müssen die Variablen die damit zu tun haben immer unsigned long sein weil millis() auch unsigned long ist. Also so:
unsigned long time;
unsigned long time_on;
unsigned long time_off;
...
So funktioniert der Code schon mal, obwohl er nicht sehr elegant ist und möglicherweise, wenn er überläuft (nach ca. 49 Tagen), zu Fehler führen könnte. Besser wäre das Intervall von millis() abzuziehen.
Hier noch mal eine Zusammenfassung, wenn man mit millis() arbeitet:
unsigned long für Zeitvariable verwenden (und nicht long oder int)
einen Startzeitpunkt festhalten
den Startzeitpunkt von der aktuellen Zeit subtrahieren um auf die Differenz zu kommen
überprüfen ob diese Differenz größer ist als das gewünschte Intervall