Go Down

Topic: Einsteiger braucht Programmierhilfe (Read 3 times) previous topic - next topic

keraino

Hallo, ich würde mir gern eine kleine Steuerung aufbauen. Die Hardware habe ich (Arduino Mega und eine 16 Kanal Relaiskarte) beide sind schon verbunden und funktionieren auch technisch. Mit dem Anfänger Sketch "Blink" alle Relais schon einmal ausprobiert. Nur das die Relais auf OUTPUT LOW anziehen und auf HIGH abfallen, das ist aber kein Problem denke ich, muss man halt umdenken.
Nur am programmieren haperts jetzt bei mir.
Ich bräuchte folgende eigentlich simple Funktionen:

1.Anforderung:
Taster 1 gedrückt - Relais 1 schaltet an und bleibt an bis man Taster 1 ein weiteres mal drückt Taster 1 erneut drücken - Relais 1 schaltet wieder an... usw, also Taster als Schalter sozusagen. Das kann man denn ja kopieren für Taster 2 -Relais 2 u.s.w.
Habe in den Beispielsketches immer nur Taster gedrückt LED an, Taster loslassen LED aus gefunden.

2.Anforderung
Taster Automatik soll einen Zeitlichen Ablauf starten.
Taster Automatik drücken Relais 2 schaltet,hält für ca 30s fällt dann ab, Relais 3 schaltet nach 5s
hält dann für 10s und fällt dann ab. Das ganze auf weitere Relais, wenn man das Grundprinzip weiss kann man es ja erweitern.
Wichtig wäre nur das der Ablauf immer bis zum Ende ausgeführt wird, egal ob man den Automatiktaster zwischendrin betätigt und das der Ablauf immer am Anfang startet.

Für eure Programmiertipps wäre ich sehr dankbar.

Joghurt

Mach Dich mal mit dem Thema "Debounce" oder "Entprellen" vertraut, z.B. hier.

sth77

Immer Schritt für Schritt vorgehen, daher erst einmal die Vorgehensweise für die erste Anforderung:
Um es möglichst übersichtlich und den Quellcode leicht verständlich zu gestalten, solltest ein sogenanntes Flag setzen, wenn der Taster gedrückt wird. Das ist eine einfache Variable, die den Zustand High bzw. Low annehmen kann, meinetwegen auch 1 oder 0. Dann ist die Abfolge (also die loop) in etwa so:

- wenn Taster gedrückt und Flag ist 0 dann setze Flag auf 1
- wenn Taster gedrückt und Flag ist 1 dann setze Flag auf 0
- wenn Flag auf 1 steht: Relais anschalten
- wenn Flag auf 0 steht: Relais ausschalten

Taster sollte man zusätzlich noch entprellen, wie Joghurt bereits anmerkte.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Joghurt


- wenn Taster gedrückt und Flag ist 0 dann setze Flag auf 1
- wenn Taster gedrückt und Flag ist 1 dann setze Flag auf 0

...wobei darauf zu achten ist dass das Flag nur ein Mal pro Tastendruck umgesetzt wird, daher auch die Sache mit dem Debounce. ;)

Das kannst Du realisieren, indem Du Dir am Ende der Schleife den Zustand des (entprellten) Tasters merkst, und das Flag nur umsetzt, wenn der Taster "an" ist und der Gemerkte Zustand "aus" anzeigt.

Was in der Richtung:
Code: [Select]

  if (lastButtonState == LOW && debouncedButton() == HIGH) {
    flag = !flag; // Umschalten
  }
  lastButtonState = debouncedButton();

maverick1509

#4
Mar 02, 2012, 11:15 am Last Edit: Mar 02, 2012, 11:17 am by maverick1509 Reason: 1
wie schon die Vorgänger geschrieben haben must du dich mit entprellen beschäftigen.
Für den Anfang geht es so, das delay(100) ist im Moment für das Entprellen da, aber so kannst du das mal testen:
Code: [Select]

#define Taster 3
#define Relais1 4  
boolean Letzter, Aktuell, onoff;
//---------------------------------------------------------------------------------
void setup(){
pinMode(Taster, INPUT);
pinMode(Relais1, OUTPUT);
}

//---------------------------------------------------------------------------------
void loop(){
Letzter = Aktuell;
if (digitalRead(Taster) == HIGH ) Aktuell = true; else Aktuell = false; //auslesen des Tasters
 delay(100);
 if(!Letzter && Aktuell){ // reagiert auf Tasterwechsel von nicht gedrückt auf gedrückt
  if (onoff)
    digitalWrite(Relais1,HIGH);
   else  
    digitalWrite(Relais1,LOW);
 onoff = !onoff;
}
}

Go Up