From 1bdfaa152384044a1d736c8df81ba329824097e4 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Sun, 3 Dec 2023 12:23:19 +0100 Subject: [PATCH] adopted software to Nano 2.0 Signed-off-by: Stephan Richter --- Software/LCDReceiver/LCDReceiver.ino | 58 +++++++++++++++++ Software/Sender/Sender.ino | 96 ++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 Software/LCDReceiver/LCDReceiver.ino create mode 100644 Software/Sender/Sender.ino diff --git a/Software/LCDReceiver/LCDReceiver.ino b/Software/LCDReceiver/LCDReceiver.ino new file mode 100644 index 0000000..436abf5 --- /dev/null +++ b/Software/LCDReceiver/LCDReceiver.ino @@ -0,0 +1,58 @@ +/* + * 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 +#include + +#define PROGRAM "RS485-Nano Rev 2.0 / LCDReceive 1.2" + +#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 LCD_RS 4 +#define LCD_EN 6 +#define LCD_D4 7 +#define LCD_D5 11 +#define LCD_D6 12 +#define LCD_D7 13 + + + +// initialize the library by associating any needed LCD interface pin with the arduino pin number it is connected to +LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7); + + +void setup() { + Serial.begin(115200); + init485(Max485_RO,Max485_RE,Max485_DE,Max485_DI); // library initialization: + invert485polarity(true); + // set up the LCD's number of columns and rows: + lcd.begin(16, 2); + // Print a message to the LCD. + Serial.println(PROGRAM); + lcd.print(PROGRAM); + +} + +void loop() { + if (available485()) { + String s = get485message(); + Serial.println(s); + lcd.clear(); + lcd.setCursor(0, 0); + lcd.print(s); + if (s.length()>16) { + lcd.setCursor(0, 1); + s=s.substring(16); + s.trim(); + lcd.print(s); + } + } +} diff --git a/Software/Sender/Sender.ino b/Software/Sender/Sender.ino new file mode 100644 index 0000000..253f6fa --- /dev/null +++ b/Software/Sender/Sender.ino @@ -0,0 +1,96 @@ +/* + * 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; + } + } +}