Schönen guten Abend,
Ich bin der Diter bin neu und beschäftige mich seit kurzem mit einem Arduino Pro Micro.
Ich habe schon ein paar Erfahrungen sammeln können aber nun komme ich nicht weiter.
Momentan habe Ich versucht eine Led so zu Schalten das wenn an Pin9 Spannung anliegt die Led aus ist wird diese aber entfernt soll die Led für einen gewissen Zeitraum Leuchten, Sagen wir 1min., ist das möglich oder schon zu lang?
Alles was Ich bis jetzt hinbekommen habe ist das die Led an und aus geht :o
int LEDrot = 10;
int Switch = 9;
int SwitchStatus = 0;
int delaytime = 60000;
void setup ()
{
pinMode(LEDrot, OUTPUT);
pinMode(Switch, INPUT);
}
void loop () {
SwitchStatus=digitalRead(Switch); //Schalterstatus abfragen
if (SwitchStatus == HIGH) // Bei Schalter an
{
digitalWrite(LEDrot, LOW);
}
if (SwitchStatus == LOW) // Bei Schalter aus
{
digitalWrite(LEDrot, HIGH);
delay (delaytime);
digitalWrite(LEDrot, LOW);
}
}
Ich nehme an wenn du deine Taste einfach fest hälts geht die LED nie aus.
Oh Moment -> bei Taste gedrückt setzt du den Ausgang auf LOW. Wenn du die LED
gegen Masse geschaltet hast geht sie auch bei gedrücktem Taster nicht an.
Wie hast du den Taster angeschlossen ?
Mit Pulldown gegen +5 V ?
Dann stimmt erst mal die Tasterlogig.
Aber was hast du programmiert ?
Wenn der Taster aus ist machst du die LED AN !!!
Und dann machst du sie nach einer Minute wieder aus.
Da der Taster immer noch nicht gedrückt ist geht das Spiel dann von Vorne los.
Wenn du in dem Tasteraus-Zweig bist wird eine Minute lang der Taster nicht mehr
abgefragt weil du den Prozessor mit delay ja eine Minute zum Nichtstun verdonnerst.
Such mal hier nach "Statemaschine" und nach "blink without delay".
So geht das nicht.
Noch mal -> dein Ardunio tut genau das was du beschreibst - das hast du auch programmiert.
Der einfachste Fehler ist noch das du die LED ausmachst wenn du den Knopf drückst.
Alles unterhalb 49,7 Tage sollte ohne größere Verrenkungen machbar sein, wenn loop() nicht unnötig aus-gebremst wird.
Was willst Du?
LED AUS, wenn Pin 9 HIGH
Startzeit merken, wenn Pin 9 von LOW nach HIGH geht (und nur dann)
LED AN, wenn Pin 9 LOW oder die Startzeit weniger als 10 Minuten vergangen ist
Du hast momentan, daß die LED HIGH geht, gewartet wird, die LED LOW geht.
Wenn jetzt der Taster noch gedrückt ist, geht die LED DIREKT wieder an - der Dunkel-Blitz ist so kurz, daß Du Das nicht sehen kannst.
Verabschiede Dich von delay().
Schaue Dir die Links an, Die combie dort aufgelistet hat:Klick
Schaue Dir die Links an, Die combie dort aufgelistet hat:Klick
Oder dieses Beispiel.
Ist zwar nur ein Relais, keine LED, aber das Prinzip sollte passen.
Implementiert, nach der selben Idee, wie hinter den Links ausgebreitet.
Hallo,
es ist ja schon angesprochen worden , du solltest dich noch mal mit dem Thema beschäftigen wie der Taster anzuschliessen ist. Es gibt da zwei Möglichkeiten. Bei beiden Varianten ist darauf zu achten das der Eingang nicht offen in der Luft rumhängt, sondern immer einen definierten Pegel hat. Da ein normaler Taster halt einen Kontakt hat ist der im nicht gedrückten Zustand ja geöffent.
Taster mit einem Bein an +5V , das andere Bein am Eingang. Dann ist ein zusätzlicher Pulldown Widerstand erforderlich,(2-10KOhm) Ein Bein ebenfalls am Eingang das andere an GND. Damit hat der Eingang bei offenem Taster 0V über den Widerstand anliegen und bei geschlossenen Taster +5V. Im Sketch dann pinMode(pin,INPUT) verwenden. siehe link.
Taster mit einem Bein am Eingang , das andere Bein an GND angeschlossen. Damit der Pegel des Einganges bei offenen Taster nicht irgendwo in der Luft hängt ist ein Pullup Widerstand erforderlich. Dazu ist im Controller bereits einer eingebaut den man allerdings noch einschalten muß. Dazu im Sketch pinMode(pin,INPUT_PULLUP) verwenden. Bei dieser Variante ist dann allerdings die Funktion invertiert.Bei geöffnetem Taster ist der Eingang H, und bei gerücktem Taster ist der Eingang L. Damit die Logik dann wieder stimmt verwendet man eine Hilfsvariable und ließt den Eingang dann invertiert ein. siehe Beispiel.
Du verwendest in Deinem Sketch delay() um die Zeitverzögerung zu machen. Das kannst Du grundsätzlich machen. Allerdings solltest Du bedenken das bei einem delay() der Programmablauf eine Pause macht und da gewartet wird bist die Zeit abgelaufen ist. Damit passiert nichts mehr, Du kannst nicht mal erkennen ob inzwischen der Taster wieder offen wurde. Wenn Du dann z.B zwei Taster unabhängig voneinander bearbeiten willst , oder eine LED soll z.B blinken, geht das gar nicht auf diese Art. Man verwendet dazu besser millis().
Du solltst dir das Beispiel"BlinkWithoutDelay" ansehen und verstehen. Wenns mit dem Verstehen nicht gleich so klappen will dann suche nach "Nachtwächter".
So jetzt noch das Beispiel zu Thema Taster einlesen.
@posmaster-ino
Ja Ich möchte das bei betätigten schalter (GND oder 5V ) das Licht aus ist.
Wird der Taster nun kurzzeitig nicht betätigt so soll die Led für eine Zeit X Leuchten, egal ob der Taster wieder betätigt ist oder nicht. Danach soll sie ausgehen.
Mit dem Code für das Relais konnte Ich jetzt nicht so viel anfangen zumindest ist mir nichts eingefallen.
Statdessen das, aber ich bekomme immer diese Fehlermeldung und Ich erkenne das Problem nicht!
da du in Deinem letzten Post ein paar Zeilen von meinem Beispiel übernommen hast, fühle ich mich noch mal angesprochen Dir auf die Sprünge zu helfen. Ich hab jetzt mal mein Beispiel mit einem delay erweitert. Ich hatte ja bereits geschrieben das das eigendlich nicht der Weisheit letzter Schluss ist. Dennoch !!
Nun es wird ein Flanke benötigt die erkennt das der Taster von betätigt auf nicht betätigt wechselt. Nur dann soll die LED angehen und die Zeit ablaufen. Bleibt der Taster offen soll die LED nach der Zeit wieder ausgehen.
Wenn Du ein bischen vertrauter mit dem syntax geworden bist solltest Du das delay durch millis ersetzen , ist eine schöne Übung.
Heinz
const byte butonpin = 2;// Taster schaltet nach GND
const byte led = 13; // uno interne LED
bool butonstat;
bool lastbutonstat; //hilfsmerker für Flanke
void setup() {
pinMode(butonpin, INPUT_PULLUP);
pinMode(led, OUTPUT);
}
void loop() {
butonstat = digitalRead(butonpin);
//butonstat = !digitalRead(butonpin);// invertiert einlesen
if (butonstat & !lastbutonstat) { // Flanke erkannt
lastbutonstat = true; // Flankenmerker setzten
digitalWrite(led, HIGH);
delay(5000);
digitalWrite(led, LOW);
}
if (!butonstat) lastbutonstat = false; // Flankenmerker zurück
}
#define LED_OFF 0
#define LED_ON 1
#define LED_GODOWN 2
const int LED = 10;
const int BUTTON = 9;
unsigned long int ledTime = 0;
char LedState = LED_OFF;
void setup()
{
pinMode(BUTTON,INPUT_PULLUP);
pinMode(LED,OUTPUT);
}
void loop()
{
if (! digitalRead(BUTTON))
{
if (LedState != LED_ON)
{
digitalWrite(LED,HIGH);
LedState = LED_ON;
}
}
else // Taste nicht gedrückt
{
if (LedState == LED_ON)
{
LedState = LED_GODOWN;
ledTime = millis();
}
else
{
if ( (LedState == LED_GODOWN) && ((millis() - ledTime) >= 60000) )
{
digitalWrite(LED,LOW);
LedState = LED_OFF;
}
}
}
}
Compiliert mit 0 Fehlern.
Das Prinzip sollte klar werden auch wenn ich eventuell da noch einen Bug drin habe.
Kein Delay. Prozessor wird nicht sinnlos angehalten !
Wenn die eine Minute Wartezeit bis zum Abschalten läuft und der Knopf wieder gedrückt wird ist
die Wartezeit vorbei und die LED bleibt an.
Ach so : Die Taste ist natürlich nicht entprellt. Kann sein das du damit nicht viel Spaß hast !
@Diter
Drücke in der IDE Mal STRG+T - Das rückt den Code auf Klammer-Ebene ein.
Wenn Du dann mehrere Klammern direkt ganz vorne untereinander hast - oder gaaanz unten steht KEINE Klammer ganz vorne - ist wohl was faul.
Auch sind die ganzen Klammern in und um Deine IFs ... äh ... verwirrend - nicht zwingend für mich, für Dich aber mit Sicherheit!
Auch hat ein ; hinter der IF-Abfrage NICHTS verloren - dort ist die IF nämlich zu Ende - die Klammer drunter hat nur den Zweck, daß der Bereich eben vom Rest abgekapselt ist (eigene lokale Variablen z.B.) - mehr aber nicht.
Deshalb sollte man nach dem aktuell möglichen Syntax programmieren.
Danke für den Tip. Ja.
int delaytime {60000};
warning: narrowing conversion of '60000l' from 'long int' to 'int' inside { } [-Wnarrowing]
Ist übrigens keine 600001 sondern 60000L und zeigt, dass das Aufweiten entsprechend dem Standard super funktioniert. 60000 wird (beim Uno/Nano/Mega) übrigens auf long und nicht auf unsigned int aufgeweitet.
wie meinst du das mit "wird aufgeweitet"? Missverständnis? Dein Compiler ändert doch nicht etwa eigenmächtig den Datentyp? Die Warnung lese ich wie folgt. Die 60.000, was eigentlich long ist, wird fälschlicherweise in ein int gepresst was nicht rein paßt. Davor wird man gewarnt. from long to int. Wenn man das testet erhält man auch falsche -5536.
Oder habe ich dich falsch verstanden? Soll ja vorkommen.