Arduino Uno an 4 Fach Relais

Hallo zusammen,
ich bin nun seit 5 Tagen, in Vollzeit, am Grübeln und ausprobieren wie ich meine Schaltung in den Griff bekomme. Da ich mich erst seit dieser Zeit mit dem Arduino und seiner Programmierung beschäftige habe ich schnell meine Grenzen aufgezeigt bekommen. Viele von euch werden das Programm in kürzester Zeit geschrieben haben und ich sitze bis Silvester noch da. Also bitte ich euch mir zu helfen.
Folgendes Programm möchte ich verwenden:
• Steuerung bestromt= keine Aktion;
• Über Tastendruck = Relais 1 für 10 min einschalten; LOW; LED leuchtet 10min. mit bis Ende;
• Nach 30 sek. Umpolung = Relais2 + 3 gleichzeitig einschalten; LOW
• Nach 30 sek. Umpolung = Relais2 + 3 gleichzeitig ausschalten; HIGH
• Das Ganze 10x, bis die 10 min abgelaufen sind;
• Ende
Sieht so einfach aus aber ich beiße mir die Zahne aus.
Ein Bild als Anhang ist dabei. Die Wechselschaltung, auf der Hochstromseite, über die drei Relais, habe ich im Griff, es geht mir nur um das Ansteuern der Relais mit einem Taster.
Sketch will ich erst gar nicht posten weil dieser nur bis zum ersten Schalten des Relais1 funktioniert. Ich danke euch schon jetzt für euren Einsatz. Am besten wäre es,wenn Ihr mir einen Link zu einem bestehenden Sketch geben könntet oder das Programm schreibt.

Arduino1.jpg

kerzerl: ich bin nun seit 5 Tagen, in Vollzeit, am Grübeln und ausprobieren wie ich meine Schaltung in den Griff bekomme.

Dann hast du dir sicher nicht die Beispiele in der IDE (Datei - Beispiele) angesehen !

Da findest du alles zu deinen Fragen.

Und was meinst du mit "Nach 30 sek. Umpolung" ?

Wenn du deinen Sketch nicht zeigen willst, kann dir keiner helfen.

Es schreib dir keiner einen Sketch, aber viele können dir bei deinem Sketch helfen.

Wichtig sind auch Links zu den verwendeten Teilen.

Hallo HotSystems, ja das wahre super wenn mir einer den Sketch schreiben könnte. Dem würde ich sogar was spenden, hätte ich kein Problem damit. Stell dir mal vor, wie viel Zeit von Dir und anderen dabei draufgeht, wenn ich als Vollpfosten alles erfragen muss. Da bietet es sich an, wenn das jemand beherrscht den Sketch zu schreiben. Denke das das für viele eine Sache von maximal 1-2 Stunden ist.

Jo, würde sagen, 2 Std dürften reichen. Normaler Stundenlohn eines Programmierers ist 70 Euro, da du aber keine Rechnung brauchst, kommen wir mit 35 Euro hin.

Wenn du also interesse hast, überweise doch erstmal die 70 Euro, dann finden sich hier bestimmt 10 die dir das schreiben. Gute Aufträge sind immer willkommen. Vieleicht lässt der eine oder andere sich auch auf 50 runter handeln.

Sollte dir der Preis aber zuviel sein, dann solltest du selbst lernen zu programmieren und anfangen die richtigen Fragen zu stellen.

Also für den Nachweis von 50€ donate an Arduino.cc als Spende macht dir es garantiert jemand ehrenamtlich.

Allerdings müsste dann das Pflichtenheft klar definiert sein.

Ok Ihr habt recht. Ich will es ja lernen. Hier mein erster Sketch der funktionierte, allerdings ohne das zweite und das dritte Relais:

<
int taster=7; //Das Wort „taster“ steht jetzt für den Wert 7.
int tasterstatus=0; //Das Wort „tasterstatus“ steht jetzt zunächst für den Wert 0. Später wird unter dieser Variable gespeichert, ob der Taster gedrückt ist oder nicht.

int relais1=1;

//int relais2=2;
//int relais3=3;

void setup() //Hier beginnt das Setup.
{
pinMode(taster, OUTPUT); //Der Pin mit der LED (Pin7) ist jetzt ein Eingang INPUT
pinMode(relais1, INPUT); //Der Pin mit dem Relay1 (Pin1) ist jetzt ein Eingang OUTPUT

}
void loop() // Die Endlosschleife
{
tasterstatus=digitalRead(taster);
if (tasterstatus == HIGH) // HIGH
{
digitalWrite(relais1, LOW); // dann soll das Relais schalten, LOW
delay (10000); // und zwar für für X Sekunden
digitalWrite(relais1, HIGH); // danach soll das Relais nicht schalten, HIGH
//delay (500);
}
}

Dann habe ich versucht das zweite Relais anzusteuern das mir nicht gelingt:
<
int taster=7; //Das Wort „taster“ steht jetzt für den Wert 7.
int tasterstatus=0; //Das Wort „tasterstatus“ steht jetzt zunächst für den Wert 0. Später wird unter dieser Variable gespeichert, ob der Taster gedrückt ist oder nicht.

int relais1=1;

int relais2=2;

void setup() //Hier beginnt das Setup.
{
pinMode(taster, INPUT); //Der Pin mit der LED (Pin 7) ist jetzt ein Eingang INPUT
pinMode(relais1, OUTPUT); //Der Pin mit dem Relay1 (Pin 1) ist jetzt ein Eingang OUTPUT
pinMode(relais2, OUTPUT);
}

void loop()
{
tasterstatus=digitalRead(taster);
if (tasterstatus == HIGH) //Taster drücken,HIGH
{
digitalWrite(relais1, LOW); //danach soll das Relais X schalten, LOW
delay (3000); //und zwar für für X Sekunden
digitalWrite(relais2, HIGH); //danach soll das Relais X nicht schalten
delay (1000); //und zwar für für X Sekunden
digitalWrite(relais2, LOW); //dann soll das Relais nicht schalten
delay (1000); //und zwar für für X Sekunden
digitalWrite(relais1, HIGH); //dann soll das Relais nicht schalten HIGH
}

Über den Taster wird das Programm gestartet. Funktioniert auch, das erste Relais schaltet. Über den PIN 7 Input wird dem Relais gesagt das es schalten soll. Wie wird dem zweiten Relais gesagt, “schalte nach dem Programmstart nach 30 sek. für 30 sek.”, dabei soll aber das Relais1 weiter geschaltet bleiben für X min.

jurs: Welches Arduino-Board verwendest Du? UNO R3? Oder was? Welches Relais-Modul verwendest Du? Link? Wie genau brauchst Du die "10 Minuten? Reicht es, die 10 Minuten +/-5 Sekunden einzuhalten?

Und was genau heißt HIGH und LOW bei Dir mit Bezug auf das Relais? Steht das für geschaltet und nicht geschaltet? Oder umgekehrt?

Hinweis: Viele Relais-Module für Arduino sind "Active LOW" schaltend, und wenn Du so eines mit HIGH ansteuerst, dann ist es "NICHT GESCHALTET! Daher auch die Frage, welches Relais-Modul Du verwendest.

Kläre erst die Hardware, und komme danach mit Softwarefragen, wenn die Hardware und deren Schaltung feststeht!

Hardware: UNO Relays http://www.ebay.de/itm/111909492010?_trksid=p2060353.m1438.l2649&ssPageName=STRK%3AMEBIDX%3AIT

Es reicht die 10min +-5 sek Relai ist Active LOW

Es fehlt noch ein Link zum Relais-Modul.

Das Bild vom Aufbau bitte besser einstellen. Bei der Größe ist nicht zu erkennen.

Und setze deinen Sketch in Code-Tags, Schaltfläche </> oben links im Editor. Das kannst du jetzt noch nachträglich machen, dann ist der Sketch auch besser zu lesen.

Bild größer

Bild neu

jurs: Also ziemlich normale Hardware und keine extremen Anforderungen an die Zeitgenauigkeit.

Dafür kann ich Dir nachher einen Sketch als Beispielprogramm zusammenschreiben und hier posten. Dafür nehme ich NICHTS und Du brauchst auch keine Zwangsspende an jemanden senden. Sollte bis irgendwann heute Abend fertig sein.

Funktionsgarantie kann ich natürlich nicht übernehmen.

Das hängt auch davon ab, was Du schalten möchtest: - rein ohmsche Lasten, z.B. Heizstäbe, wären problemlos - aber bei induktiven Lasten (Lüfter, Motoren, Spulen) sind die von Dir gewählten Relais-Module berüchtigt dafür, durch große EMV-Störungen zu Fehlfunktionen zu neigen, und zwar insbesondere beim "Abschalten induktiver Wechselstromlasten", wenn Du keine hardwaretechnischen EMV-Entsörmaßnahmen zusätzlich in der Schaltung vorsiehst.

Jetzt fahre ich erstmal einkaufen und dann mache ich Mittagessen und Mittagspause.

Du bist ein Schatz. Nein ich schalte damit einen Verbraucher der nur wenige Ampere benötigt aber doch zu viel für den Arduino. Ca. 9V bei 2A. Ja es ist eine Heizung. Dank dir

jurs:
Das ist ja zur Abwechslung mal ganz was einfaches.

Das Programmgrundgerüst für einen “blockierenden Schaltzyklus” steht bereits, daran fehlt nur noch die buttonPressed() Funktion.

Beispielprogramm:

// relay example program by 'jurs' for German Arduino forum thread:

// http://forum.arduino.cc/index.php?topic=434114.0

// Pin-Definitionen ggf. ändern nach Bedarf
#define Relais1 2 // Relais1 an Pin2
#define Relais2 3 // Relais2 an Pin3
#define Relais3 4 // Relais3 an Pin4
#define EIN LOW
#define AUS HIGH

void setup(){
  // Alle drei Relais auf AUS initialisieren
  digitalWrite(Relais1,AUS);
  pinMode(Relais1,OUTPUT);
  digitalWrite(Relais2,AUS);
  pinMode(Relais2,OUTPUT);
  digitalWrite(Relais3,AUS);
  pinMode(Relais3,OUTPUT);
}

void schaltzyklus(){
  // Dieser Zyklus dauert insgesamt 10 Minuten (20 mal 30 Sekunden delay()
  digitalWrite(Relais1,EIN); // Hier fangen die 10 Minuten an
  for (int i=0;i<10;i++){
      delay(30000);
      digitalWrite(Relais2,EIN);
      digitalWrite(Relais3,EIN);
      delay(30000);
      digitalWrite(Relais2,AUS);
      digitalWrite(Relais3,AUS);
  }

digitalWrite(Relais1,AUS); // hier sind die 10 Minuten zuende
 
}

bool buttonPressed(){
}

void loop(){
  if (buttonPressed()) schaltzyklus();
}




Es wäre nicht schlecht, wenn Du zum Anschließen des Buttons noch Angaben machen könntest:

- Willst Du einen Button und einen "externen PullDown-Widerstand" anschließen?
- oder willst Du einen Button und einen "externen PullUp-Widerstand" anschließen?
- oder soll mit dem Button der interne PullUp-Widerstand des Atmega-Controllers verwendet und in der Software aktiviert werden?

Zwei Zusatzfragen:
1.: Soll es am Ende des Schaltzyklus eine "Sperrfrist von einigen Sekunden geben, bevor der Schaltzyklus neu gestartet werden kann? Oder soll der Zyklus ohne jede Wartezeit sofort neu startbar sein sobald er beendet ist?

2.): Nebenläufige Aufgaben wie regelmäßige Temperaturmessungen während eines laufenden Schaltzyklus brauchst Du nicht erledigen, oder?
Wenn doch, müßte das Programm ganz anders angelegt werden.

Was ich noch an Hardware habe:
400Pin Breadboard f. Prototyping
Arduino UNO mit KABEL
Taster für Breadboard
LM35DZ ( -0 +150C) To92 Temperatursensor
LCD mit Interface 1602

Du siehst ich habe tatsächlich noch einen Teperatursensor der verbaut werden müsste Harwaremäßig und Sketchmäßig. Der Taster (Buttons, wie du Schreibst) soll über einen Widerstand die Elektronen abführen. Habe ich auch schon so geschaltet wie auf dem Bild oben zu sehen. Wenn du aber eine bessere Lösung hast und das hast du glaube ich, dann nehmen wir doch lieber den internen PullUp-Widerstand des Atmega-Controllers (gleich mit Arduino UNO oder?)
Zu 1: Das Sketch soll nach dem Durchlauf erst wieder beginnen wenn der Taster gedrückt wurde.Also kompletter Stopp nach den 10 Minuten.
Zu2: Ja Temperaturüberwachung wäre super. Der gemessene Wert sollte auf dem LCD Display angezeigt werden. Denke der LCD-Hardwareanschluss ist nicht zu kompliziert? Den Temperatursensor lege ich einfach auf die Heizplatte oder was meinst du?
Danke noch mal das du dir meiner annimmst. Ich war schon am verzweifeln.

Ein sehr schönes Beispiel, wie schnell man sich mit delay verrennt.
Nachdem der Tasterdruck einmal erkannt wurde, passiert nichts ausser dem zeitlich gesteuerten Relais-Klacken. Man kann den Taster erneut drücken und loslassen wie man will.
jurs’ Frage lief eher darauf hinaus, was passieren soll wenn in dem Moment wo der Schaltzyklus zu Ende ist, der Taster gerade mal wieder gedrückt ist: zur Zeit wird Relais1 EIN bleiben, weil die Anweisung

digitalWrite(Relais1,AUS); // hier sind die 10 Minuten zuende

schneller durch das neue

digitalWrite(Relais1,EIN); // Hier fangen die 10 Minuten an

ausser Kraft gesetzt wird, als ein Relais reagieren kann.

Da ein aufruf von schaltzyklus() erst nach 10 Minuten zu Ende ist, kann man in loop() keine schnelleren Aktionen einbauen. Als Not-Aus geht noch der Reset-Taster, aber “nebenläufig” Temperaturen messen ist nicht drin.

Eine Frage habe ich noch, an den der es weiß: Wenn ich den Arduino an den Strom anstecke, egal ob per USB oder 9V Netzteil, schaltet der ein Programm oder besser er macht irgend etwas. Auf jeden Fall nicht das was ich möchte. Das währe, gar nix. Es soll das Programm erst starten wenn ich den Taster betätige. Der Arduino schaltet beim Einstecken die Relais, Erst nach einer undefinierten Zeit kann ich das Programm starten.

Zu

jurs: Ich meine, dass es nun doch um einiges komplizierter wird als Du es in Deinem ursprünglichen Posting zur Eröffnung des Threads geschrieben hast.

Bisher war von einem auszulesenden Temperatursensor und einem LCD für eine Temperaturanzeige noch überhaupt nicht die Rede, sondern nur von einem Taster und dem 4-Kanal-Relaismodul.

Undjetzt soll noch ein Sensor auf einer Heizplatte liegen, und Du möchtest damit die Temperatur der Heizplatte messen und auf einem LCD anzeigen. Keine Ahnung wann und wie die Messung erfolgen soll. Bevor der Button gedrückt wird und der Schaltzyklus beginnt, einmal messen und anzeigen? Oder direkt nach dem Drücken des Tasters die Temperatur der Heizplatte messen und anzeigen, unmittelbar bevor der Schaltzyklus startet? Und eine weitere Messung der Heizplattentemperatur nach Ablauf des Schaltzyklus, wenn wieder auf den nächsten Tasterdruck gewartet wird? Oder wie? Es ist mir alles schleierhaft. Auch, warum Du jetzt plötzlich neue Hardware (Temperatursensor, LCD) aus dem Hut zauberst, von der bisher mit keinem Wort die Rede war.

Ok Sorry habe die Zweite Seite erst jetzt gelesen:

Ja die Teile hatte ich schon vorher. Habe es nicht gepostet weil mir die Relaysschaltung wichtiger war als alles andere, Sorry. Habe das jetzt nur dazu genommen weil du mir die Frage nach einem Temperatursensor gestellt hast. Habe ich wohl falsch interpretiert. Mir würde das Ursprüngliche Anliegen reichen. Lass das mit dem Display und dem Sensor weg. Macht nur Arbeit.

michael_x: Ein sehr schönes Beispiel, wie schnell man sich mit delay verrennt. Nachdem der Tasterdruck einmal erkannt wurde, passiert nichts ausser dem zeitlich gesteuerten Relais-Klacken. Man kann den Taster erneut drücken und loslassen wie man will. jurs' Frage lief eher darauf hinaus, was passieren soll wenn in dem Moment wo der Schaltzyklus zu Ende ist, der Taster gerade mal wieder gedrückt ist: zur Zeit wird Relais1 EIN bleiben, weil die Anweisung

digitalWrite(Relais1,AUS); // hier sind die 10 Minuten zuende

schneller durch das neue

digitalWrite(Relais1,EIN); // Hier fangen die 10 Minuten an

ausser Kraft gesetzt wird, als ein Relais reagieren kann.

Da ein aufruf von schaltzyklus() erst nach 10 Minuten zu Ende ist, kann man in loop() keine schnelleren Aktionen einbauen. Als Not-Aus geht noch der Reset-Taster, aber "nebenläufig" Temperaturen messen ist nicht drin.

Hi michael_x, der jur's hat anscheinend den Tred verlassen. Das war nicht meine Absicht jemanden zu verärgern. Habe Ihm geantwortet, wie du oben lesen kannst. Ich bräuchte wirklich nur das Programm um die Relays anzusteuern. Kannst du mir da weiterhelfen? Das Programm soll durchlaufen 10min. Dann soll nix mehr geschehen bis der Taster erneut gedrückt wurde. Wenn der Taster nach ca. 10 min ausversehen gedrückt wird macht das nichts aus. Ich möchte mit der Steuerung Messungen an der Heizung vornehmen.

kerzerl: Hi michael_x, der jur's hat anscheinend den Tred verlassen. Das war nicht meine Absicht jemanden zu verärgern. Habe Ihm geantwortet, wie du oben lesen kannst. Ich bräuchte wirklich nur das Programm um die Relays anzusteuern. Kannst du mir da weiterhelfen? Das Programm soll durchlaufen 10min. Dann soll nix mehr geschehen bis der Taster erneut gedrückt wurde. Wenn der Taster nach ca. 10 min ausversehen gedrückt wird macht das nichts aus. Ich möchte mit der Steuerung Messungen an der Heizung vornehmen.

Warum lernst du es nicht selbst ? Da wird dir schon ein fertiger Sketch geliefert und du gibst dir keine Mühe, es zu lernen. Dazu ist das Forum nicht gedacht, Eigeninitiative muss du schon zeigen.

Und warum liest du nicht unsere Posts ?

Das einzige was jurs erstmal weggelassen hat, war die Funktion

bool buttonPressed(){
}

Weil du noch nicht verraten hast, wie du den Taster anschliessen willst. Das ist erstaunlich schwierig für absolute Anfänger, schau dir die Beispiele an, bis du weisst, was INPUT_PULLUP bedeutet. ;) Dann schreib die Funktion buttonPressed() so, dass siefalseliefert, wenn der Taster nicht gedrückt ist, undtrue, wenn doch.

Ein Arduino startet immer, sobald er an der Stromversorgung hängt *), und läuft solange er Strom hat. Dass er normalerweise gar nichts macht, muss man so programmieren. Dass die Relais am Anfang AUS sind, hat jurs in seinem Beispiel schon drin.

Und man sollte immer verschiedene Sketche haben, nur für die Relais (verschiedene Varianten), zum Test des LCD, Test des Sensors, dies und das, Blinksketch um zu überprüfen, ob man den Arduino zerschossen hat, und und und ...


*) OK, ein normaler Arduino wartet 3 sek im bootloader, bevor setup() aufgerufen wird, weil ja evtl. nach Reset ein geänderter Sketch geladen werden soll.

Nachtrag: Keine Angst, HotSystems, ist nicht meine Art, komplette Lösungen zu posten. Perfekte Beispiele sind eine gute Art, etwas "gleich richtig" zu lernen. Sich quälen, bis es geht, ist eine andere Art, die auch lehrreich ist.

michael_x: Nachtrag: Keine Angst, HotSystems, ist nicht meine Art, komplette Lösungen zu posten. Perfekte Beispiele sind eine gute Art, etwas "gleich richtig" zu lernen. Sich quälen, bis es geht, ist eine andere Art, die auch lehrreich ist.

Weiß ich doch. ;) An diesem Beispiel sehen wir wieder, es nutzt niemandem, fertige Sketche zu liefern. Mit vielen kleinen Tipps der zahlreichen User kommt man auch ans Ziel.

Wenn du ihm aber den Sketch lieferst, nervt er hier nicht mehr rum und du hast deine Ruhe, wäre doch auch mal ne Perspektive ;)