Guten Morgen liebe Gemeinde, bin erst umgestiegen auf Arduino und habe ein kleines Problem. Ich möchte mit einem Taster folgendes machen: Wenn: - Taster LOW, dann alle LEDs aus - Taster HIGH, dann LED1 leuchtet für 1Sekunde, danach LED3 leuchtet so lange Taster gedrückt! - Taster wird losgelassen, LED3 geht aus, LED2 leuchtet für 1Sekunde. Wäre gut, wenn Taster noch entprellt wäre. Leider weiß ich nicht, welche Schleife ich nehmen muß. Hier mein Sketch nur als Übersicht: int Taster=7; int Tasterstatus=0; int LED1=6; int LED2=5; int LED3=4; void setup() { pinMode(Taster, INPUT); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); } void loop() { Tasterstatus=digitalRead(Taster); if (Tasterstatus == HIGH) { digitalWrite(LED1, HIGH); delay (1000); digitalWrite(LED1, LOW); delay (50); digitalWrite(LED3, HIGH); } else { digitalWrite(LED3, LOW); delay (50); digitalWrite(LED2, HIGH); delay (1000); digitalWrite(LED2, LOW); } } Vielen Dank im Voraus
Schau dir nochmal die Grundlagen zum Arduino Programmieren an. Warum hast du für den Tasterstatus einen Integer und keinen Bool genommen? Die Beispielprogramme der IDE könnten dir auch schon helfen.
Hallo Harald G., und wie sind die Eingänge der Taster beschaltet? So dass diese immer einen definierten Eingangspegel haben?
> danach LED3 leuchtet so lange Taster gedrückt!
Dein Code wiederholt den Block *if (Tasterstatus == HIGH) {...}* immer
wieder, solange der Taste gedrückt gehalten wird. Du willst ihn aber nur
einmal ausführen, wenn der Taster von "losgelassen" nach "gedrückt"
wechselt.
Entsprechend willst du auch den Block *else {...}* nur einmal ausführen,
wenn der Taster von "gedrückt" nach "losgelassen" wechselt.
Und wenn der Taster-Status unverändetr ist (losgelassen oder gdrückt),
soll gar nichts passieren.
Vorschlag:
1 | void loop() |
2 | {
|
3 | Tasterstatus=digitalRead(Taster); |
4 | if (Tasterstatus != VorherigerStatus) |
5 | {
|
6 | if (Tasterstatus == HIGH) |
7 | {
|
8 | digitalWrite(LED1, HIGH); |
9 | delay (1000); |
10 | digitalWrite(LED1, LOW); |
11 | delay (50); |
12 | digitalWrite(LED3, HIGH); |
13 | }
|
14 | else
|
15 | {
|
16 | digitalWrite(LED3, LOW); |
17 | delay (50); |
18 | digitalWrite(LED2, HIGH); |
19 | delay (1000); |
20 | digitalWrite(LED2, LOW); |
21 | }
|
22 | }
|
23 | VorherigerStatus = Tasterstatus; |
24 | }
|
Vielen Dank für die Antworten! Der Lösungsvorschlag habe ich probiert und funktioniert! Vielen Dank!
Ich habe noch eine Frage.... momentan ist der Taster über 5Volt und einem 1kΩ Widerstand gegen Masse aufgebaut, würde der Arduino auch mit einem Taster der gegen Masse geschaltet ist, funktionieren? Also ohne die 5Volt
Wenn du INPUT_PULLUP schreibst, dann kannst du den Taster gegen GND schalten, ohne weitere Bauteile.
Da ich über die Leitung, wo der Taster hängt, noch mit 2 Taster über Widerstände, etwas steuern möchte (nicht mit Arduino), soll nun am analogen Eingang des Arduino (statt bisher am digitalen), erst ab einen Wert unter 1KΩ der Ablauf starten. Wie gehe ich am besten vor? Mein bisheriges Sketch: //Taste - Eingang Masse int LED1=13; //wartet int LED2=12; //gestartet int Taster=11; //Taste gedrückt gegen Masse, ansonsten kein starten von Programm, wenn Widerstand über 1kΩ int Tasterstatus=0; int VorherigerStatus; //alle gegen Masse mit genannten Widerstand int LED3=10; int LED4=9; int LED5=8; void setup() { pinMode(Taster, INPUT); digitalWrite(Taster, HIGH); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); pinMode(LED5, OUTPUT); } void loop() { Tasterstatus=digitalRead(Taster); if (Tasterstatus != VorherigerStatus) { if (Tasterstatus == LOW) { digitalWrite(LED1, LOW); delay (10); digitalWrite(LED2, HIGH); delay (10); digitalWrite(LED4, HIGH); delay (100); digitalWrite(LED4, LOW); delay (100); digitalWrite(LED5, HIGH); } else { digitalWrite(LED5, LOW); delay (100); digitalWrite(LED4, HIGH); delay (100); digitalWrite(LED4, LOW); delay (10); digitalWrite(LED2, LOW); digitalWrite(LED1, HIGH); } } VorherigerStatus = Tasterstatus; }
:
Bearbeitet durch User
Nach längerer Überlegung habe ich eine andere Idee.... Möchte über den Arduino nun doch alle Schaltvorgänge steuern, abhängig vom jeweiligen Widerstand. S1 = Abfolge von Programm, siehe Sketch unten neu hinzu: S2 = nur LED3 leuchtet S3 = nur LED4 leuchtet Mein bisheriges Sketch: //Taste - Eingang Masse int LED1=13; //wartet int LED2=12; //gestartet int Taster=11; //Taste gedrückt gegen Masse, ansonsten kein starten von Programm, wenn Widerstand über 1kΩ int Tasterstatus=0; int VorherigerStatus; //alle gegen Masse mit genannten Widerstand int LED3=10; int LED4=9; int LED5=8; void setup() { pinMode(Taster, INPUT); digitalWrite(Taster, HIGH); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); pinMode(LED5, OUTPUT); } void loop() { Tasterstatus=digitalRead(Taster); if (Tasterstatus != VorherigerStatus) { if (Tasterstatus == LOW) { digitalWrite(LED1, LOW); delay (10); digitalWrite(LED2, HIGH); delay (10); digitalWrite(LED4, HIGH); delay (100); digitalWrite(LED4, LOW); delay (100); digitalWrite(LED5, HIGH); } else { digitalWrite(LED5, LOW); delay (100); digitalWrite(LED4, HIGH); delay (100); digitalWrite(LED4, LOW); delay (10); digitalWrite(LED2, LOW); digitalWrite(LED1, HIGH); } } VorherigerStatus = Tasterstatus; } Vielen Dank und einen schönen Feiertag
:
Bearbeitet durch User
Wenn du mehrere Taster an Analogeingang hast, wie in deinem Plan gezeichnet, dann musst du auch analogRead(Taster)nehmen. Du brauchst drei Widerstände in Serie von +5V zum A0. Dazwischen legst du die Taster nach GND. Du kannst ja keinen Widerstand messen sondern nur die Spannung am A0.
Vielen Dank Hubert, leider sind die Taster und Widerstände extern, daher kann ich Sie auch nicht auf 5Volt schalten. Irgendwo ich auch schon mal gesehen, dass es eine Lösung gibt, die sogenannte Referenz über einen anderen analogen Eingang gibt, wird diese Referenzspannung überschritten, dann schaltet er durch. Sowas müsste ja auch bei 3 Referenz Spannungen gehen? Und wenn, wie sieht dann der Sketch aus? Bin leider noch nicht ganz durchgestiegen.
Habe die Fernsteuereinheit nochmals auseinandergenommen und bemerkt, dass wie von Hubert vorgeschlagen, im Ruhezustand 5Volt an den Widerständen anliegen. Soweit so gut, nun habe ich aber nur 2 Leitungen zur Verfügung, die Messeleitung und die Steuerleitung, die jenach welche Taste gedrückt wird, Spannung leitet, da steig ich noch nicht durch, oder kann ich A0 einfach auf 5Volt legen? Das hieße aber auch, dass wenn S1 gedrückt, ein Kurzschluss auf der 5Volt Versorgung wäre. Wie würde der Sketch aussehen in etwa, um diese 3Spannungen 3verschiedenen Aktionen, zu zu ordnen?
:
Bearbeitet durch User
Es gibt bei Fritzing auch eine Schaltplanansicht - verwende die und nicht die unnötige Steckbrettansicht. walta
Deine Beschreibung ist mir nicht ganz klar. Ein richtiger Schaltplan wäre da schon sehr hilfreich.
Wenn du zwischen A0 und 5V einen Widerstand einfügst, z.B. 4k7, dann funktioniert es.
okay, das habe ich mir auch gedacht. Wie sieht es mit dem Sketch aus,damit ich die 3 Spannungen in meinen einfügen könnte? Da blicke ich bislang noch nicht durch, obwohl ich schon mit Schaltungen mit Potentiometer angesehen habe, war trotzdem nichts brauchbares dabei.
Habe die Schaltung ohne LEDs aufgebaut und über SerialMonitor ausgelesen. Dabei kamen folgende Werte heraus: S1 = 0 S2 = 469 S3 = 330 wie kann ich nun diese in meine Schaltung integrieren, dass S1 das Programm wie gehabt durchläuft, und wenn S2 oder S3 was anderes macht?
In den Beispielen Analog / Calibration ist die Abfrage schön beschrieben. Anstelle den min oder max Abfrage muss du nach deinen Werten fragen. if (sensorvalue < 10){ digitalWrite(LED1, HIGH); } else{digitalWrite(LED1, LOW);} und so weiter mit den anderen Werten.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.