Und hier ist der zweite Node ein Arduino MEGA1280 der nur mit einem Blinkenlight Shield versehen ist um die Zustände sichtbar zumachen die über das HMI gemacht werden. Natürlich auch mit einem RS485 Wandler
Die Ausgänge 3-9 sind Digital und 10-13 PWM:
Die hier ist der Code vom Node:
/* These Code for recieveing Data form DBus System
this sketch is for Arduino Mega2560/1280 with more Hardware Serial Connections
*/
#include <RS485_non_blocking.h>
#include <Streaming.h>
#define DriverPinDB 22
#define LedPin 13
#define interval 2000
#define myAdress 2
#define debug
unsigned long lmillis = 0;
#ifdef debug
unsigned long lmillisDebug = 0;
#endif
// SoftwareSerial rs485 (RS485RX, RS485TX); // receive pin, transmit pin only for Software Serial Port on Uno or equal
int fAvailable ()
{
return Serial1.available();
}
int fRead ()
{
return Serial1.read();
}
RS485 myChannel (fRead, fAvailable, NULL, 20);
// definieren Nachricht
struct {
byte adress;
byte function;
byte wert[7];
} message;
void setup() {
pinMode (DriverPinDB, OUTPUT);
digitalWrite(DriverPinDB, LOW);
myChannel.begin();
for (int i=2; i<=12;i++){
pinMode(i,OUTPUT);
}
Serial1.begin(9600); // define Speed of Serial1 on Arduino MEGA
#ifdef debug
Serial.begin(9600); // only for debug
#endif
// put your setup code here, to run once:
Serial << "Init" << endl;
}
void loop() {
// put your main code here, to run repeatedly:
if (myChannel.update ())
{
Serial << "DataInput" << endl;
memset (&message, 0, sizeof message); // Wird alles mit nullen gfeüllt
int len = myChannel.getLength();
if (len > sizeof message){
len = sizeof message;
}
memcpy (&message, myChannel.getData (), len); // kopieren der der Speicherbereiche in das Messags struct
if (message.adress==2){
digitalWrite(3, bitRead(message.wert[0], 0)); // Digital schreiben der einzelenen Daten auf die Ausg�nge des Display
digitalWrite(4, bitRead(message.wert[0], 1));
digitalWrite(5, bitRead(message.wert[0], 2));
digitalWrite(6, bitRead(message.wert[0], 3));
digitalWrite(7, bitRead(message.wert[0], 4));
digitalWrite(8, bitRead(message.wert[0], 5));
digitalWrite(9, bitRead(message.wert[0], 6));
analogWrite(10, message.wert[1]); // Schreiben der Analogwerte auf das Display
analogWrite(11, message.wert[2]);
analogWrite(12, message.wert[3]);
analogWrite(13, message.wert[4]);
#ifdef debug
debugSerialPrint();
#endif
} // end of message completely received
}
}
void debugSerialPrint() { // Testausgabe der Empfangenen Daten
Serial << "Adresse: " << message.adress << " Funktion:" << message.function << " Wert1:" << message.wert[0] <<
" Wert2:" << message.wert[1] << " Wert3:" << message.wert[2] << " Wert4:" << message.wert[3] << " Wert5:" << message.wert[4] <<
" Wert6:" << message.wert[5] <<" Wert7:" << message.wert[6] <<" Wert3:" << message.wert[7] << endl;
}
Das ist meine aktuelle Teil Vorstellung da ich seit langer Zeit dran bin und mir heute der durchburch mit RS485 "Chips" gelungen ist wollte ich es hier schonmal einstellen.
Der Nächste Schritt ist die "aktuellen" Einstellungen der HMI in einem I2C NV-RAM sichern und bei neustart laden. Desweitern kommt noch eine Einbindung eine NEXTION LCD Display als "wireless" Node via ESP8266 Bridge.
Und noch vor Weihnachten eine Schaltuhr für die ganzen Lämpchen mit Hilfe von RC Steckdosen die über einen Node gesteuert werden.
Ich werde hier dann bei weitern Schritten weiter berichten.
Gruß
DerDani