Arduino-Nano: Relais schaltet nicht sicher bei gedrücktem Taster

Gast #5815296
Lesenswert?

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
Angehängte Dateien:
Gast #5815309
Lesenswert?

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.
Beitrag #5815418 wurde von einem Moderator gelöscht.
#5815421
Lesenswert?

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 ?
Gast #5815452
Lesenswert?

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"
Gast #5815521
Lesenswert?

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.
Gast #5815531
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren