diff --git a/Software/TempSender/TempSender.ino b/Software/TempSender/TempSender.ino new file mode 100644 index 0000000..e60a414 --- /dev/null +++ b/Software/TempSender/TempSender.ino @@ -0,0 +1,116 @@ +/* + * Demonstrates how to use Read Buttons in conjunction with SoftRS485: + * + * If a button is pressed, a corresponding flag is set. + * The main loop checks for the state of those flags and + * sends a message on the RS485 bus whenever a flag is set. + */ + +// include the library code: +#include +#include + +#define PROGRAM "RS485-Nano 2.0 / TempSender 1.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 DHT_PIN 4 +#define TRESHOLD 100000 // 100ms +#define PERIOD 100000000 // 100s +#define ID 3 +// 0=Test +// 1=Arbeitszimmer +// 2=Küche +// 3=Bad + +//#define LOG_TO_SERIAL +#define SEND_485 + +AM2302::AM2302_Sensor am2302{DHT_PIN}; + +boolean states[8]; +unsigned long times[8]; +unsigned long sensor_time = PERIOD; + + +void setup(){ + Serial.begin(115200); + am2302.begin(); + 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,FALLING); + // 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]){ + delay(1); + if (now - times[i] > TRESHOLD){ +#ifdef SEND_485 + send(i+1); +#endif + times[i] = now; + } + states[i] = 0; + } + } + + if (now - sensor_time > PERIOD){ + sensor_time = now; + auto status = am2302.read(); + if (status == 0){ + String s = "{nano:"+String(ID)+",temp:"+String(am2302.get_Temperature())+",humi:"+String(am2302.get_Hunidity())+"}"; + send485(s.c_str()); +#ifdef LOG_TO_SERIAL + Serial.println(s); +#endif + } + } + +}