Offline
Newbie
Karma: 0
Posts: 12
|
 |
« on: March 02, 2012, 04:44:25 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #1 on: March 02, 2012, 05:00:48 am » |
Mach Dich mal mit dem Thema "Debounce" oder "Entprellen" vertraut, z.B. hier.
|
|
|
|
|
Logged
|
|
|
|
|
Germany
Offline
Edison Member
Karma: 33
Posts: 1838
Arduino rocks
|
 |
« Reply #2 on: March 02, 2012, 05:04:37 am » |
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.
|
|
|
|
|
Logged
|
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #3 on: March 02, 2012, 05:10:06 am » |
- 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: if (lastButtonState == LOW && debouncedButton() == HIGH) { flag = !flag; // Umschalten } lastButtonState = debouncedButton();
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 0
Posts: 256
|
 |
« Reply #4 on: March 02, 2012, 05:15:45 am » |
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: #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; } }
|
|
|
|
« Last Edit: March 02, 2012, 05:17:17 am by maverick1509 »
|
Logged
|
|
|
|
|
Germany
Offline
Jr. Member
Karma: 0
Posts: 64
|
 |
« Reply #5 on: March 02, 2012, 05:30:32 am » |
Für Buttons benutze ich diese Bibliothek: http://arduino.cc/playground/Code/ButtonsFunktioniert bei mir hervorragend!
|
|
|
|
|
Logged
|
twitter: @darktom
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 12
|
 |
« Reply #6 on: March 02, 2012, 05:47:00 am » |
Bin ja echt begeistert wie schnell man hier Hilfe bekommt, komme ja kaum mit dem Probieren nach  , DANKE erstmal dafür. Der oder das Sketch (wie heisst es eigentlich richtig?) von Jr.Member funktioniert Klasse. Da meine Relais ja förmlich negiert schalten, bei OUTPUT LOW sind die auf HIGH, war nach dem übertragen des Codes das Relais immer gleich auf HIGH, habe das gelöst indem ich den Taster jetzt gegen GND schalte statt an 5V nun ist es beim Start oder nach Reset zuerst auf LOW. Werde gleich mal auf 3Relais erweitern und probieren und dann hätte ich ja schon meine erste Anforderung erfüllt. Danke für die Lösung der 1. Anforderung
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 12
|
 |
« Reply #7 on: March 02, 2012, 05:48:18 am » |
Meinte natürlich Scetch von maverick1509
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 0
Posts: 256
|
 |
« Reply #8 on: March 02, 2012, 05:56:21 am » |
beim zweiten könnte ich dir auch helfen wenn ichs denn verstehe. Ein Taster für 2 Relais, welche zeitversetzt an und ausgeschaltet werden sollen?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 12
|
 |
« Reply #9 on: March 02, 2012, 06:15:14 am » |
Ja bei der 2.Anforderung soll ein zeitlicher Ablauf wie oben beschrieben stattfinden aber eigentlich mit 4-5 Relais. Nochmal zu Deinem 1. Sketch, bin zu blöd den auf weitere Taster und Rlais zu erweitern, habs so probiert #define Taster1 10 #define Taster2 9 #define Taster3 8 #define Relais1 23 #define Relais2 22 #define Relais3 25 boolean Letzter, Aktuell, onoff; //--------------------------------------------------------------------------------- void setup(){ pinMode(Taster1, INPUT); pinMode(Taster2, INPUT); pinMode(Taster3, INPUT); pinMode(Relais1, OUTPUT); pinMode(Relais2, OUTPUT); pinMode(Relais3, OUTPUT); }
//--------------------------------------------------------------------------------- void loop(){ Letzter = Aktuell; if (digitalRead(Taster1) == HIGH ) Aktuell = true; else Aktuell = false; //auslesen des Tasters delay(10); if(!Letzter && Aktuell){ // reagiert auf Tasterwechsel von nicht gedrückt auf gedrückt if (onoff) digitalWrite(Relais1,LOW); else digitalWrite(Relais1,HIGH); onoff = !onoff; } { Letzter = Aktuell; if (digitalRead(Taster2) == HIGH ) Aktuell = true; else Aktuell = false; //auslesen des Tasters delay(10); if(!Letzter && Aktuell){// reagiert auf Tasterwechsel von nicht gedrückt auf gedrückt if (onoff) digitalWrite(Relais2,LOW); else digitalWrite(Relais2,HIGH); onoff = !onoff; } }
aber das will er nicht, bin halt neu und so einfach Copy Paste scheint es doch nicht zu sein, für ne kleine Hilfe wär ich dankbar
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 0
Posts: 256
|
 |
« Reply #10 on: March 02, 2012, 06:18:30 am » |
Das zweite kannst du auf die schnelle mal so testen: Ist allerdings nicht die "feine englische Art" da das Programm für 30 Sek in eine Prozedur springt. #define Taster 3 #define Relais2 5 #define Relais3 6
long start;
//--------------------------------------------------------------------------------- void setup(){ pinMode(Taster, INPUT); pinMode(Relais2, OUTPUT); pinMode(Relais3, OUTPUT); } //--------------------------------------------------------------------------------- void automatik(){ start=millis(); while ((millis()-start) < 30000){ digitalWrite(Relais2,HIGH); if (((millis()-start) > 5000) && ((millis()-start)) < 15000) digitalWrite(Relais3,HIGH); else digitalWrite(Relais3,LOW); } digitalWrite(Relais2,LOW); } //--------------------------------------------------------------------------------- void loop(){ if (digitalRead(Taster) == HIGH ) { delay(100); automatik(); } }
|
|
|
|
« Last Edit: March 02, 2012, 06:20:23 am by maverick1509 »
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 0
Posts: 256
|
 |
« Reply #11 on: March 02, 2012, 06:25:36 am » |
als erstes ist eine geschweifte Klammer "falsch herum" { Letzter = Aktuell;
und dann mußt dufür jeden Taster die Variablen deklarieren, (start1, start2,letzter1..., aktueller1...onoff1....) dann sollte es gehen.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 12
|
 |
« Reply #12 on: March 02, 2012, 07:05:20 am » |
Das hat funktioniert der Code sieht jetz so aus #define Taster1 10 #define Taster2 9 #define Taster3 8 #define Relais1 23 #define Relais2 22 #define Relais3 25 boolean Letzter, Aktuell, onoff; boolean Letzter1, Aktuell1, onoff1; boolean Letzter2, Aktuell2, onoff2; //--------------------------------------------------------------------------------- void setup(){ pinMode(Taster1, INPUT); pinMode(Taster2, INPUT); pinMode(Taster3, INPUT); pinMode(Relais1, OUTPUT); pinMode(Relais2, OUTPUT); pinMode(Relais3, OUTPUT); }
//--------------------------------------------------------------------------------- void loop(){ Letzter = Aktuell; if (digitalRead(Taster1) == HIGH ) Aktuell = true; else Aktuell = false; //auslesen des Tasters delay(10); if(!Letzter && Aktuell){ // reagiert auf Tasterwechsel von nicht gedrückt auf gedrückt if (onoff) digitalWrite(Relais1,LOW); else digitalWrite(Relais1,HIGH); onoff = !onoff; }
Letzter1 = Aktuell1; if (digitalRead(Taster2) == HIGH ) Aktuell1 = true; else Aktuell1 = false; //auslesen des Tasters delay(10); if(!Letzter1 && Aktuell1){ // reagiert auf Tasterwechsel von nicht gedrückt auf gedrückt if (onoff1) digitalWrite(Relais2,LOW); else digitalWrite(Relais2,HIGH); onoff1 = !onoff1; } Letzter2 = Aktuell2; if (digitalRead(Taster3) == HIGH ) Aktuell2 = true; else Aktuell2 = false; //auslesen des Tasters delay(10); if(!Letzter2 && Aktuell2){ // reagiert auf Tasterwechsel von nicht gedrückt auf gedrückt if (onoff2) digitalWrite(Relais3,LOW); else digitalWrite(Relais3,HIGH); onoff2 = !onoff2; } }
und es klappt super mit 3Tastern und 3Relais, weiss jetzt wie ich das richtig erweitere. DANKE  Hab jetzt leider keine Zeit mehr um die Automatik zu probieren, erst am Montag wieder. Wichtig wäre noch zur Automatik zu sagen das z.T. die gleichen Relais wie mit den Tastern geschaltet werden sollen.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 0
Posts: 256
|
 |
« Reply #13 on: March 02, 2012, 07:20:06 am » |
noch was zu deiner Relaiskarte, so eine hatte ich auch mal. Ich finde die äußerst "blöd", wie kann man eine Relaiskarte bauen, die ständig unter Strom steht, alle Pins müssen immer auf "HIGH" sein und sind auf "LOW", wenn das Relais anzieht. Vielleicht kann mir ja einer erklären, warum das so gemacht wird, ich versteh es nicht.
|
|
|
|
|
Logged
|
|
|
|
|
Germany
Offline
Edison Member
Karma: 33
Posts: 1838
Arduino rocks
|
 |
« Reply #14 on: March 02, 2012, 07:36:01 am » |
Um welche Relaisplatine handelt es sich denn? Viele Relais haben ja einen Umschaltkontakt, in diesem Produkt sind diese Umschalter als 3 poliger Anschluss (pro Relais) herausgeführt: http://www.exp-tech.de/product_info.php?info=p201_12v-16-channel-relay-shield.htmlDamit hat man also sowohl Öffner- als auch Schließerkontakt. Muss man eben immer schauen, was man denn braucht und was man bekommt... 
|
|
|
|
|
Logged
|
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8
|
|
|
|
|