Rollosteuerung mit mega2560 und 3x 8-kanal 5v relaismodul

Hallo zusammen,

mein erstes “kleines” Projekt ist eine Rollo Steuerung:

Hardware:

3 mal 8-kanal 5v relaismodul HL-58S V1.2 (pro Rollo 2 Relais = max 12 Rollos)
arduino mega 2560
netzteil 10V /2A
Steckkabel zum Verbinden
Busch und Jäger Rollotaster (werden über Arduino mit 5V betrieben und gehen dann wieder auf den mega 2560)
9 Rolladenmotoren von Jarolift mit 230V Ansteuerung (3 “Rollo-Plätze” sind von der Schaltung her als Reserve gedacht)

Ich benutze pro Rollo ein Relais zum (An-) Schalten von 230V und hierzu ein Relais (Wechsler) in Reihe,
für die Richtung des Rollos.
Die Relaismodule versorge ich über den 5V-Pin des Mega2560.
Im Internet habe ich gefunden, dass dieser 1A-Dauerstrom aushält. Pro Spule werden 70mA benötigt.
Da zeitgleich nie mehr als 5 Rollos laufen, ist dies meiner Meinung nach ausreichend.
Meine Schaltung soll so funktionieren, dass die Relais im Ruhezustand aus sind.

Die Steuerung habe ich angehängt. Wie gesagt funktioniert diese noch nicht komplett.

Zur Steuerung:

Taster hoch: Rollo fährt hoch bis Zeit abgelaufen ist/ wenn hoch nochmals gedrückt wird stoppt der Rollo/ wenn runter gedrückt wird wechselt der Rollo die Fahrtrichtung nach unten.

Taster runter: Rollo fährt runter bis Zeit abgelaufen ist/ wenn runter nochmals gedrückt wird stoppt der Rollo/ wenn hoch gedrückt wird wechselt der Rollo die Fahrtrichtung nach oben.

Prinzipiell funktioniert das ganze halbwegs. Ich habe nur das komische Phänomen dass sich einzelne Rollos zu schalten wenn ich einen Rollo betätige. Weiterhin habe ich ein toogeln auf meinem Rollo1 =Küche. Meine C-Kenntnisse sind leider nur rudimentär =)

Ich hoffe jemand nimmt sich die Zeit und schaut mal über meinen Code. Ich denke dies ist bestimmt auch für andere Nutzer interessant. Falls etwas unklar ist, oder ich etwas wichtiges vergessen habe, einfach melden.

Gruß,

Corsten

_141206_Rollosteuerung.ino (30.9 KB)

Im Internet habe ich gefunden, dass dieser 1A-Dauerstrom aushält. P

Nur wenn der Spannungsregler einen Kühlkörper hätte. So sind es eher 500mA. Das hängt auch davon ab wie hoch die Eingangsspannung ist. Mit 7V hält er mehr aus als mit 12V.

Der Code ist nicht schön. Der besteht fast nur aus Code der sich unnötig wiederholt.

Deine Variablen wären viel, viel besser in einem Array aus structs aufgehoben. Dann kannst du über die einzelnen structs mit einer for-Schleife iterieren und brauchst nicht x mal den gleichen Code nur mit anderen Variablen zu schreiben.

Mehr als ein Link teilen, kann man hier nichts mehr tun.

corsten:
Ich hoffe jemand nimmt sich die Zeit und schaut mal über meinen Code. Ich denke dies ist bestimmt auch für andere Nutzer interessant.

Als ich gesehen habe, dass der Code über 30 KB groß ist, ahnte ich schon nichts Gutes.

Und nach dem Download haben sich beim Betrachten des Codes leider alle Befürchtungen bestätigt:

Das Programm ist nicht strukturiert, nicht leicht wartbar, und enthält jede Menge doppelt gemoppelten Code. Bzw. weil Du 12 Rolläden steuerst, müßte man eigentlich zwölffach gemoppelten Code dazu sagen.

Das ist schon extrem anfängermäßig gemacht. So als wenn Du noch nie etwas von for-Schleifen bei der Programmierung gehört hast.

Am Anfang steht normalerweise, sich eine geeignete Datenstruktur auszudenken. Wie mein Vorredner bereits schrieb, denkst Du Dir für ein Rollo eine Datenstruktur aus. Und legst dann ein "Array" mit 12 Elementen dieses Typs an, für 12 Rollos.

Und alles, was zu tun ist, tust Du dann in einer for-Schleife 12mal hintereinander. Einmal für jeden Rollladen.

Dein Bedienkonzept scheint auch extrem von "normalen" Rolladensteuerungen abzuweichen. Insbesondere scheinst Du Deine zwei Buttons für dafür vorzusehen:

  • Mit einem Button wird der Motor gestartet
  • die Stellung des anderen Buttons bestimmt, ob der Motor hoch oder runter fährt

Selbst wenn die Relaisansteuerung so funktioniert, hat man für den Bediener normalerweise zwei Buttons, von denen einer für "Up" und der andere für "Down" steht.

Und eine Bedienlogik, die z.B. so sein könnte:

  1. Man drückt kurz "Up" und der Rollladen fährt hoch
  2. Wenn man danach nichts mehr drückt, fährt der Rollladen ganz hoch
  3. Wenn man während der Fahrt "Up" oder "Down" nochmal drückt, hält der Rollladen sofort an

Entsprechend beim Runterfahren

  1. Man drückt kurz "Down" und der Rollladen fährt runter
  2. Wenn man danach nichts mehr drückt, fährt der Rollladen ganz runter
  3. Wenn man während der Fahrt "Up" oder "Down" nochmal drückt, hält der Rollladen sofort an

Den Link auf einen vom mir geposteten Code hat skorpi08 ja schon gepostet.
Schaue Dir das mal an und vergleiche, wie kurz im Vergleich ein strukturiertes Programm mit Schleifen sein kann.

Einziges Manko: Als ich den Code gepostet habe, war ich davon ausgegangen, dass Rollladenmotoren mit Gleichstrommotoren angesteuert werden. Tatsächlich arbeiten diese aber wohl fast immer mit 230V Wechselspannung. Für eine Schaltung mit 230V Wechselstrommotoren muß die Funktion "switchRelay()" geringfügig geändert werden, damit die Motoren korrekt fahren.

P.S. wegen Rollo-1 in Deinem Programm: Die beiden Pins 0 und 1, die der seriellen Schnittstelle zugeordnet sind, verwendest Du besser NICHT für die Rolladen-Steuerung:
int r1PT1hoch = 1; //Rollo 1 Pin Taster1 hoch
int r1PT1runter = 0; //Rollo 1 Pin Taster1 runter
Sondern nimmst dafür besser andere Pins and kannst dann "Serial" dazu verwenden, um Dir von Deinem Programm Debug-Meldungen in Textform ausgeben zu lassen.

Hallo jurs,

tja wie gesagt meine Programmierkenntnisse sind leider noch nicht perfekt.
Ich werde mir morgen deinen Code anschauen und diesen analysieren.

jurs:
Selbst wenn die Relaisansteuerung so funktioniert, hat man für den Bediener normalerweise zwei Buttons, von denen einer für "Up" und der andere für "Down" steht.

Auch ich mache nichts anderes. Zwei Taster für jeweils Hoch und Runter.
Mit einem Wechselrelais schalte ich die Spannung (230V ) zu und mit dem Wechselrelais in Reihe schalte ich dann die Richtung.
Vorteil hiervon ist die hardwaretechnische Verriegelung.

Einziger Unterschied in meiner Bedienlogik ist, dass ich beim zweiten Tasterklick (auf den zuletzt Betätigten) stoppe und bei Betätigung des anderen Taster sofort die Richtung wechsel.

Das mit Pin 0 und 1 probier ich morgen gleich aus. Denk der Code wird mir eine große Hilfe sein.

Gruß und Danke,

Corsten

corsten:
Einziger Unterschied in meiner Bedienlogik ist, dass ich beim zweiten Tasterklick (auf den zuletzt Betätigten) stoppe und bei Betätigung des anderen Taster sofort die Richtung wechsel.

OK, dann habe ich Deinen Code dahingehend falsch interpretiert. Mein Fehler.

Allerdings könnte diese Art der schnellen Umsteuerung hoch/runter möglicherweise Deine Motoren in der Elektrik bzw. im Getriebe übermäßig belasten, wenn Du die Motoren von Hochfahrt direkt auf Runterfahrt umsteuerst und umgekehrt, ohne jegliche Pause dazwischen.

Wenn Du in meinem Code die Schaltlogik abändern möchtest, dass auch eine direkte Richtungsumschaltung aus voller Fahrt in Gegenrichtung möglich ist, brauchst Du nur die Logik beim Tastendrücken in der loop-Funktion ändern. Also für das Drücken des “Runter” Tasters an der Stelle:

if (state && !rollladen[i].downPressed)
    {
      switch (rollladen[i].action)
      ...

und für das Drücken des “Rauf” Tasters an der Stelle:

if (state && !rollladen[i].upPressed)
    {
      switch (rollladen[i].action)
      ...

Und schon wird zentral an einer einzigen Stelle die Schaltlogik für alle 12 Rollläden geändert.

corsten:
Das mit Pin 0 und 1 probier ich morgen gleich aus. Denk der Code wird mir eine große Hilfe sein.

Mein Code enthält eingebaute Debug-Meldungen für die Relais-Schaltungen, die alle zur Kontrolle über Serial ausgegeben werden. Und da dieser Code alle Rollläden in einer Schleife abarbeitet, wird jeder Rollladen mit absolut identischem Code angesteuert. Falls Du mit dem Code feststellen solltest, dass Schaltungen der Fahrtbewegungen erfolgen (über tatsächliche “Geisterfahrten” bzw. Debugausgaben auf Serial), ohne dass ein Taster betätigt wurde, hast Du möglicherweise EMV-Störungen in Deine Schaltung eingebaut, die zu Störungen auf den Leitungen zu den Tastschaltern führen. Zum Beispiel vergessen über den geschalteten Kontakten der Relais jeweils Löschglieder (neudeutsch “Snubber”) zur Störungsunterdrückung beim Schalten einzubauen, falls solche nicht bereits in/an den Motoren selbst verbaut sind.

In dem Fall helfen gegen Geisterfahrten der Einbau der vergessenen Löschglieder/Snubber und ggf. geschirmte Signalleitungen zu den Schaltern bzw. stärkere Pull-Widerstände (niedrigerer K-Ohm Wert) an den Tastern. Wäre ja auch irgendwie blöde, wenn bei Gewitter die Rollladensteuerung total verrückt spielt, weil die Signale nicht störungssicher übertragen werden oder zu leicht durch elektromagnetische Felder der eigenen Motoren-Hardware gestört werden.

corsten:
tja wie gesagt meine Programmierkenntnisse sind leider noch nicht perfekt.

Perfekt verlangt auch niemand. Das sind die meisten Leute nicht.

Klar programmiert man am Anfang einfach drauf los und für kleine Programme reicht das auch völlig. Aber wenn es dann etwas komplizierter wird macht man sich damit keine Freude.

Dass das Programm anders geschrieben besser lesbar und wartbar ist, ist eine Sache. Aber du wirst sicher auch selbst gemerkt haben, dass es so auch schlecht zu Schreiben ist. Du musstest Code mehrmals kopieren und immer an den selben Stellen Variablen ändern. Das ist monoton und auch eine große Fehlerquelle, da man da schnell mal was vergisst oder falsch macht.