Forum: Mikrocontroller und Digitale Elektronik Arduino-Nano: Relais schaltet nicht sicher bei gedrücktem Taster


von Mike (Gast)


Angehängte Dateien:

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

von Zeno (Gast)


Lesenswert?

Tsster entprellt?

von Mike (Gast)


Lesenswert?

Nein, war im Schaltplan nicht vorgesehen.
Ich dachte eher es wäre ein Softwareproblem...

von Stefan F. (Gast)


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.

von Mike (Gast)


Lesenswert?

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.
von DAVID B. (bastler-david)


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 ?

: Bearbeitet durch User
von Goliath (Gast)


Lesenswert?

DAVID B. schrieb:
> FERTIG

So einfach? Das macht mich fertig.

von Karl M. (Gast)


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"

von Goliath (Gast)


Lesenswert?

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!

von Karl M. (Gast)


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.

von Stefan F. (Gast)


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.

von Mike (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.