Hallo ! Für einen UV-Platinenbelichter habe ich die im Bild "Timer.png" gezeigte Schaltung aus dem Internet aufgebaut. Den Code findet ihr in "Timer.txt". Leider versuche ich mir gerade erst entsprechende Programmierkenntnisse anzueignen. Den Anzeige-Text habe ich geändert, soweit sogut...doch für mein Problem habe ich keine Lösung. Grundsätzlich funktioniert die Schaltung, nur wenn ich den Start-Taster (zu lange) gedrückt halte bzw. ungünstig betätige, wird der Eingang am Relaiasmodul (LOW-Level-Trigger) nicht konstant LOW, dadurch ergibt sich das im Bild "Oszi.jpg" gezeigtes Signal. Folglich oszilliert das Relais und das Licht bleibt aus. Zeit High (5V) 116ms, Zeit Low 11,6ms. Manchmal geht es gleich, manchmal braucht es ein paar Versuche. Könnt ihr mir bitte helfen? Danke :-) Liebe Ostergrüße Mike
Nein, war im Schaltplan nicht vorgesehen. Ich dachte eher es wäre ein Softwareproblem...
Offensichtlich möchtest du hier etwas flankengetriggert ausführen. Wenn der Taster vom Zustand "losgelassen" in "gedrückt" wechselt, dann soll etwas passieren. In deinem Programmcode reagierst du jedoch nicht auf die Flanke, osndern auf den Zustand "ist gedrückt". Wenn du den Taster lange gedrückt hältst, dann wird das Programm immer wieder den Zustand "ist gedrückt" erkennen und die Aktion wiederholt ausführen. Du musst dein Programm so erweitern, dass es den aktuellen Zustand des Tasters mit dem letzten bekannten Zustand vergleicht. Nur wenn der Taster vorher nicht gerdrückt war, jetzt aber gedrückt ist, dann soll die Aktion durchgeführt werden.
Hallo Stefanus, danke für die Antwort. Genau wie du es beschreibst, so ist es. Kannst du mir bei dem Code helfen? Meine Programmierkentnisse reichen hier noch nicht aus...
Beitrag #5815418 wurde von einem Moderator gelöscht.
Ich entprelle meine Taster immer mit einen einfachen delay von 20-100ms je nach Taster und gut. Wird Taste A gedrückt wird Aufgabe A gemacht und dann je nachdem wie lange das dauert einfach bissel zeit vergehen lassen fertig. ZB void setup() { pinMode(2, INPUT_PULLUP); } void loop() { if (digitalRead(2) == LOW) { Augabe xyz delay(50); } FERTIG Die Seite Hängt Ganz schön oft heute ? Kann jemand den post darüber löschen ?
:
Bearbeitet durch User
Goliath schrieb: > DAVID B. schrieb: >> FERTIG > > So einfach? Das macht mich fertig. Nein, das ist humbug, da man keine Flankenerkennung hat und nicht wirklich eine Entprellung, die Zeit ist nicht definiert und variiert. Hier stehen die Grundlagen: https://www.mikrocontroller.net/articles/Entprellung Ich nutze diese Variante mit alle Patches als LunaAVR Code: Beitrag "Universelle Tastenabfrage"
Karl M. schrieb: > Nein, das ist humbug, Aber ich dachte doch wir sind fertig. DAVID B. schrieb: > FERTIG Mit delay kann man doch alles erschlagen. Fertig!
Stefanus F. schrieb: > Offensichtlich möchtest du hier etwas flankengetriggert ausführen. > > Wenn der Taster vom Zustand "losgelassen" in "gedrückt" wechselt, dann > soll etwas passieren. > > In deinem Programmcode reagierst du jedoch nicht auf die Flanke, osndern > auf den Zustand "ist gedrückt". Wenn du den Taster lange gedrückt > hältst, dann wird das Programm immer wieder den Zustand "ist gedrückt" > erkennen und die Aktion wiederholt ausführen. > > Du musst dein Programm so erweitern, dass es den aktuellen Zustand des > Tasters mit dem letzten bekannten Zustand vergleicht. Nur wenn der > Taster vorher nicht gerdrückt war, jetzt aber gedrückt ist, dann soll > die Aktion durchgeführt werden. Wie schon von Stefanus F. geschrieben, ist dies das einzig richtige Vorgehen! Wie das geht steht in den beiden Link, s.o. Mit einem Delay hat das nichts zu zum. I.A. sind Delays im Code böse.
Ein Beispiel:
1 | bool start_gedrueckt() |
2 | {
|
3 | static int vorher=HIGH; |
4 | int jetzt=digitalRead(startPin); |
5 | |
6 | // Hat sich der Status geändert?
|
7 | if (jetzt != vorher) |
8 | {
|
9 | // Einfaches Entprellen
|
10 | delay(20); |
11 | |
12 | vorher=jetzt; |
13 | |
14 | // Liefere true zurück,
|
15 | // wenn eine fallende Flanke erkannt wurde
|
16 | if (jetzt == LOW) |
17 | {
|
18 | return true; |
19 | }
|
20 | }
|
21 | return false; |
22 | }
|
Die Funktion liefert true zurück, wenn die Taste gerade gedrückt wurde und nicht schon vorher gedrückt war. Außerdem wartet sie ab, bis das Prellen der Kontakte (hoffentlich) aufgehört hat. Alternativ kann man die Tasten regelmäßig in einem Timer-Interrupt abfragen, dann entfällt das blockierende Warten. Ich denke, das Prinzip ist in dem bereits empfohlenen Artikel beschrieben.
Hallo, danke erstmal ! War nicht am PC, ich werde das mal nachvollziehen mit den Flanken. Klingt logisch. LG Mike
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.