diff --git a/BiDi/BiDi.ino b/BiDi/BiDi.ino deleted file mode 100644 index 3c80a6c..0000000 --- a/BiDi/BiDi.ino +++ /dev/null @@ -1,95 +0,0 @@ -/* RS 485-Implementierung, die sowohl Schreiben als auch Lesen kann */ -/* Basis für andere Projekte */ - -#define BUTTON 2 -#define RECEIVE 3 -#define RECEIVE_ENABLE 4 -#define SEND 5 -#define SEND_ENABLE 6 - -#define MAX_LEN 128 - -void setup() { - // Buttons connected to analog input lines - pinMode(A0,INPUT_PULLUP); - pinMode(A1,INPUT_PULLUP); - pinMode(A2,INPUT_PULLUP); - pinMode(A3,INPUT_PULLUP); - pinMode(A4,INPUT_PULLUP); - pinMode(A5,INPUT_PULLUP); - pinMode(A6,INPUT_PULLUP); - pinMode(A7,INPUT_PULLUP); - // Currently, all buttons are also connected via a diode to an interruptable pin, to notify on input changes. - // This interruptable pin should be assgined to BUTTON - pinMode(BUTTON,INPUT_PULLUP); - attachInterrupt(digitalPinToInterrupt(BUTTON),button,FALLING); // interrupt for button change - - // Set up pins for RS485 connection - pinMode(RECEIVE, INPUT); - pinMode(RECEIVE_ENABLE, OUTPUT); - pinMode(SEND, OUTPUT); - pinMode(SEND_ENABLE, OUTPUT); - attachInterrupt(digitalPinToInterrupt(RECEIVE),receive,CHANGE); // interrupt for incoming RS485 traffic - - reset485(); - buttons = 0x0; -} - -void button() { - buttons = 0xFF ^ (digitalRead(A7)<<7 | digitalRead(A6)<<6 | digitalRead(A5)<<5 | digitalRead(A4)<<4 | digitalRead(A3)<<3 | (!digitalRead(A2))<<2 | digitalRead(A1)<<1 | digitalRead(A0)); -} - -void receive(){ - bool received_bit = digitalRead(RECEIVE); - curr = micros(); - duration = curr - last; - Serial.print("Input switched to "); - Serial.print(received_bit?"H":"L"); - Serial.print(" after "); - Serial.print(duration); - Serial.println(" ticks"); - last = curr; - if (duration > MAX_TICKS) reset485(); - received_bit = !received_bit; // received_bit is the current value, the duration of the previous value (=inverted) has been measured - duration /= BASE; - while (duration > 0){ - byte_idx--; - recv |= received_bit<0){ - for (int i=0; i<7; i++){ - if (buttons & (1< rst){ - reset485(dif); - } else { - handle485(!bt,dif); - } -} - -void handle485(boolean bt, long dif){ - long count = dif/base; - for (int i=0; i=0) rcv |= bt< +#include + +#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("LCDReceive 1.2"); + lcd.print("LCDReceive 1.2"); + +} + +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/ManualSend/ManualSend.ino b/Software/ManualSend/ManualSend.ino similarity index 100% rename from ManualSend/ManualSend.ino rename to Software/ManualSend/ManualSend.ino diff --git a/ManualSend/Readme.md b/Software/ManualSend/Readme.md similarity index 100% rename from ManualSend/Readme.md rename to Software/ManualSend/Readme.md diff --git a/Software/Sender/Sender.ino b/Software/Sender/Sender.ino new file mode 100644 index 0000000..b9feeb8 --- /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.1" + +#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; + } + } +}