Pages: [1] 2 3   Go Down
Author Topic: Einsteiger braucht Programmierhilfe  (Read 2509 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
God Member
*****
Karma: 2
Posts: 770
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
God Member
*****
Karma: 2
Posts: 770
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

- 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. smiley-wink

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:
  if (lastButtonState == LOW && debouncedButton() == HIGH) {
    flag = !flag; // Umschalten
  }
  lastButtonState = debouncedButton();
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 347
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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 Offline
Jr. Member
**
Karma: 0
Posts: 64
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Für Buttons benutze ich diese Bibliothek:

http://arduino.cc/playground/Code/Buttons

Funktioniert bei mir hervorragend!
Logged

twitter: @darktom

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bin ja echt begeistert wie schnell man hier Hilfe bekommt, komme ja kaum mit dem Probieren nach  smiley-lol, 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 Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Meinte natürlich Scetch von maverick1509
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 347
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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 Offline
Sr. Member
****
Karma: 2
Posts: 347
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

#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 Offline
Sr. Member
****
Karma: 2
Posts: 347
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das hat funktioniert der Code sieht jetz so aus
Code:
#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  smiley-grin
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 Offline
Sr. Member
****
Karma: 2
Posts: 347
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.html
Damit hat man also sowohl Öffner- als auch Schließerkontakt. Muss man eben immer schauen, was man denn braucht und was man bekommt... smiley-wink
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Pages: [1] 2 3   Go Up
Jump to: