I am working on Rs485 based home automation project. I have attached 02 PCB.
Relay Module : With 06 Input, 08 relay output drive through TPIC6B595DWR and 0-10V output for dimmer.
Wall Panel: 08 Input and 08 output led drive through TPIC6B595DWR.
Nextion HMI : Display / monitor and control all module.
Protocol: Msg based half duplex without feedback. Msg contain (Sender address, Receiver address, function code, status) like 10,100,10,0
Wall panel address 10,11,12,13……
Relay module address 100,101,102,103……
Below sketch is uploaded on Relay module and its working as expected. But I am looking support to arrange and clean the code to write in arrays instead of repeated lines.
#include <RS485_non_blocking.h>
byte My_Address = 100; //Target_ID
byte Target_ID = 10; //Target_ID
size_t fWrite(const byte what) {
return Serial.write(what);
}
int fAvailable() {
return Serial.available();
}
int fRead() {
return Serial.read();
}
// RS485 library instance
RS485 myChannel(fRead, fAvailable, fWrite, 20);
byte buf[20];
int count = 10;
int i;
const int Buzzer = 2;
const int latchPin = 7; //Pin connected to latch pin (RCK) of TPIC6B595
const int clockPin = 4; //Pin connected to clock pin (SRCK) of TPIC6B595
const int dataPin = 12; //Pin connected to Data in (SER IN) of TPIC6B595
const int OE = 8; // clearPin
byte leds;
bool LED_state1 = false;
bool LED_state2 = false;
bool LED_state3 = false;
bool LED_state4 = false;
bool LED_state5 = false;
bool LED_state6 = false;
bool LED_state7 = false;
bool LED_state8 = false;
const int heartBeatLED = 13;
unsigned int heartBeatState = LOW;
bool FeedbackLightState = false;
uint32_t LEDStartTime = 0;
const int Led_Dimmer = 3; // +- Dimmer
const int Led_CCT = 5; // +- CCT
const int Led_White = 6; // CH1 White
const int Led_Blue = 9; // CH2 Blue
const int Led_Red = 10; // CH3 Red
const int Led_Green = 11; // CH4 Green
int Receive_Val1 = 0;
int DIM_write1 = 0;
int Receive_Val2 = 0;
int CCT_write2 = 0;
int Receive_Val3 = 0;
int DIM_write3 = 0;
int Receive_Val4 = 0;
int DIM_write4 = 0;
int Receive_Val5 = 0;
int DIM_write5 = 0;
int Receive_Val6 = 0;
int DIM_write6 = 0;
void setup() {
Serial.begin(9600);
myChannel.begin();
pinMode(OE, OUTPUT);
digitalWrite(OE, LOW);
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
// checkLedState();
pinMode(heartBeatLED, OUTPUT);
digitalWrite(heartBeatLED, LOW);
pinMode(Buzzer, OUTPUT);
digitalWrite(Buzzer, LOW);
pinMode(Led_Dimmer, OUTPUT);
pinMode(Led_CCT, OUTPUT);
pinMode(Led_White, OUTPUT);
pinMode(Led_Blue, OUTPUT);
} // end of setup
void loop() {
if (myChannel.update()) {
memcpy(buf, myChannel.getData(), myChannel.getLength()); // make a copy of the data
///////////////////---------Heartbeat-generate-----------/////////////////
if (buf[0] == 255 && buf[1] == 1 && buf[2] == 94 && buf[3] == 1) //buf[0] = Slave ID , buf[1] = Button ID , buf[2] = Slave ID
{
//Serial.println ("Zzzz");
heartBeatState = HIGH;
FeedbackLightState = true;
LEDStartTime = millis();
}
/////////////////////////////-------------Door Bell-------------------///////////////////
if (buf[0] == 20 && buf[1] == 110 && buf[2] == 122 && buf[3] == 1) //buf[0] = Slave ID , buf[1] = Button ID , buf[2] = Slave ID
{
while (count > 0) {
for (i = 0; i < 250; i++) {
digitalWrite(Buzzer, HIGH);
delayMicroseconds(i);
digitalWrite(Buzzer, LOW);
delayMicroseconds(i);
}
delay(100);
count = count - 1;
}
count = 10;
}
///////////////---------------Dimmer-------------------------//////////////////
///////////////////////////////////-------------------------------------///////////////////////////
if (buf[0] != Target_ID)
return; // not my device
if (buf[1] != My_Address)
return; // unknown command
//Serial.println ("Message Received");
///////////---------------DIMMER ----------------------------///////////
/*
if (buf [2] == 30) {
Receive_Val1 = buf [3];
DIM_write1 = map(Receive_Val1, 0, 9, 0, 255);
//Serial.print ("Serial_Rec : ");
//Serial.print (Receive_Val1);
//Serial.print (" DIM_write1 : ");
//Serial.println (DIM_write1);
analogWrite(Led_Dimmer, DIM_write1);
// byte msg [] = {My_Address , Target_ID, 101, DIM_write1};
// myChannel.sendMsg (msg, sizeof (msg));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
if (buf [2] == 35) {
Receive_Val2 = buf [3];
CCT_write2 = map(Receive_Val2, 0, 9, 0, 255);
//Serial.print ("Serial_Rec : ");
//Serial.print (Receive_Val2);
//Serial.print (" CCT_write2 : ");
//Serial.println (CCT_write2);
analogWrite(Led_CCT, CCT_write2);
// byte msg [] = {My_Address , Target_ID, 102, CCT_write2};
// myChannel.sendMsg (msg, sizeof (msg));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
if (buf [2] == 103) {
Receive_Val3 = buf [3];
DIM_write3 = map(Receive_Val3, 0, 65, 0, 255);
//Serial.print ("Serial_Rec : ");
//Serial.print (Receive_Val3);
//Serial.print (" DIM_write3 : ");
//Serial.println (DIM_write3);
analogWrite(Led_White, DIM_write3);
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
if (buf [2] == 104) {
Receive_Val4 = buf [3];
DIM_write4 = map(Receive_Val4, 0, 65, 0, 255);
//Serial.print ("Serial_Rec : ");
//Serial.print (Receive_Val4);
//Serial.print (" DIM_write4 : ");
//Serial.println (DIM_write4);
analogWrite(Led_Blue, DIM_write4);
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
//////////-------------------------------------------------
if (buf [2] == 105) {
Receive_Val5 = buf [3];
DIM_write5 = map(Receive_Val5, 0, 65, 0, 255);
//Serial.print ("Serial_Rec : ");
//Serial.print (Receive_Val5);
//Serial.print (" DIM_write5 : ");
//Serial.println (DIM_write5);
analogWrite(Led_Red, DIM_write5);
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
if (buf [2] == 106) {
Receive_Val6 = buf [3];
DIM_write6 = map(Receive_Val6, 0, 65, 0, 255);
//Serial.print ("Serial_Rec : ");
//Serial.print (Receive_Val6);
//Serial.print (" DIM_write6 : ");
//Serial.println (DIM_write6);
analogWrite(Led_Green, DIM_write6);
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
*/
/////////////////-----------------------------------------------///////////////////////////////////
//////////////---------------Relay-------------------------///////////////
if (buf[2] == 10 && buf[3] == 1) //buf[0] = Slave ID , buf[1] = Button ID , buf[2] = Slave ID
{
LED_state1 = 1;
bitSet(leds, 0);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 60, 1 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(1, LED_state1);
//Serial.println(F(" P1 B1 S_ON "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
} else if (buf[2] == 10 && buf[3] == 0) {
LED_state1 = 0;
// updateShiftRegister();
bitClear(leds, 0);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 60, 0 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(1, LED_state1);
//Serial.println(F(" P1 B1 S_OFF "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
/////////////----------------//////////////
if (buf[2] == 11 && buf[3] == 1) //buf[0] = Slave ID , buf[1] = Button ID , buf[2] = Slave ID
{
LED_state2 = 1;
bitSet(leds, 1);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 61, 1 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(2, LED_state2);
//Serial.println(F(" P1 B2 S_ON "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
} else if (buf[2] == 11 && buf[3] == 0) {
LED_state2 = 0;
bitClear(leds, 1);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 61, 0 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(2, LED_state2);
//Serial.println(F(" P1 B2 S_OFF "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
/////////////----------------//////////////
if (buf[2] == 12 && buf[3] == 1) //buf[0] = Slave ID , buf[1] = Button ID , buf[2] = Slave ID
{
LED_state3 = 1;
bitSet(leds, 2);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 62, 1 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(3, LED_state3);
//Serial.println(F(" P1 B3 S_ON "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
} else if (buf[2] == 12 && buf[3] == 0) {
LED_state3 = 0;
bitClear(leds, 2);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 62, 0 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(3, LED_state3);
//Serial.println(F(" P1 B3 S_OFF "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
//////////////----------------------------------------///////////////
if (buf[2] == 13 && buf[3] == 1) //buf[0] = Slave ID , buf[1] = Button ID , buf[2] = Slave ID
{
LED_state4 = 1;
bitSet(leds, 3);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 63, 1 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(4, LED_state4);
//Serial.println(F(" P1 B4 S_ON "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
} else if (buf[2] == 13 && buf[3] == 0) {
LED_state4 = 0;
bitClear(leds, 3);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 63, 0 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(4, LED_state4);
//Serial.println(F(" P1 B4 S_OFF "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
//////////////////////////////////////----Panel 02------------/////////////////////////////////////////
if (buf[2] == 14 && buf[3] == 1) //buf[0] = Slave ID , buf[1] = Button ID , buf[2] = Slave ID
{
LED_state5 = 1;
bitSet(leds, 4);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 64, 1 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(5, LED_state5);
//Serial.println(F(" P1 B5 S_ON "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
} else if (buf[2] == 14 && buf[3] == 0) {
LED_state5 = 0;
bitClear(leds, 4);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 64, 0 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(5, LED_state5);
//Serial.println(F(" P1 B5 S_OFF "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
/////////////----------------//////////////
if (buf[2] == 15 && buf[3] == 1) {
LED_state6 = 1;
bitSet(leds, 5);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 65, 1 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(6, LED_state6);
//Serial.println(F(" P1 B6 S_ON "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
} else if (buf[2] == 15 && buf[3] == 0) {
LED_state6 = 0;
bitClear(leds, 5);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 65, 0 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(6, LED_state6);
//Serial.println(F(" P1 B6 S_OFF "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
//////////////----------------------------------------///////////////
if (buf[2] == 16 && buf[3] == 1) //buf[0] = Slave ID , buf[1] = Button ID , buf[2] = Slave ID
{
LED_state7 = 1;
bitSet(leds, 6);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 66, 1 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(7, LED_state7);
//Serial.println(F(" P1 B7 S_ON "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
} else if (buf[2] == 16 && buf[3] == 0) {
LED_state7 = 0;
bitClear(leds, 6);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 66, 0 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(7, LED_state7);
//Serial.println(F(" P1 B7 S_OFF "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
//////////////----------------------------------------///////////////
if (buf[2] == 17 && buf[3] == 1) //buf[0] = Slave ID , buf[1] = Button ID , buf[2] = Slave ID
{
LED_state8 = 1;
bitSet(leds, 7);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 67, 1 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(8, LED_state8);
//Serial.println(F(" P1 B8 S_ON "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
} else if (buf[2] == 17 && buf[3] == 0) {
LED_state8 = 0;
bitClear(leds, 7);
updateShiftRegister();
//byte msg[] = { My_Address, Target_ID, 67, 0 };
//myChannel.sendMsg(msg, sizeof(msg));
// EEPROM.update(8, LED_state8);
//Serial.println(F(" P1 B8 S_OFF "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
///////////////////////////////////////////----------Group------------------//////////////////////
/////////////////////////////////////////////--------------------////////////////////////////////
//////////////----------------Group------------------------///////////////
if (buf[2] == 18 && buf[3] == 1) //buf[0] = Slave ID , buf[1] = Button ID , buf[2] = Slave ID
{
//byte msg[] = { My_Address, Target_ID, 68, 1 };
//myChannel.sendMsg(msg, sizeof(msg));
LED_state1 = 1;
LED_state2 = 1;
LED_state3 = 1;
LED_state4 = 1;
bitSet(leds, 0);
updateShiftRegister();
delay(25);
bitSet(leds, 1);
updateShiftRegister();
delay(25);
bitSet(leds, 2);
updateShiftRegister();
delay(25);
bitSet(leds, 3);
updateShiftRegister();
// EEPROM.update(8, LED_state8);
////Serial.println(F(" P1 B9 S_ON "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
} else if (buf[2] == 18 && buf[3] == 0) {
//byte msg[] = { My_Address, Target_ID, 68, 0 };
//myChannel.sendMsg(msg, sizeof(msg));
LED_state1 = 0;
LED_state2 = 0;
LED_state3 = 0;
LED_state4 = 0;
// updateShiftRegister();
bitClear(leds, 0);
updateShiftRegister();
delay(25);
bitClear(leds, 1);
updateShiftRegister();
delay(25);
bitClear(leds, 2);
updateShiftRegister();
delay(25);
bitClear(leds, 3);
updateShiftRegister();
// EEPROM.update(9, LED_state9);
////Serial.println(F(" P1 B9 S_OFF "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
if (buf[2] == 19 && buf[3] == 1) //buf[0] = Slave ID , buf[1] = Button ID , buf[2] = Slave ID
{
//byte msg[] = { My_Address, Target_ID, 69, 1 };
//myChannel.sendMsg(msg, sizeof(msg));
LED_state5 = 1;
LED_state6 = 1;
LED_state7 = 1;
LED_state8 = 1;
// updateShiftRegister();
bitSet(leds, 4);
updateShiftRegister();
delay(25);
bitSet(leds, 5);
updateShiftRegister();
delay(25);
bitSet(leds, 6);
updateShiftRegister();
delay(25);
bitSet(leds, 7);
updateShiftRegister();
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
} else if (buf[2] == 19 && buf[3] == 0) {
//byte msg[] = { My_Address, Target_ID, 69, 0 };
//myChannel.sendMsg(msg, sizeof(msg));
LED_state5 = 0;
LED_state6 = 0;
LED_state7 = 0;
LED_state8 = 0;
// updateShiftRegister();
bitClear(leds, 4);
updateShiftRegister();
delay(25);
bitClear(leds, 5);
updateShiftRegister();
delay(25);
bitClear(leds, 6);
updateShiftRegister();
delay(25);
bitClear(leds, 7);
updateShiftRegister();
// EEPROM.update(9, LED_state9);
////Serial.println(F(" P1 B9 S_OFF "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
/////////////////////-------All At Panel 01----------------////////////////
if (buf[2] == 20 && buf[3] == 1) //buf[0] = Slave ID , buf[1] = Button ID , buf[2] = Slave ID
{
//byte msg[] = { My_Address, Target_ID, 70, 1 };
//myChannel.sendMsg(msg, sizeof(msg));
LED_state1 = 1;
LED_state2 = 1;
LED_state3 = 1;
LED_state4 = 1;
LED_state5 = 1;
LED_state6 = 1;
LED_state7 = 1;
LED_state8 = 1;
// updateShiftRegister();
bitSet(leds, 0);
updateShiftRegister();
delay(25);
bitSet(leds, 1);
updateShiftRegister();
delay(25);
bitSet(leds, 2);
updateShiftRegister();
delay(25);
bitSet(leds, 3);
updateShiftRegister();
delay(25);
bitSet(leds, 4);
updateShiftRegister();
delay(25);
bitSet(leds, 5);
updateShiftRegister();
delay(25);
bitSet(leds, 6);
updateShiftRegister();
delay(25);
bitSet(leds, 7);
updateShiftRegister();
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
} else if (buf[2] == 20 && buf[3] == 0) {
//byte msg[] = { My_Address, Target_ID, 70, 0 };
//myChannel.sendMsg(msg, sizeof(msg));
LED_state1 = 0;
LED_state2 = 0;
LED_state3 = 0;
LED_state4 = 0;
LED_state5 = 0;
LED_state6 = 0;
LED_state7 = 0;
LED_state8 = 0;
bitClear(leds, 0);
updateShiftRegister();
delay(25);
bitClear(leds, 1);
updateShiftRegister();
delay(25);
bitClear(leds, 2);
updateShiftRegister();
delay(25);
bitClear(leds, 3);
updateShiftRegister();
delay(25);
bitClear(leds, 4);
updateShiftRegister();
delay(25);
bitClear(leds, 5);
updateShiftRegister();
delay(25);
bitClear(leds, 6);
updateShiftRegister();
delay(25);
bitClear(leds, 7);
updateShiftRegister();
// EEPROM.update(9, LED_state9);
////Serial.println(F(" P1 B9 S_OFF "));
digitalWrite(Buzzer, HIGH);
FeedbackLightState = true;
LEDStartTime = millis();
}
///////////////////////////////////////////////----------------------------------/////////////
///////////------Feedback-------------////////////////////
/*
byte msg [] = {2, 1, 1,0};
myChannel.sendMsg (msg, sizeof (msg));
*/
///////////-----------Feedback-------------////////////////////
} //END Channel UPDATE
////////////////////////////////----------------------/////////////
if (FeedbackLightState == true && millis() - LEDStartTime >= 50) {
digitalWrite(Buzzer, LOW);
heartBeatState = LOW;
FeedbackLightState = false;
}
digitalWrite(heartBeatLED, heartBeatState);
/////////////////////////---------------------------///////////////////////
} // end of loop
void updateShiftRegister() {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}

