Hallo zusammen,
ich bin Anfänger und sitze bei folgendes fest:
Ich hab 3 Taster und 1 LED , wenn ich Taster betätige soll die LED an und beim erneuten betätigen aus gehen bei jedem Taster. Wie stelle ich das an?
danke im vorraus
Hallo zusammen,
ich bin Anfänger und sitze bei folgendes fest:
Ich hab 3 Taster und 1 LED , wenn ich Taster betätige soll die LED an und beim erneuten betätigen aus gehen bei jedem Taster. Wie stelle ich das an?
danke im vorraus
Hast du Probleme damit dass es 3 Taster sind, oder musst du lernen, Zustandswechsel zu erkennen und von Prellen zu unterscheiden?
hallo,
Zustandswechsel zu erkennen und die Taster zu Enprellen, so das sich die LED sauber schalten lässt.
Hallo androfreak
Herzlich Willkommen im besten Ardino forum der Welt ![]()
Wofür wird das Arduinoprogramm benötigt?
Du willst Wechselschaltung bauen? (S Sind Deine Tastern)
S1 LED an
S2 LED aus
S3 Led an
S1 LED AUS
Für die Taster würde ich einen Zustandsautomaten verwenden. Hier hab ich letztens einen gezeichnet:
Da du den Zustand "Lang halten" nicht brauchst kannst du die etwas vereinfachen.
Jeder Taster bekommt einen eigenen Zustandsautomaten.
Beim Wechsel von Debounce -> Pressed schaltest du die LED um.
Du kannst auch alle 3 Taster auf einen Pin legen
hallo zusammen,
danke erstmal für die antworten und eure Geduld.
Die Taster sollen als ganz normale "Schalter" genutzt werden:
Taster 1 drücken LED schaltet sich ein (bleibt auch eingeschaltet) und Taster 1 wieder drücken und die LED geht wieder aus.
Bei den anderen beiden Schalter genau so.
Quasi eine "Selbsthaltung"
Diese Sache dient für mich zur Übung um da besser reinzukommen.
danke im vorraus
Schau mal hier, letzter Beitrag ![]()
Musst nur für dich anpassen.
Wäre es dann nicht besser, selbst etwas zu programmieren.
Bei Problemen kannst du dann jederzeit hier nachfragen.
Ich glaube ja eher, dass das eine Hausaufgabe ist.
#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>
using Counter = Combie::Tools::Counter<byte>;
using Leuchte = Combie::Pin::OutputPin<13>;
class Task
{
public:
virtual void init() = 0;
virtual void run() = 0;
};
template<byte pin>
class Taster : public Task
{
private:
using TasterPin = Combie::Pin::TasterGND<pin>;
Counter &counter;
Combie::Timer::EntprellTimer entprell;
Combie::Tools::FlankenErkennung flankenerkennung;
public:
Taster(Counter &counter): counter{counter} {}
virtual void init(){ TasterPin {} .initPullup();}
virtual void run() { counter = flankenerkennung = entprell = TasterPin {};}
};
Counter counter;
Task *tasks[]
{
new Taster<3>{counter},
new Taster<4>{counter},
new Taster<5>{counter},
};
void setup()
{
Leuchte{} .init();
for(Task *t : tasks) t->init();
counter.onCount( [](Counter &) { Leuchte{} .toggle();} );
}
void loop()
{
for(Task *t : tasks) t->run();
}
Das Programm wirkt wie eine Kreuz- Wechselschaltung, nur halt mit Tastern, anstatt Schaltern.
https://forum.arduino.cc/uploads/short-url/vEnAEdFu5uuWiUElCRrkLAbc2Xc.zip
so hab ich das mit 1 Taster gemacht:
int led=8; //led an pin 8
int taster=4; //taster an pin 4
int i=0; //variabel
void setup(){
pinMode(taster, INPUT); //taster als eingang schalten (hardware pullup)
pinMode(led, OUTPUT); //Led als ausgang schalten
}
void loop(){
if (digitalRead(taster)==HIGH){ // prüfen ob taster gedrückt wurde
if(i==1){ //vergleich operator
i=0; //falls i schon auf 1 setze auf 0
}else{ //ansonsten
i=1; //setze auf 1
}
digitalWrite(led,i); //led dementsprecht der variabel schalten i
delay(500); //warte 500 ms
}
}
und jetzt meine Frage wie baue im code die anderen Taster ein?
Hmm... das flackert das wenn du den Schalter gedrückt hälst?
Du kannst natürlich den Code zum Abfragen des Tasters 3 mal schreiben:
void loop() {
if (digitalRead(taster1) == HIGH) {
if (i == 1) {
i = 0;
} else {
i = 1;
}
}
if (digitalRead(taster2) == HIGH) {
if (i == 1) {
i = 0;
} else {
i = 1;
}
}
if (digitalRead(taster3) == HIGH) {
if (i == 1) {
i = 0;
} else {
i = 1;
}
}
digitalWrite(led, i);
delay(500);
}
na dann fang mal mit einem Arduino Beispiel an: State Change Detection
https://docs.arduino.cc/built-in-examples/digital/StateChangeDetection/
Wenn du damit zufrieden bist, legst du alle Taster auf den Pin D4.
Ich rate von solchen Konstruktionen ab.
Denn if ist kontrollflussorientiert, aber wir haben es hier mit Daten zu tun.
Somit ist der Daten orientierte ternäre Operator dem Problem angemessener
Also, sollte das aus meiner Sicht eher so sein:
i=i==1?0:1;
(PS: Ich mag if nicht sonderlich)
Ja das ist richtig Technisch könnte ich die alle Taster Parallel zu pin 4 schalten, aber ich möchte das das verstehen was genau wenn was wie passiert. Könnte ja auch sein das ich später 3 Taster auf pin 3,5,7 z.B haben muss.Es geht mir mir nur um das verstehen.
Könnte man den code für die 3 Taster z.B kürzer schreiben um die übersicht zu bewahren oder wenn ich z.B Verschiedene pins mit Taster ansteuern möchte? wie @Rintin schon geschrieben hat code für jeden Taster neu schreiben.
Code Duplikate macht man eigentlich nicht!
In #11 habe ich es in einer Klasse zusammengefasst und 3 mal instanziiert.
So, oder so ähnlich würde ich dir das auch empfehlen.
ja das kann man.
Mach mal einen sauberen Sketch für einen Taster und dann zeigen wir dir, wie man das komfortabel für 3 macht.
Wenn du deinen Sketch mit STRG-T formatierst wird das sicher noch übersichtlicher.