Ich will (muß ) mich jetzt endlich mal näher mit den millis beschäftigen.
Den sketch "Blink without Delay" hab ich ja nun halbwegs kapiert - denke ich jedenfalls...
/* Blinken ohne "delay()"
*
* Schaltet eine LED, welche an einem digitalen Pin liegt ein- und aus
* ohne die "delay()" Funktion zu verwenden. Das heisst anderer Code
* kann zur gleichen Zeit ausgeführt werden ohne blockiert zu werden.
*
* http://playground.arduino.cc/Learning/BlinkWithoutDelay_de
*/
byte ledPin = 13; // LED liegt am (digitalen) Pin 13
boolean value = LOW; // Startwert der LED
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
unsigned long interval = 5000; // Interval zwischen zwei Änderungen
void setup()
{
pinMode(ledPin, OUTPUT); // Setzt den ledPin (Pin 13) als Ausgang
}
void loop()
{
// Code der immer laufen soll kommt hier hin.
/* es wird kontrolliert, ob die Zeit für das Blink-Intervall schon abgelaufen ist
* Wenn die Zeitdifferenz zwischen dem Letzten Abspeichern und der aktuellen Zeit größer
* als das Intervall ist, so wird die nachfolgende Funktion ausgeführt.
*/
if (millis() - previousMillis > interval) {
previousMillis = millis(); // aktuelle Zeit abspeichern
// LED Zustand wecheln.
value = !value;
// Wert auf den Ausgang schreiben
digitalWrite(ledPin, value);
}
}
Ich kann die millis aber noch nicht so recht anwenden.
Wie kann ich denn z.B. mit Frau Milli eine Schleife 5s lang immer wieder durchlaufen lassen?
du möchtest eine Schleifen nicht aller 5s aufrufen, sondern die Schleife soll 5s laufen bevor es weiter geht?
Dafür kannste ein while Schleife nehmen und läßt die Bedingung überprüfen.
gut. Du hast das folgende schon verstanden, richtig?
if (millis() - previousMillis > interval) {
previousMillis = millis(); // aktuelle Zeit abspeichern
dann mußte mit while() rum probieren. while(1) ist immer gültig, dass als Hinweis. Praktisch Endlosschleife.
Jetzt mußt die while Bedingung in der Klammer entsprechend ändern für dich. Also eine Variablenprüfung auf kleiner Zeit zum Bsp. Solange wäre dann die while gültig.
Also was muß grob passieren. Vor Eintritt der while mußte die aktuelle Zeit millis kennen. In der while mußte die aktuelle Zeit abfragen und mit der vor Eintritt vergleichen. Alles klar?
"Die bösen delay's hab ich nur zum sichtbar machen (ser.Monitor) drin."
Bau dir eine Funktion mit millis, die dir die Anzeige z,B. 1 mal je Sekunde aktualisiert
Bitte nicht gleich so bombardieren, ich muss mich Schritt für Schritt vortasten.
Um die millis zu verstehen und gleich anzuwenden möchte ich mir damit einen Klopfschalter zum Einschalten einer Pollerlampe bauen.
Damit es nicht zu einfach wird und ich die millis so richtig ausreizen will, soll die Pollerlampe je nach "Anzahl der Klopfzeichen in einer bestimmten Zeit" an bleiben. So der momentane Plan...
Step by step - erste Frage:
Wo blockiere ich mit dem Code? (wenn "delay(10);" raus ist)
Hallöle,
ich tat mich am Anfang auch mit diesen Dingen schwer. Irgendwann machte es "Klick" und heute bediene ich mehrere "Kanäle" vollkommen asynchron. Egal ob Ein- oder Ausgaben - alles mehr oder weniger "parallel und unabhängig". Versuche mal nachfolgenden Code durchzuarbeiten. Vielleicht kommt dein "Kick" mit anderen Variablen-Bezeichnungen...
Rudi
unsigned long aktuell_1; // Aktueller Millis-Wert (1) für einen Durchlauf
unsigned long zuletzt_1; // Letzter Wert für LED 1
boolean led_1; // Status 1
unsigned long aktuell_2; // Aktueller Millis-Wert (2) für einen Durchlauf
unsigned long zuletzt_2; // Letzter Wert für LED 2
boolean led_2; // Status 2
void setup()
{
pinMode( 13, OUTPUT ); // LED an Pin 13
pinMode( 2, OUTPUT ); // LED an Pin 2
}
void loop()
{
// Einmalig je Durchlauf speichern
// -------------------------------
aktuell_1 = millis();
aktuell_2 = aktuell_1; // Kopie für 2. "Kanal"
// Verarbeitung 1: Blinken alle 250 mS
// -----------------------------------
if( aktuell_1 - zuletzt_1 > 250 )
{
digitalWrite( 13, led_1 = ! led_1 );
zuletzt_1 = aktuell_1; // Für nächste "Schleife 1" merken
}
// Verarbeitung 2: (z.B.) Blinken alle 5000 mS
// -------------------------------------------
if( aktuell_2 - zuletzt_2 > 5000 )
{
digitalWrite( 2, led_2 = ! led_2 );
zuletzt_2 = aktuell_2; // Für nächste "Schleife 2" merken
// Je nach "Status 2" andere Vorgänge bearbeiten
if( led_2 == true ) { /* Starte z.B. Messvorgang */ }
if( led_2 == false ) { /* Beende Messvorgang (nach 5 Sekunden) */ }
}
}