Programm mit Schalter und LED

Hallo,
ich habe vor ein Programm zu schreiben dass wenn ich 5 mal auf einen Schalter gedrückt habe eine LED angeht.
Wie kann ich das machen? (Code)
Danke und Gruß

Hallo,

also ich würde es so lösen, du nimmt einfach ein Variable die jedes mal, wenn man den Button drückt 1
addiert. Und dann prüfst du halt wann die Variable den Wert 5 hat und schaltest die LED ein.

Grüße
Lorenz

EDIT: Du brauchst dann noch eine Variable die jeweils true speichert wenn du den Button drückst und false wenn du den Button wieder los lässt! Und du prüfst dann immer ob die variable auf true ist.
Hoffe du verstehst das so wie ich das meine ?!

Und denk nicht das jemand alles für dich macht ! Habe ich auch schon so gelernt :slight_smile:

Nimm Dir das Beispiel "Datei -> Beispiele -> Digital -> Button" oder "Datei -> Beispiele -> Digital -> Debounce" als Basis und erweitere den Code um eine Variable die zählt wie oft der Button gedrückt wurde. Wenn der Zähler 5 erreicht hat, dann schalte die LED ein.
Wieso glaubst Du, das Dir jemand den Code dafür schreibt? Ein wenig selbst mitmachen ist durchaus erwünscht. :smiley:

@mkl0815: Ja ok, daran habe ich jetzt gar nicht gedacht :expressionless:
Das ist natürlich am einfachsten !

int speicher = 0;
int zustand = 0;
int LED = 13;
int Schalter = 12;

void setup(){
  
  pinMode(LED,OUTPUT);
  pinMode(Schalter,INPUT);
  digitalWrite(Schalter,LOW);
}

void loop(){
  
  zustand = digitalRead(Schalter);
  if(zustand == HIGH){
    speicher = speicher+1;
  }
  if(speicher==5){
    digitalWrite(LED,HIGH);
  }
  if(speicher==6){
    digitalWrite(LED,LOW);
    speicher = 0;
  }
}

Und so würde sie erst bei einem erneuten drücken (6. druck) wieder ausgehen.. Danach kannst du wieder 5 mal drücken,
bis sie angeht.. Code basiert auf meinem Vorposter

@ctrick: Dein Code wird kaum funktionieren, obwohl er eigentlich genau das gewünschte macht. Das Problem ist die Geschwindigkeit mit der Dein Arduino arbeitet. Wenn Du den Button nur eine halbe Sekunde drückst, ist der Arduino schon tausende Male durch die loop() gerannt und hat die Variable zig Mal bis 5 gezählt und wieder auf 0 gesetzt.
Man sollte schon zwischendrin schauen, ob der Taster wieder losgelassen wurde.

Unabhängig davon hatte es einen Grund das wir in diesem Thread keinen Code gepostet haben. Hier geht es nämlich auch um selbst lernen, vor allem bei einfachen Aufgaben. Wenn jemand seinen Code postet, auch wenn er nicht funktioniert, bekommt er hier immer Hilfe und Tipps was man ändern / anpassen muss. So lernt man nämlich viel besser als wenn einem nur direkt die Lösung präsentiert wird.
Mario.

@ctrick: wie mkl0815 sagt, wird dein Sketch nicht wirklich funktionieren außer du drückst für wenige millisekunden den Taster, welches sehr unmöglich ist !
Wie ich bereits erwähnt habe muss vorher geprüft werden ob der Taster wieder losgelassen wurde !
Dafür benötigt man noch eine zusätzlich Variable die halt den Zustand des Tasters speichert!

Und so wie du vorgehst (ctrick), einfach einen Sketch zu posten, macht wenig sinn für einen Anfänger !
Learning by doing ! nicht learning by copying :grin: :wink:

Sorry mkl0815 das ich eigentlich genau das gleiche schreibe wie du :confused:

Das wäre mein Vorschlag, ich habe ihn allerdings nicht Testen können da mein Board in der Firma liegt. Wäre aber dankbar für ein Feedback.
Gruß,
Tobi

boolean speicheran = LOW;
boolean speicheraus = LOW;
int AnzahlANschalten = 0;
int AnzahlAUSschalten = 0;
boolean zustand = LOW;
int LED = 13;
int Schalter = 12;

void setup(){

pinMode(LED,OUTPUT);
pinMode(Schalter,INPUT);
digitalWrite(Schalter,LOW);
}

void loop(){

zustand = digitalRead(Schalter);
if(zustand == HIGH){
AnzahlANschalten = AnzahlANschalten + 1;
while(speicheraus = LOW){
zustand = digitalRead(Schalter);
if(zustand = LOW){
AnzahlAUSschalten = AnzahlAUSschalten + 1;
speicheraus = HIGH;
}
}
}
if(AnzahlANschalten - AnzahlAUSschalten == 0){
digitalWrite(LED,HIGH);
delay(2000);
digitalWrite(LED,LOW);
AnzahlAUSschalten = 0;
AnzahlANschalten = 0;
zustand = LOW;
speicheran = LOW;
speicheraus = LOW;
}
}

Soweit ich den Sketch mal überflogen habe, ist dort nichts mit 5 mal drücken und dann LED an ?!
Oder soll der Code etwas anderes können ?

Grüße
Lorenz

nächster Versuch:

boolean speicheran = LOW;
boolean speicheraus = LOW;
int AnzahlANschalten = 0;
int AnzahlAUSschalten = 0;
boolean zustand = LOW;
int LED = 13;
int Schalter = 12;

void setup(){

pinMode(LED,OUTPUT);
pinMode(Schalter,INPUT);
digitalWrite(Schalter,LOW);
}

void loop(){

zustand = digitalRead(Schalter);
if(zustand == HIGH){
AnzahlANschalten = AnzahlANschalten + 1;
while(speicheraus = LOW){
zustand = digitalRead(Schalter);
if(zustand = LOW){
AnzahlAUSschalten = AnzahlAUSschalten + 1;
speicheraus = HIGH;
}
}
}
if(AnzahlANschalten == 5 && AnzahlAUSschalten == 5){
digitalWrite(LED,HIGH);
delay(2000);
digitalWrite(LED,LOW);
AnzahlAUSschalten = 0;
AnzahlANschalten = 0;
zustand = LOW;
speicheran = LOW;
speicheraus = LOW;
}
}

je nachdem wie man will kann man das auch abändern das die led schon angeht wenn der Taster zum 5. mal gedrückt wird aber nach dem 5. druck noch nicht losgelassen wurde.

ctrick und Tobias93
Für viele von uns ist ein Sketch, der das gewünschte macht, eine Fingerübung von 5 Minuten, vieleicht weniger Aufwand als diese Antwort zu schreiben.
Aber, wie meine Vorredner bereits sagten, am meisten lernt man wenn man die Idee wie machen bekommt und dann selbst sein Hirn anstrengen muß, einen lauffähigen Sketch zu bekommen.

@Tobias93
Dein erster Sketch macht auch nicht das gewünschte; das Led geht für 2 Sekunden an und dann wieder aus und in dieser Zeit kann werden die Tastendrücke ignoriert.

"AnzahlANschalten - AnzahlAUSschalten == 0" ist immer wahr auch wenn gar keine Taste gedrückt wurde.
Es wird nicht kontrolliert ob 5 Tastendrücke gemacht wurden.

Lassen wir ardi's Hirn auch etwas arbeiten und helfen ihm gegebenenfalls Fehler aus seinem Sketch zu finden.

Grüße Uwe

hey,

ich geb dir da völlig recht uwe, seh ich genau so mit dem Lerneffekt und dem kopieren. Nur eine Frage, funktioniert mein zweiter Sketch?? :cold_sweat:

Gruß,
Tobi

Nur eine Frage, funktioniert mein zweiter Sketch??

Diese Frage werde ich nicht öffentlich beantworten da ich ansonsten ardi eine Antwort gebe, ob er den Sketch verwenden kann oder er (wenigstens) kontrollieren muß, ob der Sketch funktioniert.

Und zur Beruhigung Deiner Neugier: Der Sketch funktioniert nicht. Es sind einige banale Fehler drin.

Grüße Uwe

int zaehler = 0;
void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(13, OUTPUT);
}
void loop() {
boolean schalter = false;
while ( schalter == false)
{
schalter = digitalRead(2);
}
zaehler++;
Serial.println(zaehler, DEC);
if (zaehler == 5) {
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
zaehler = 0;
}
}

Also Leute ich komme nicht drauf weil ich in while und so nicht so geübt bin. Diesen Sketch habe ich mit hilfe von Jemand anderem gemacht aber das Funktioniert nicht. Könntet ihr mir einfach den Sketch sagen daraus kann ich dann lernen.

hallo ardi

boolean schalter = false;
while ( schalter == false)

so geschrieben entspricht das einem

while(1)

weil durch die Deklaration in der vorhergehenden Zeile die Variable "schalter" immer false ist und die while-Bedingung immer wahr ist.

zaehler++;

liegt außerhalb der while Schleife und wird deshalb bei jedem Durchlauf des Loop erhöht unabhängig von der Tasterbetätigung.

Sieh Dir mal dieses Beispiel an wie dort ein LEd durch Tasterdruck ein bzw Ausgeschaltet wird.

Grüße Uwe

Das weiß ich schon und ich kann auch schon die grunddinge mit if und so aber mir ist der syntax dann nicht klar

ardi:
Das weiß ich schon und ich kann auch schon die grunddinge mit if und so aber mir ist der syntax dann nicht klar

Welche Syntax?

Ja wie man das genau schreibt, klingt einbischen doof :slight_smile: aber ich meine das geanue Komma und wann man was einsetzt