Ich verstehe zwar kaum was du meinst, du schreibst ziemlich wirr.
Aber ich nehme an daß du die steigende Flanke eines Digitaleingangs auswertest und eigentlich lieber die fallende Flanke auswerten willst.
Hallo zusammen,
ich habe einen Sketch nachgebaut, bei dem 8 Taster an den Ausgängen eine definierte Schaltzeit ausgeben (z.B. 400 msek), unabhängig davon, wie kurz oder wie lange ich einen jeweiligen Taster drücke. Das ganze funktioniert auch. Allerdings löst die Funktion erst dann aus, wenn ich den Taster wieder loslasse. Wenn ich den Taster z.B. 1 min drücke, passiert da gar nichts. Ich möchte aber gern, dass die Funktion genau dann auslöst, wenn ich den Taster runterdrücke (nicht erst dann, wenn ich ihn wieder loslasse).
Die Taster-Kontakte schliessen gegen GND, gegen Plus liegen jeweils Widerstände (Pull-Up).
Könnt Ihr mir bitte sagen, woran das liegt? Ist das im Programm begründet? Oder liegt das an der Beschaltung der Taster (Pull-Up oder besser Pull-Down)? Wie kann ich das ändern?
Andi
Ich verstehe zwar kaum was du meinst, du schreibst ziemlich wirr.
Aber ich nehme an daß du die steigende Flanke eines Digitaleingangs auswertest und eigentlich lieber die fallende Flanke auswerten willst.
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Weg zu einigen meiner Konstruktionen
Es ist so wie White_Fox bereits schrieb.
Du erkennst die steigende Flanke, du musst umstellen auf fallende Flanke. Das ist ein rein softwaretechnisches Problem. Poste den Code und den Plan.
MfG Hannes
Vielleicht bin ich am Thema vorbei, aber wenn Du den Taster nur entprellen willst, dann hilft dir vielleicht dieser Link: https://elektro.turanis.de/html/prj059/index.html
Es sind 8 PullUp-Widerstände, die fest an +5V anliegen, die jeweils damit verbundenen 8 Taster schliessen bei Tasterbetätigung gegen GND.
Hier ist der Sketch:
#include <ButtonDebounce.h>
#include <millisDelay.h>
//Establish output time
const unsigned long Debounce_Delay = 10;
const unsigned long Out_Delay = 400;
//Establish output pin numbers
int Out_1 = 11;
int Out_2 = 12;
int Out_3 = A0;
int Out_4 = A1;
int Out_5 = A2;
int Out_6 = A3;
int Out_7 = A4;
int Out_8 = A5;
//Establish ButtonDebounce instances
ButtonDebounce btn1(2,Debounce_Delay);
ButtonDebounce btn2(3,Debounce_Delay);
ButtonDebounce btn3(4,Debounce_Delay);
ButtonDebounce btn4(5,Debounce_Delay);
ButtonDebounce btn5(6,Debounce_Delay);
ButtonDebounce btn6(7,Debounce_Delay);
ButtonDebounce btn7(8,Debounce_Delay);
ButtonDebounce btn8(9,Debounce_Delay);
//Establish millisDelay instances
millisDelay Out1_Delay;
millisDelay Out2_Delay;
millisDelay Out3_Delay;
millisDelay Out4_Delay;
millisDelay Out5_Delay;
millisDelay Out6_Delay;
millisDelay Out7_Delay;
millisDelay Out8_Delay;
void setup()
{
//Establish buttonDebounce callbacks
btn1.setCallback(btn1_Changed);
btn2.setCallback(btn2_Changed);
btn3.setCallback(btn3_Changed);
btn4.setCallback(btn4_Changed);
btn5.setCallback(btn5_Changed);
btn6.setCallback(btn6_Changed);
btn7.setCallback(btn7_Changed);
btn8.setCallback(btn8_Changed);
//Set output pinouts
pinMode(Out_1,OUTPUT);
pinMode(Out_2,OUTPUT);
pinMode(Out_3,OUTPUT);
pinMode(Out_4,OUTPUT);
pinMode(Out_5,OUTPUT);
pinMode(Out_6,OUTPUT);
pinMode(Out_7,OUTPUT);
pinMode(Out_8,OUTPUT);
//Initialize outputs
digitalWrite(Out_1,LOW);
digitalWrite(Out_2,LOW);
digitalWrite(Out_3,LOW);
digitalWrite(Out_4,LOW);
digitalWrite(Out_5,LOW);
digitalWrite(Out_6,LOW);
digitalWrite(Out_7,LOW);
digitalWrite(Out_8,LOW);
}
void loop()
{
//Check output delays for completion
if (Out1_Delay.justFinished())
{digitalWrite(Out_1,LOW);}
if (Out2_Delay.justFinished())
{digitalWrite(Out_2,LOW);}
if (Out3_Delay.justFinished())
{digitalWrite(Out_3,LOW);}
if (Out4_Delay.justFinished())
{digitalWrite(Out_4,LOW);}
if (Out5_Delay.justFinished())
{digitalWrite(Out_5,LOW);}
if (Out6_Delay.justFinished())
{digitalWrite(Out_6,LOW);}
if (Out7_Delay.justFinished())
{digitalWrite(Out_7,LOW);}
if (Out8_Delay.justFinished())
{digitalWrite(Out_8,LOW);}
//Check buttons pressed
btn1.update();
btn2.update();
btn3.update();
btn4.update();
btn5.update();
btn6.update();
btn7.update();
btn8.update();
}
// ButtonDebounce callbacks
void btn1_Changed(int state)
{
if (state == HIGH)
{
digitalWrite(Out_1,HIGH);
Out1_Delay.start(Out_Delay);
}
}
void btn2_Changed(int state)
{
if (state == HIGH)
{
digitalWrite(Out_2,HIGH);
Out2_Delay.start(Out_Delay);
}
}
void btn3_Changed(int state)
{
if (state == HIGH)
{
digitalWrite(Out_3,HIGH);
Out3_Delay.start(Out_Delay);
}
}
void btn4_Changed(int state)
{
if (state == HIGH)
{
digitalWrite(Out_4,HIGH);
Out4_Delay.start(Out_Delay);
}
}
void btn5_Changed(int state)
{
if (state == HIGH)
{
digitalWrite(Out_5,HIGH);
Out5_Delay.start(Out_Delay);
}
}
void btn6_Changed(int state)
{
if (state == HIGH)
{
digitalWrite(Out_6,HIGH);
Out6_Delay.start(Out_Delay);
}
}
void btn7_Changed(int state)
{
if (state == HIGH)
{
digitalWrite(Out_7,HIGH);
Out7_Delay.start(Out_Delay);
}
}
void btn8_Changed(int state)
{
if (state == HIGH)
{
digitalWrite(Out_8,HIGH);
Out8_Delay.start(Out_Delay);
}
}
Wenn der Taster beim Drücken auf Low gezogen wird und Du auf das Low reagieren willst, ist es auch sinnvoll, in den Funktionen
(mit X= 1..8 )Code:void btnX_Changed(int state)-Funktionen
auf LOW zu prüfen
Code:if (state == LOW)
Danke für die Antwort und Korrektur, werde das heute Nachmittag ausprobieren
In diesem Fall bleibt es bei den PullUp-Widerständen. Das heisst, es liegt im Ruhezustand der Schaltung über diese PullUp-Widerstände zunächst immer HIGH an den Eingängen des Arduino an. Mit if (state == LOW) reagiert der ATMEL bzw. der Sketch auf die fallende Flanke.
Frage für mich zum Verständnis: Würde es dasselbe Resultat ergeben, wenn ich den Sketch so belasse, wie er ursprünglich war if (state == HIGH) , dafür aber die Widerstände beschalte als PullDown? Dadurch würde an den Eingängen im Ruhezustand zunächst immer LOW, und erst bei Tasterbetätigung HIGH anliegen. Das würde dem ursprünglichen Sketch und meinem Anliegen auch entsprechen, oder?
Also entweder PullUp und if (state == LOW) , oder PullDown und if (state == HIGH) ?
Andi
Zuerst einmal, bitte Code immer in Codetags schreiben, so wie es bei Holomino ist. Dadurch wird der Post lesbarer/übersichtlicher.
Bei diesem Code reagierst du mit dem "if (state=...)" auf eine Flanke sondern auf einen Zustand.
Ich weiß nicht welche Funktion du gerne hättest.
Abfrage mit "if (state=...)" reagierst du auf einen Zustand. Bei jedem Durchlauf des Programms wird der Status geprüft und angesprungen.
Bedeutet das jedes mal bei einem Low (wenn auf state==low geprüft wird) den jeweiligen Ausgang setzt.
Wenn du auf eine Flanke reagieren möchtest, benötigst du den aktuellen und den letzten Zustand. Die Flanke dauert genau einen Programmdurchlauf.
Hier in Pseudocode:
Zu deiner FrageCode:if (Status_aktuell==low && Status_alt==high) { Programm wird ausgeführt wenn fallende Flanke } Status_alt = Status_aktuell
Du kannst im Programm das high gegen ein low oder den Widerstand und den Taster tauschen. Ich verwende häufig (eigentlich immer wenn nötig) die internen Widerstände. Dadruch prüfe ich auf Low-Zustand.
MfG Hannes
Danke für die Antwort.
Betreffs "...immer in Codetags schreiben..." Ich weiss nicht, wie das gemacht wird (sorry)
Andi
Lesezeichen