Arduino Modbus Light fade, Licht faden.

Hallo,
ch wollte hier mal im neuen Beitrag das fertige Projekt vorstellen.
Bei diesem wurde mir im Arduino Forum geholfen.

In diesem Projekt wollte ich quasi die Beleuchtung steuern über
IP-Symcon. Dabei aber auch Sensorwerte zu dem Server übermitteln.

Einen Langzeittest habe ich leider noch nicht machen können.

Arduino fadet hoch und runter, von IPS kommen nur gewünschte Werte.
Da ist skripten dafür nicht mehr notwendig!

Hoffe das hilft jemanden auch weiter.

#include <SPI.h>
#include <Ethernet.h>

#include "Mudbus.h"

// getestet mit Mega2560
const byte ausgaenge[] = {2, 3, 4, 5, 6, 7, 8, 9, 45, 11, 12, 13};
const byte PWM = sizeof(ausgaenge);
const byte R[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // Indexwerte fuer Mb.R[]
int8_t fadeAmount[PWM];    // how many points to fade the LED by
unsigned long currentTime;
unsigned long loopTime;
int brightness[PWM], altModbuswert[PWM], aktModbuswert[PWM];

int sensorwert; // LM35 Temperatur auslesen.
int temperatur = 0; //Unter d

Mudbus Mb;
//Function codes 1(read coils), 3(read registers), 5(write coil), 6(write register)
//signed int Mb.R[0 to 125] and bool Mb.C[0 to 128] MB_N_R MB_N_C
//Port 502 (defined in Mudbus.h) MB_PORT

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Programmstart"));
  for (byte ausgang = 0; ausgang < PWM; ausgang++)
  {
    fadeAmount[ausgang] = 5;
    brightness[ausgang] = 255;    // Anfangswert "aus"
    altModbuswert[ausgang] = 255; // Anfangswert "aus"
    aktModbuswert[ausgang] = 255; // Anfangswert "aus"
  }
  currentTime = millis();
  loopTime = currentTime;

  uint8_t mac[]     = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0x06 };
  uint8_t ip[]      = { 192, 168, 178, 70 };
  uint8_t gateway[] = { 192, 168, 178, 1 };
  uint8_t subnet[]  = { 255, 255, 255, 0 };
  Ethernet.begin(mac, ip, gateway, subnet);


  //PWM Frequenz
  //0×01  1      31.374 KHz
  //0×02  8      3.921 Khz
  //0×03  64     490.1 Hz            // default
  //0×04  256    122.5 Hz
  //0×05  1024   30.63 Hz
  //http://playground.arduino.cc/Main/TimerPWMCheatsheet

  TCCR1A = (TCCR1A & 0xF8) | 0x01;
  TCCR0A = (TCCR0A & 0xF8) | 0x01;
  TCCR0B = (TCCR0B & 0xF8) | 0x01;
  TCCR2B = (TCCR2B & 0xF8) | 0x01;
}

void loop()
{
  Mb.Run();
  currentTime = millis();
  //PWM Ausgänge:
  for (byte ausgang = 0; ausgang < PWM; ausgang++)
  {
    altModbuswert[ausgang] = aktModbuswert[ausgang];
    aktModbuswert[ausgang] = Mb.R[R[ausgang]];
    if (altModbuswert[ausgang] != aktModbuswert[ausgang])
    {
      if (brightness[ausgang] < aktModbuswert[ausgang]) {
        fadeAmount[ausgang] = 5;
      } else {
        fadeAmount[ausgang] = -5;
      }
    }
  }
  if (currentTime - loopTime >= 1000) {   // 1,5 Sekunden scheint mir recht lange zu sein
    loopTime = currentTime;  // Updates loopTime
    for (byte ausgang = 0; ausgang < PWM; ausgang++)
    {
      if ((brightness[ausgang] < aktModbuswert[ausgang] && fadeAmount[ausgang] > 0) || (brightness[ausgang] > aktModbuswert[ausgang] && fadeAmount[ausgang] < 0)) {
        brightness[ausgang] += fadeAmount[ausgang];
        analogWrite(ausgaenge[ausgang], brightness[ausgang]);
      }
      //Serial.println();
    }
  }

  // Digitale Eingänge herauslesen und zu Modbus übergeben:
  //Pin31
  Mb.R[14] = digitalRead(31);

  //Pin33
  Mb.R[15] = digitalRead(33);

  //Pin35
  Mb.R[16] = digitalRead(35);

  //Pin37
  Mb.R[17] = digitalRead(37);

  //Pin39
  Mb.R[18] = digitalRead(39);

  //Pin41
  Mb.R[19] = digitalRead(41);

  //Pin43
  Mb.R[20] = digitalRead(43);

  //Pin47
  Mb.R[21] = digitalRead(47);

  //Pin49
  Mb.R[22] = digitalRead(49);

  //Pin53
  Mb.R[23] = digitalRead(53);


  // Analoge Eingänge herauslesen und zu Modbus übergeben:

  //Pin Analog 0
  Mb.R[24] = analogRead(0);

  //Pin Analog 1
  Mb.R[25] = analogRead(1);

  //Pin Analog 2
  Mb.R[26] = analogRead(2);

  //Pin Analog 3
  sensorwert = analogRead(3); // LM35 am Pin A3 12V Netzteil
  temperatur = map(sensorwert, 0, 307, 0, 150);
  Mb.R[27] = temperatur;

  //Pin Analog 4
  sensorwert = analogRead(4); // LM35 am Pin A4 Platine Mega - Modbus
  temperatur = map(sensorwert, 0, 307, 0, 150);
  Mb.R[28] = temperatur;
}

Gruß

MegaModbusFade.rar (1.44 KB)

mudbus.zip (43.9 KB)

Was ist da jetzt dann als Beleuchtung angeschlossen RGB LEDs?

Hallo Fonzo,

gerade nur ein WW Band.
RGB wird bei mir nie angeschlossen.

Möchte später die Beleuchtung im Haus damit
ansteuern. Früher oder später…
Der Kopf des Systems wird IPS sein.

Auf meiner Platine im Bild, hat jeder Ausgang
eine eigene Sicherung und ein Mosfet.
Also Quasi 1 Ausgang eine Lampe oder LEDstrip im
Haus irgendwo.

So in etwa mein Gedanke dazu, erst will ich
die Pirs anbinden und erst automatisieren.
Danach muss ich schauen das ich die Lichtschalter oder
Taster so umbaue das IPS die sehen kann.

Hoffe mein Vorgehen ist so erst ok.

Gruß

Hallo,

der Code ist viel kleiner geworden und optimierter.

Gruß

Zuerst mein Respekt für diese Leistung, eines könnte aber die Freude an der Dimmerei zerstören:

Wenn so ein zentrales Hardware Modul viel versorgt sind die Wege zu den Stripes oft lang.

Lange Wege sind lange Antennen, mach die Frequenz nicht zu hoch sonst gibt es Probleme, zu tief brummt.
Gruß Helmut

Hallo Helmut,

ja das muss man mal beachten.
Ist schon richtig.

Ein Arduino Uno läuft bereits mit 2
Verbrauchern. Bis jetzt keine Probleme
bemerkbar, zur Zeit ohne IPS.

Es soll eingentlich 3 davon werden in der Zukunft.
Jeder Versorg nur die Nebenräume.

Naja so in der Theorie noch…

Kriege aber gerage meine Beleuchtung
in IPS nicht gescheit eingebunden…
Muss noch lesen und evtl. um Rat fragen.

Gruß

Hallo,

leider Langzeittest war nicht erfolgreich!

Die Verbindung zu den W5100 verschwindet oder
der Arduino streikt. Vielleicht liegt es am dynamischen Speicher.
Wie ich das Problem lösen kann, weiß ich leider noch nicht.

Vielleicht jemand eine Idee?

Vielleicht Sie Helmut? Hab Ihre Webseite angeschaut,
da sind Sie schon Meilen weiter wie ich.

Gruß

Alex

Hallo Alex,
ich schätze der Ardunio löst die Verbindung wenn er nicht abgefragt wird
Einfach so alle 5 Sekunden anpingen oder was abfragen, teste mal

 <?
$da=Sys_Ping("192.168.0.25",20); 
echo $da;
?> 

Gruß Helmut

Hallo Helmut,

vielen Dank für die Antwort!

Versuch ist es Wert! Werde die Tage dies mal ausprobieren.
Wo müsste man den die Zeilen hinzufügen?

Wenn alles funktioniert blinken kleine Led’s bei dem
W5100. Wenn aber die Verbindung nicht mehr geht,
blinken diese nicht mehr. Und die Ausgänge am Mega
spinnen herum, blinken etc.

Einheitlich sind auch 4 Bewegungsmelder angeschlossen,
diese werden auch alle 20ms ausgelesen.

Hab auch den Raspi mal neu gemacht und die
Verwaltungskonsole auf einen anderen Rechner installiert.
Seit dem dauert es manchmal bis 3 Sekunden,
bis Verwaltungskonsole die Daten an Arduino
sendet oder Empfängt.
Davor ging es sau schnell aber über TCP Testprogramm
geht es immer noch sehr schnell.

Gruß

Danke noch mal!

Wenn Du die Bewegungsmelder so schnell abfragst, ist meine Blase geplatzt, denn die Abfrage/Ping ist ja da, ev. ist Das ja der Grund
Irgendein Überlauf, Stack wer weiß
Test mal mit längeren Intervallen bei der Abfrage, im Moment weiß ich nichts mehr…
Gruß Helmut

Danke Helmut für die Antwort,

ja das versuche ich mal morgen als erstes.
Gestern hielt es 4 Stunden, dann habe ich es
selber aus gemacht. Damit ich Nachts nicht laufen muss.

Gruß

Hi kannst du mal die verbaute Hardware beschreiben, welchen Mosfet usw. Teileliste wäre cool…

Ich habe sowas auch schon mehrmals gebaut, 16 Channel und man kann 12V 16 A damit schalten / dimmen und das passt auf eine 7x5cm Platine und wird mit i2c angesteuert, der i2c Server ist ein Pi und die Kommunikation läuft über MQTT an IPS und Co…

Hallo Helmut,

hatte heute alles Instanzen auf 200ms gesetzt.
Seit etwa 4 Stunden läuft es noch.

Das Problem aber mit dem langsamem reagieren
von IPS besteht aber noch.
Hoffe aber das die Verbindung erst überhaupt bestehen bleibt.

Gruß

Ach hab die Vorherige Antwort übersehen.

Mosfets muss ich schauen. An sich dann nen Mega und W5100.
Sonnst nur klein Kram wie Led’s etc.

Mqtt läuft sauber?

Hallo,

die Verbindung war wieder weg. Oder eher alles hat sich auf gehangen (gefühlt).

Mosfets sind IRLZ34N verbaut.

Gruß

Hallo,

hab erst nur ModBus stehen lassen. Mal sehen ob es daran liegt…

#include <SPI.h>

#include <Ethernet.h>



#include "Mudbus.h"


int sensorwert; // LM35 Temperatur auslesen.
int temperatur = 0; //Unter d

Mudbus Mb;

//Function codes 1(read coils), 3(read registers), 5(write coil), 6(write register)

//signed int Mb.R[0 to 125] and bool Mb.C[0 to 128] MB_N_R MB_N_C

//Port 502 (defined in Mudbus.h) MB_PORT



void setup()

{

  uint8_t mac[]     = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0x06 };
  uint8_t ip[]      = { 192, 168, 178, 70 };
  uint8_t gateway[] = { 192, 168, 178, 1 };
  uint8_t subnet[]  = { 255, 255, 255, 0 };
  Ethernet.begin(mac, ip, gateway, subnet);

  //Avoid pins 4,10,11,12,13 when using ethernet shield


}



void loop() {

  Mb.Run();
  
  //Ausgänge 2-13, anstatt 10 ist 45
  
  analogWrite(2, Mb.R[2]);
  
  analogWrite(3, Mb.R[3]);
  
  analogWrite(4, Mb.R[4]);
  
  analogWrite(5, Mb.R[5]);
  
  analogWrite(6, Mb.R[6]);
  
  analogWrite(7, Mb.R[7]);
  
  analogWrite(8, Mb.R[8]);
  
  analogWrite(9, Mb.R[9]);
  
  analogWrite(45, Mb.R[10]);
  
  analogWrite(11, Mb.R[11]);
  
  analogWrite(12, Mb.R[12]);
  
  analogWrite(13, Mb.R[13]);

  // Digitale Eingänge herauslesen und zu Modbus übergeben:
  //Pin31
  Mb.R[14] = digitalRead(31);

  //Pin33
  Mb.R[15] = digitalRead(33);

  //Pin35
  Mb.R[16] = digitalRead(35);

  //Pin37
  Mb.R[17] = digitalRead(37);

  //Pin39
  Mb.R[18] = digitalRead(39);

  //Pin41
  Mb.R[19] = digitalRead(41);

  //Pin43
  Mb.R[20] = digitalRead(43);

  //Pin47
  Mb.R[21] = digitalRead(47);

  //Pin49
  Mb.R[22] = digitalRead(49);

  //Pin53
  Mb.R[23] = digitalRead(53);


  // Analoge Eingänge herauslesen und zu Modbus übergeben:

  //Pin Analog 0
  Mb.R[24] = analogRead(0);

  //Pin Analog 1
  Mb.R[25] = analogRead(1);

  //Pin Analog 2
  Mb.R[26] = analogRead(2);

  //Pin Analog 3
  Mb.R[27] = analogRead(3); 

  //Pin Analog 4
  sensorwert = analogRead(4); // LM35 am Pin A4 Platine Mega - Modbus
  temperatur = map(sensorwert, 0, 307, 0, 150);
  Mb.R[28] = temperatur;
}

Gruß

Hallo,

hängte sich wieder auf.
Mit einem TCP Testprogramm beim ersten
Verbindung gabs Timeout. Beim zweiten
gings wieder, aber wie es aussah startete
das System neu.

Soll mann vielleicht was anderes anstatt Modbus nehmen?

Gruß

Pokeys zum Beispiel, meine Platine kann 6 FET’s per PWM ansteuern
Auch per Modbus parametrierbar, aber besser mit PoBlock und S0 per Modbus, ist einfacher :wink:
Gruß Helmut