/* * Demonstrates how to use LCDisplay in conjunction with SoftRS485: * * The main _loop_ of this program listens on the RS485 bus. * Whenever a message is received from the bus, it is displayed on the LCD. */ // include the library code: #include #define PROGRAM "RS485-Nano 2.0 / Sender 1.0" #define BTN_INT 2 // button interrupt pin #define Max485_RO 3 // read-output of Max485 #define Max485_RE 5 // not-read-enable of Max485 #define Max485_DE 9 // data enable of Max485 #define Max485_DI 8 // data input of Max485 #define TRESHOLD 100000 // 100ms #define ID 0 // 0=Test // 1=Arbeitszimmer // 2=Küche // 3=Bad //#define LOG_TO_SERIAL #define SEND_485 boolean states[8]; unsigned long times[8]; void setup() { Serial.begin(115200); init485(Max485_RO,Max485_RE,Max485_DE,Max485_DI); // library initialization: pinMode(BTN_INT,INPUT_PULLUP); pinMode(14,INPUT_PULLUP); pinMode(15,INPUT_PULLUP); pinMode(16,INPUT_PULLUP); pinMode(17,INPUT_PULLUP); pinMode(18,INPUT_PULLUP); pinMode(19,INPUT_PULLUP); pinMode(20,INPUT_PULLUP); pinMode(21,INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(2),isr,CHANGE); // Print a message to the LCD. Serial.println(PROGRAM); #ifdef LOG_TO_SERIAL Serial.println("14 15 16 17 18 19 20 21"); #endif } void isr(){ states[0] = !digitalRead(14); states[1] = !digitalRead(15); states[2] = !digitalRead(16); states[3] = !digitalRead(17); states[4] = !digitalRead(18); states[5] = !digitalRead(19); states[6] = !(analogRead(20)>200); states[7] = !(analogRead(21)>200); #ifdef LOG_TO_SERIAL for (int i=0;i<8;i++){ Serial.print(" "); Serial.print(states[i]); Serial.print(" "); } Serial.println(); #endif } #ifdef SEND_485 void send(int btn){ String s = "{nano:"+String(ID)+",btn:"+String(btn)+"}"; for (int i = 0; i<10; i++){ if (send485(s.c_str())) break; Serial.println("collision detected, trying again:"); } } #endif void loop(){ unsigned long now = micros(); for (int i=0;i<8;i++){ if (states[i]){ if (now - times[i] > TRESHOLD){ #ifdef SEND_485 send(i+1); #endif times[i] = now; } states[i] = 0; } } }