Zeitsteuerung- keinen Plan

Hallo Gemeinde,

nach meiner heutigen Vorstellung- vielen Dank für die netten Feedback´s habe ich auch schon das erste Problem und komme einfach nicht weiter.
Das Projekt soll so aussehen: ich drücke einen Taster, LED1 geht an, bleibt z.B. 10 sek. an, danach aus. Das ganze geht von vorn los, wenn ich den Taster wieder drücke.
Das habe ich ja noch mit einem abgewandelten Sketch hinbekommen. Nun habe ich eine zweite LED eingebaut, die soll 1,5 sek. nach dem Tasterdruck ebenfalls an gehen und nach 0,5 sek. wieder aus. Auch das habe ich hinbekommen, aber LED1 geht nach der halben sek. ebenfalls mit aus, und das soll eben nicht sein, die soll erst nach den 10 sek. ausgehen. Ich bekomme das einfach nicht hin, ich weiß nicht was ich tun muß, damit das so geht.
Ich hänge mal den Sketch an, aber bitte nicht lachen, ich kann es noch nicht anders. Ich möchte auch keinen fertigen Sketch von euch, nur Tips, so nach dem Motto, da fehlt das und das, ich will das dann selber programmieren und dabei lernt man am besten.

int Zustand = 0;
int LED1 = 8;
int LED2 = 10;
int Taster = 9;

void setup(){
pinMode (Taster, INPUT);
pinMode (LED1, OUTPUT);
pinMode (LED2, OUTPUT);
}

void loop(){
Zustand = digitalRead (Taster);
if (Zustand == LOW){
digitalWrite (LED1, LOW);
digitalWrite (LED2, LOW);

}
else{

digitalWrite(LED1, HIGH);
delay(1500);

digitalWrite(LED2, HIGH);
delay(500);

}

}

Ja, das sind meine geistigen Ergüße, für mehr reicht´s ohne Hilfe eben noch nicht.
Vielen Dank schonmal für eure Antworten.

Ralf

hi,

schlechte nachrichten: Du machst das falsch. :confused:

das problem dabei: delay blockiert den arduino. er machst in dieser zeit einfach nichts außer takte zählen.

besser für später: immer wieder schaueen "wie spät es ist", also ob eine bestimmte zeit abgelaufen ist. so kann man zwischendurch andere dinge tun.

der arduino hat keine richtige uhr, aber er zählt die millisekunden, die seit dem einschalten vergangen sind.

schau Dir das BlinkWithoutDelay an, das bei den beispielen dabei ist.

gruß stefan

Wenn du es mit Delay lösen möchtest, wäre der zeitliche Ablauf:

Taste gedrückt-> Led 1 an, 1,5sec. warten, Led 2 anschalten, 0,5sec. warten, led2 wieder aus, 8sec. warten Led1 aus.

Allerdings blockiert der Code während dessen, eine Abbruchtaste wäre z.B. nicht möglich.

Eleganter geht es wie Eisbaer es vorschlägt.

Ich empfehle diese Anleitung hier. :wink:

Delay ist so gut es geht in Sketches, die keine Lehrbeispiele sind zu vermeiden, da es ein blockierender Befehl ist. Heißt so viel wie: in der Zeit des Delays mach Dein Arduino nichts, außer warten. Er reagiert auf keine Sensoren, keine Eingaben, gar nichts......

lg, Claus

Vielen Dank erstmal für die prompten Antworten, da ist viel Potential drin und ich kann ausprobieren.
Als Anfänger hangelt man sich nun mal an den Anfängerbeispielen lang um die ersten Erfolge zu feiern und da wird eben viel mit delay gearbeitet, aber ich werd mir die andere Methode angewöhnen, in der die Zeit gezählt wird und in der auch andere Aktionen ausgeführt werden können.
Ich halt euch auf dem Laufenden.

Ralf

In den einfachen Beispielen hat das auch keine negativen Auswirkungen. Da wird eine Sache gezeigt und das wars. Eine komplizierte Zeitsteuerung würde da auch von anderen Sachen ablenken.

Wenn man dann aber versucht zwei solche Beispiele zusammenzufügen und die sollen nebeneinander laufen bekommt man Probleme

Claus_M:
in der Zeit des Delays mach Dein Arduino nichts, außer warten. Er reagiert auf keine Sensoren, keine Eingaben, gar nichts......

Pingelig an: Habe ich auch so gedacht, bis der Arduino auf einen Interrupt reagiert hat. Pingelig aus.

Bezogen auf dieses Thema stimme ich Dir aber zu. :slight_smile:

Hallo,

hab gestern Abend die von Theseus vorgeschlagene Variante an meinen Sketch drangehängt und nun funktioniert es, und bei dieser Anwendung auch kein Problem, wenn der Arduino während der Aktion blockiert ist.
Die Empfehlung von Eisebaer habe ich versucht umzusetzen, aber ich kapier das nicht, irgendwie hab ich da ein Brett vor dem Kopf. ich hab zwar einen Sketch geladen und den entsprechend nachgebaut und es hat auch funktioniert, aber abändern auf meine Bedürfnisse, das hab ich nicht hinbekommen. Was mir fehlt ist so eine Art Lexikon, in dem die Befehle kurz beschrieben sind und auf deren Bedeutung hingewiesen wird. Sowas hab ich nicht gefunden. Vielleicht hat jemand einen Link?
Aber ich wird mich weiter reinhängen und irgendwann platzt der Knoten, bestimmt.

Einen schönen sonnigen Tag allen

Ralf

Was mir fehlt ist so eine Art Lexikon, in dem die Befehle kurz beschrieben sind und auf deren Bedeutung hingewiesen wird.

Die Arduino Referenz: Arduino Reference - Arduino Reference
Zusätzlich: avr-libc: AVR Libc

Auch ein Buch kann beim Einstieg helfen. Ich kann Boxall: Arduino-Workshops oder Arduino-Praxiseinstieg-Professional-Thomas-Brühlmann empfehlen. Ich hatte Glück und sie waren in der städtischen Leihbibliothek vorrätig.

Auf Papier gedruckte und erklärte Programmbeispiele finde ich deutlich einfacher nachzuvollziehen und zu verstehen als alles nur auf dem Bildschirm zu sehen.

autoralf:
… aber ich kapier das nicht, irgendwie hab ich da ein Brett vor dem Kopf.

Das erinnert mich an Auf Kriegsfuss mit den millis mit vielen Hinweisen und Beispielen. Besonders schön finde ich den Nachtwächter, der ums Haus geht (siehe dort #28).

Mein derzeitiger Liebling zum Nachschlagen ist “C von A bis Z von Jürgen Wolf”, was da in #3 verlinkt ist.

Dann habe ich mir Deine Aufgabenstellung genommen und so implementiert, wie ich das für ein größeres Projekt machen würde. Das sieht recht überkandidelt aus. Aber Du möchtest ja den Schritt machen von einem einfachen Beispiel hin zu einem richtigen Projekt. :slight_smile:

Test_Forum.ino (2.48 KB)

Ein üblicher Bestandteil des "Brett vor dem Kopf" ist die Vorstellung, loop() würde den Programmablauf beschreiben. ( falsch :wink: )

Wenn man sich im Kopf angewöhnt, dass loop() nur beschreibt, was in einem beliebigen Moment gemacht werden soll, und dass man dazu ein paar Zustandsmerker braucht, ist man auf dem richtigen Weg.

Bei zeitabhängigen Steuerungen merkt man sich in der Regel, seit wann die Wartezeit läuft.(BlinkwithoutDelay)

Bei interaktiven Sachen, ob der jetzt gedrückte Taster schon erkannt und verarbeitet wurde, oder ob das ein neues Ereignis ist.

usw.

Ein üblicher Bestandteil des "Brett vor dem Kopf" ........

Och, da wüsste ich auch noch einen:

Man hat ein tolles Programm geschrieben, mit delay(), und das tuts auch prächtig.
Und jetzt soll da noch irgendwas anderes passieren.....

Als erstes auffällig ist, dass delay() andere Programmteile blockiert.

Also ist die erste naive, konsequente und leider auch falsche Idee, man müsste delay() durch etwas nicht blockierendes ersetzen. Auf Systemen mit präemptiven Multitasking würde das prächtig funktionieren, aber da sind wir mit unseren Arduinos eher nicht.

Es ist an der Zeit einiges von dem frisch gelerntem über Bord zu werfen und in anderen Strukturen zu denken.
In den meisten Fällen landet man bei einer schlichten Form des kooperativen Multitasking.
Ganze Horen von einfachen endlichen Automaten, werden sich tummeln.
Lang laufende Schleifen werden "ausgerollt".

Für ganz dringende Dinge gibts dann ja immer auch noch die Interrupts.

Hallo,

ziemlich viel Input (um mal mit dem Arduino Slang zu sprechen :wink: ). Das Brett wird immer dicker :angry:.
Ich habe mir nun auch noch das Buch, welches Theseus mir empfohlen hat, bestellt. Außerdem habe ich einige Seiten mit den Grundbegriffen und deren Bedeutung ausgedruckt. Aber es hat noch nicht "klick" gemacht.
Nun hab ich gerade ein Sketch zum Laufen bekommen, in dem eine LED ohne delay blinkt.
So sieht der aus:

byte ledPin = 11;
boolean value = HIGH;
unsigned long previousMillis = 0;
unsigned long interval = 500;

void setup()
{
pinMode(ledPin, OUTPUT);
}

void loop()
{

if (millis() - previousMillis > interval) {
previousMillis = millis();

value = !value;

digitalWrite(ledPin, value);
}
}

Das erste Problem ist schon, wie kann ich die Einschalt-und Ausschaltzeiten ändern? Jetzt blinkt es gleichmäßig?
Außerdem hab ich versucht eine zweite LED einzubinden, geht nicht... :cry: , und da red ich noch nicht mal von nem Einbinden eines Tasters...

Ralf

der momentan völlig verzweifelt die blinkende LED anstarrt...

Rate mal, wozu interval und value Variable sind. (Damit du sie ändern kannst)

Ich verkneife mal dir das fertig hinzuschreiben, aber
** ** if** **
ist ein Hinweis … :wink:


Jetzt ist die LED 500 ms an und 500 ms aus. Und digitalWrite wird nur einmal alle 500 ms aufgerufen.
Siehst du das?

Es schadet übrigens nichts, digitalWrite öfter als nötig (mit dem gleichen Wert immer wieder) aufzurufen.

Das erlaubt eine alternative Lösung:
wir nehmen das interval als Gesamt-Zyklus und unterteilen den in eine An und eine Aus - Phase

if (millis() - previousMillis < 100 ) digitalWrite(ledPin, HIGH); // 100 ms an
else digitalWrite(ledPin, LOW);  // den Rest eines Zyklus aus

if ( millis() - previousMillis > interval ) previousMillis = millis(); // Intervall Neustart

Nach einemif()kann eineAnweisung; stehen, oder mehrere anweisungen per { } zusammengefasst


Ach ja, code markieren und </> klicken, macht das ganze leichter und sicherer lesbar.

autoralf:
... wie kann ich die Einschalt-und Ausschaltzeiten ändern?

Du könntest sie berechnen oder in einem Feld speichern:

unsigned long interval[] = {500,1000,4000,200,111};

Ich bin wahrscheinlich zu doof dazu, ich weiß nicht mal wo ich die Codeschnipsel einfügen muss, die ihr mir freundlicherweise geschrieben habt. Im Moment leuchtet die LED dauernd und ich bekomme beim Hochladen die unterschiedlichsten Fehlermeldungen.
Vielleicht gibt´s ja bei uns in der Volkshochschule nen Grundkurs für besonders blöde.

Ralf

autoralf:
Ich bin wahrscheinlich zu doof dazu ...

Könnte sein. Ich bin nur zufällig in diesem Thread und würde gerne den aktuellen Stand des Codes sehen. Kannst Du den nochmal zeigen?

Gruß

Gregor

ich bekomme beim Hochladen die unterschiedlichsten Fehlermeldungen.

Das Raten bei nichtssagenden Posts haben wir alle im Selbststudium gelernt, da habe ich keinen Volkshochschul-Kurs für gefunden.
Uwe hat wohl mal eine Wahrsage-Glaskugel von einer entfernten Großtante geerbt, aber auf die ist in letzter Zeit nicht mehr so viel Verlass. (Seit Arduino Genuino heisst, wird sie wohl etwas trüb geworden sein. die Kugel, nicht die Tante)

Keine Ahnung, ob deine “unterschiedlichsten Fehlermeldungen” den gleichen oder unterschiedliche Gründe haben. Und welche(n), ist noch schwerer zu raten. Sorry.

Wenn du einen Blink Sketch mal wieder ans Laufen kriegst, kannst du ja mal ausprobieren, was bei vorsichtigen Änderungen passiert.

Ansonsten gilt: Fehlermeldungen sind besser als gar nichts. Haben oft sogar schwer verständlichen aber immerhin lesbaren Text.