4 Tasten für 4 Laufzeiten des gleichen Programms
|
16.07.2016, 16:45
Beitrag #1
|
|||
|
|||
4 Tasten für 4 Laufzeiten des gleichen Programms
Hallo,
wenn man nicht permanent mit dem Arduion arbeitet, dann bleibt man an den einfachsten Aufgaben stecken - so bei mir: Ich möchte ein Programm für vier unterschiedliche Laufzeiten ablaufen lassen. Dazu gibt es eine Folientastatur mit vier Tasten - Taste 1 = 1s, Taste2=2s usw. Da ich keine zusätzlichen Widerstände dazubauen will, verwende ich die internen Pull-Ups. Zum einfachen Üben und Austesten soll als Programm nur die LED13 für die unterschieldichen Laufzeiten leuchten - tut es aber nicht. Zugegeben, mit den Millis hab ich es nicht so. ![]() Mein bisheriger Versuch - aber nicht lachen ![]() Code: const int ledPin = 13; VD ------------------------------------------------------------------------------------------ Ein Teufelskreis: Kaum macht man es richtig,funktionierts! |
|||
16.07.2016, 17:30
(Dieser Beitrag wurde zuletzt bearbeitet: 17.07.2016 01:06 von Scheams.)
Beitrag #2
|
|||
|
|||
RE: 4 Tasten für 4 Laufzeiten des gleichen Programms
Hey!
Hier sind ein paar Fehler ![]() Also: If-Abfragen: Code: if (condition) { } Code: if (condition, ?Variable setzten?) { } D.h. für deine 1. If-Abfrage: Code: if (buttonState1 == true && buttonState2 == false && buttonState3 == false && buttonState4 == false) interval = interval1; Code: interval = interval1 && interval2 && interval3 && interval4; Millis Schleifen gehen so: Code: if (millis() - previousMillis > interval) { Da bei dir aber nur die LED 13 einmal auf HIGH gesetzt wird, nie auf LOW wird sie immer leuchten. Außerdem müsstest du einen Status definieren, dass ein Taster gedrückt wurde und dann soll die LED soundsoviele Millisekunden leuchten. Außer du willst eine blinkende LED mit verschiedenen Intervallen, dann musst du in deiner Millis-Schleife die LED immer umschalten: Code: if (millis() - previousMillis > interval) { mfg Scheams |
|||
17.07.2016, 07:53
Beitrag #3
|
|||
|
|||
RE: 4 Tasten für 4 Laufzeiten des gleichen Programms
Moin Scheams,
danke für Deine Antwort und ich habe versucht die Empfehlungen um- und einzusetzen: Code: const int ledPin = 13; Also nicht das, was es soll! Was habe ich denn jetzt noch übersehen? ------------------------------------------------------------------------------------------ Ein Teufelskreis: Kaum macht man es richtig,funktionierts! |
|||
17.07.2016, 09:09
Beitrag #4
|
|||
|
|||
RE: 4 Tasten für 4 Laufzeiten des gleichen Programms
Prüfe doch als erstes, ob die 4 Buttons überhaupt richtig erkannt werden.
Serial.print(buttonState1); Serial.print(buttonState2); Serial.print(buttonState3); Serial.println(buttonState4); Wenn das schonmal sauber reinkommt, kannst Du die Hardware schonmal als tauglich werten. Dann weiter in der letzen IF: Lass Dir die Parameter per Serial.Print() anzeigen. Jetzt kannst Du erkennen, welche Bedingung erfüllt wird und was das Programm macht. Wenn der Bildschirm zu schnell gefüllt wird, kannst Du den Programmablauf mit delay(500) etwas bremsen. Dann reagiert es natürlich auch deutlich langsamer, sollte klar sein. Jedenfalls kommst Du mit Serial.print schneller zum Ziel, als wenn Du hier den Code einstellst und darauf wartest, bis einer den Fehler findet. Binatone |
|||
17.07.2016, 12:30
Beitrag #5
|
|||
|
|||
RE: 4 Tasten für 4 Laufzeiten des gleichen Programms
Hallo Binatone,
danke für den Tipp - stimmt schon...mit den Infos, die im serial monitor dargestellt werden, kann man sich langsam rantasten. Also die Tasten wurden richtig eingelesen, und die LED fängt bei Tastendruck an zu leuchten, aber nur so lange die Taste gedrückt bleibt. Der Monitor zeigt die gewählte Zeitdauer, z.B. 3000 bei Taste 3 an, aber eine zeitrelevante Funktion startet nicht. Code: const int ledPin = 13; Noch ein weiteres Problem: Wie kann ich ausschließen, dass wenn dann mal die Zeitfunktion startet, dass die Funktion bis zum Zeitende durchläuft und ein erneuter Tastendruck die Zeitfunktion nicht wieder bei Null starten läßt? danke für Eure Tipps- ich lerne gerne dazu ![]() ------------------------------------------------------------------------------------------ Ein Teufelskreis: Kaum macht man es richtig,funktionierts! |
|||
17.07.2016, 14:52
(Dieser Beitrag wurde zuletzt bearbeitet: 17.07.2016 14:59 von Scheams.)
Beitrag #6
|
|||
|
|||
RE: 4 Tasten für 4 Laufzeiten des gleichen Programms
Hey!
Code: if (currentMillis - previousMillis >= interval){ Geh das hier nochmal genau Schritt für Schritt durch und überleg: 1. Durchlauf: Kein Taster gedrückt, Interval = 0, CurrentMillis = z.B. 1000, previousMillis = 0 If Abfrage = true -> led LOW 2. Durchlauf: Taster 1 gedrückt, Interval = 1000, CurrentMillis = 1050, previousMillis = 1000 If Abfrage = falsch -> led HIGH Wenn du weiter überlegst wird dieser 2. Durchlauf immer wiederholt, da previousMillis immer gesetzt wird, da es außerhalb der IF Schleife ist. Also irgendwas kann nicht stimmen. Ich habe dir schon ein Beispiel gegeben, wie soeine Millis Schleife aussehen kann (16.07.2016 17:30)Scheams schrieb: ...previousMillis wird IN der if Schleife gesetzt, nicht außerhalb! Beachte diese Millis-Schleifen WIEDERHOLEN sich nach jedem interval. Ich bin mir immer noch nicht sicher was die Funktion von dem Sketch sein soll. - ein/mehrere Taster drücken -> Interval wird gesetzt - LED leuchtet je nach Intervallänge, nachdem gedrückt wurde - Warten auf nächsten Tastendruck - Wenn während dem Leuchten gedrückt wird, wird die Leuchtdauer aktualisiert? Bitte kurz mal beschreiben/korrigieren ![]() Ansonsten müsstest du soetwas machen: Code: // Wenn Taster gedrückt wurde, wird interval gesetzt, somit ist interval > 0 == true mfg Scheams |
|||
17.07.2016, 15:54
Beitrag #7
|
|||
|
|||
RE: 4 Tasten für 4 Laufzeiten des gleichen Programms
Also ich denke, Dein "interval = 0;" steht ein paar Zeilen zu tief.
Solange Deine LED leuchtet, läuft die Zeitschleife. In dieser Zeit darf der Interval nicht verändert werden. Bestenfalls durch erneutes Drücken einer der drei Tasten. Binatone |
|||
18.07.2016, 14:45
Beitrag #8
|
|||
|
|||
RE: 4 Tasten für 4 Laufzeiten des gleichen Programms
Erfolsmeldung!
Mit einem Mix aus den Tipps von Scheams und Binatone (vielen Dank) hat es nun geklappt! Nur noch eine Frage: wie bekomme ich eine einmal gedrückte Tasteneingabe für weitere Tasteneingaben blockiert - außer einem zusätzlichen "Notstopp". jetzt ist es so, dass die Intervalle alle wie gewünscht laufen, wenn aber während des Intervallablaufes eine Taste gedrückt wird, wird die zeit quasi aufaddiert. Wie kann das verhindert werden? Code: const int ledPin = 13; ------------------------------------------------------------------------------------------ Ein Teufelskreis: Kaum macht man es richtig,funktionierts! |
|||
|
|
|
Möglicherweise verwandte Themen... | |||||
Thema: | Verfasser | Antworten: | Ansichten: | Letzter Beitrag | |
![]() |
Keine Verbindung via USB nach flashen des Programms | chaoscrack | 5 | 833 |
23.08.2016 14:58 Letzter Beitrag: hotsystems |
2 Tasten drücken damit licht angeht | tjard | 11 | 1.161 |
19.06.2016 12:24 Letzter Beitrag: hotsystems |
|
SainSmart 1602 LCD Keypad Shield Modul Display Tasten | Rossy | 20 | 5.470 |
08.08.2015 12:44 Letzter Beitrag: hotsystems |
|
Tasten prellen | StephanBuerger | 10 | 3.475 |
11.02.2015 10:11 Letzter Beitrag: Thorsten Pferdekämper |
|
Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten | Marlox | 42 | 12.552 |
28.12.2014 22:49 Letzter Beitrag: Marlox |
|
Start + Stop Tasten für Schrittmotor | Dortmunder85 | 3 | 11.680 |
27.08.2013 17:51 Letzter Beitrag: rkuehle |
Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste