Go Down

Topic: Programm mit Schalter und LED (Read 2805 times) previous topic - next topic

ardi

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ß

lgrube96

#1
Jan 10, 2013, 07:51 pm Last Edit: Jan 10, 2013, 07:57 pm by lgrube96 Reason: 1
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 :)

mkl0815

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.  :D

lgrube96

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

ctrick

Code: [Select]
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

mkl0815

@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.

lgrube96

@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  :smiley-mr-green: ;)

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

Tobias93

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

Quote

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;
  }
}
Nobody is perfect but - impossible is nothing

lgrube96

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

Tobias93

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;
  }
}
Nobody is perfect but - impossible is nothing

Tobias93

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.
Nobody is perfect but - impossible is nothing

uwefed

#11
Jan 10, 2013, 08:29 pm Last Edit: Jan 10, 2013, 08:31 pm by uwefed Reason: 1
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

Tobias93

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??  :smiley-roll-sweat:

Gruß,
Tobi
Nobody is perfect but - impossible is nothing

uwefed

Quote
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

ardi

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;
}
}

Go Up