Arduino Taster als Schalter

#6433969
Lesenswert?

Guten Abend miteinander,

Ich möchte gerne einen Taster der mit meinem Arduino verbunden ist, als 
Schalter verwenden - 1. Drücken Einschalten... 2. Drücken Ausschalten 
usw. Nun habe ich im Internet mal gesucht und auch etwas gefunden, 
jedoch ist es für mein Programm auch Wichtig, dass es OHNE delay 
funktioniert. Da aber alle vorlagen, die ich gesehen habe, einen delay 
verwenden, wollte ich fragen, ob ihr schon so etwas Programmiert habt 
oder ob ihr einen Lösungsvorschlag hättet?

Beste Grüsse

fasaso
#6433995
Lesenswert?

Sollte so gehen. Ohne Gewähr auf Fehlerfreiheit es ist spät :D
Falls es mehrere Taster gibt kann man die Funktionen ggf. um einen 
Parameter erweitern und so dieselbe Funktion für alle Taster nutzen, die 
States müsste man dann in ein Array o.ä. speichern.
1
#define buttonPin 1
2
#define prellTime 250
3

4
bool switchState = 0;
5
int prell = 0;
6

7
void switchActiveHigh(){
8
  if(prell < millis()){
9
    if(digitalRead(buttonPin)){
10
      switchState != switchState;
11
      prell = millis()+prellTime;
12
    }
13
  }
14
}
15

16
void switchActiveLow(){
17
  if(prell < millis()){
18
    if(!digitalRead(buttonPin)){
19
      switchState != switchState;
20
      prell = millis()+prellTime;
21
    }
22
  }
23
}
24

25
void setup() {
26
  // put your setup code here, to run once:
27
   pinMode(buttonPin, INPUT_PULLUP);  //ggf INPUT
28
}
29

30
void loop() {
31
  // put your main code here, to run repeatedly:
32
  switchActiveLow();
33
}
#6434859
Lesenswert?

Kevin M. schrieb:
> Sollte so gehen. Ohne Gewähr auf Fehlerfreiheit es ist spät :D
> Falls es mehrere Taster gibt kann man die Funktionen ggf. um einen
> Parameter erweitern und so dieselbe Funktion für alle Taster nutzen, die
> States müsste man dann in ein Array o.ä. speichern.
>
1
> void switchActiveHigh(){
2
>   if(prell < millis()){
3
>     if(digitalRead(buttonPin)){
4
>       switchState != switchState;
5
>       prell = millis()+prellTime;
6
>     }
7
>   }
8
> }
9
> 
10
> void switchActiveLow(){
11
>   if(prell < millis()){
12
>     if(!digitalRead(buttonPin)){
13
>       switchState != switchState;
14
>       prell = millis()+prellTime;
15
>     }
16
>   }
17
> }
18
> 
19
> void setup() {
20
>   // put your setup code here, to run once:
21
>    pinMode(buttonPin, INPUT_PULLUP);  //ggf INPUT
22
> }
23
> 
24
> void loop() {
25
>   // put your main code here, to run repeatedly:
26
>   switchActiveLow();
27
> }
28
>

für was ist void switchActiveHigh() oder wo wird sie aufgerufen?

Danke für die Vorlage!

Grüsse
#6435006
Lesenswert?

Das kommt drauf an ob dein Taster eine Pull Up hat und gegen Low zieht 
(active low) oder einen high Pegel schaltet ( active high). Ich habe den 
Pin mit Input Pullup initialisiert und gehe davon aus, dass der Taster 
nach GND zieht deshalb die active low Funktion...

Was du hast weiß ich ja nicht.
#6435491
Lesenswert?

Peter D. schrieb:
> Das Beispiel von Kevin enthält übrigens den 49,7 Tage Bug. Nur
> Differenzen stimmen immer.

Das ist kein Bug sondern einfach ein systembedingtes Fehlverhalten was 
ich toleriert habe. Nichts gegen Fasaso und ich mag mich auch irren aber 
es wirkt auf mich so als ob er nicht sehr tief in der Materie drin 
steckt. Ich glaube kaum das er eine Loop hat die ewig braucht noch das 
das Board ewig am Stück läuft. Mein Beispiel ist wie gesagt eine 
Möglichkeit die kurz und einfach ist. Natürlich ist ein Input Capture 
oder eine external Interrupt die elegantere Variante. Aber ganz ehrlich 
für die meisten Sachen ist es Overkill und man kann meinen Code durchaus 
so anpassen, dass das Problem mit millis nicht Auftritt. Nur wenn jemand 
schon Hilfe braucht um einen Taster derart anzufragen und nicht den 
Unterschied zwischen active high und low kennt sollte man vielleicht 
nicht gleich mit einem Timer kommen. Wie gesagt vielleicht tu ich ihm 
auch unrecht, ist nur mein Eindruck.
#6435523
Lesenswert?

Fängst du hier jetzt eine Grundsatzdiskussion an?

Frag 10 Leute und sie haben 10 Meinungen....

Ich mach es in der Regel bei einem einfachen Taster immer mit Abfrage in 
der Loop, wenn dein Programm dafür zu lange braucht ist eh was 
schiefgelaufen. Es gibt aber durchaus Fälle wo auch ein external 
Interrupt sinnvoll sein kann, wenn es z.B. auf präzises Timing ankommt……
#6436858
Lesenswert?

Ich rede mich jedenfalls nicht damit heraus, daß die Arduino-Umgebung 
daran schuld sei.
Nur weil die W95/W98 Programmierer diesen Bug gemacht haben, muß man ihn 
lange noch nicht nachmachen. Aus Fehlern sollte man lernen und nicht die 
beleidigte Leberwurst spielen.

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