/* * 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. * * Additionally, the temperature is read from a DHT22 sensor once per minute */ // include the library code: #include #include // 0=Test // 1=Flur // 2=Wohnzimmer // 3=Bad EG // 4=Treppenhaus // 5=Arbeitszimmer // 6=Bad OG #define ID 0 #define PROGRAM "TempSender" #define SW_VERSION "1.3" #define HW_VERSION "2.2" #define BTN_INT 3 // button interrupt pin #define Max485_RO 2 // read-output of Max485 #define Max485_RE 3 // not-read-enable of Max485 #define Max485_DE 8 // data enable of Max485 #define Max485_DI 9 // data input of Max485 #define TRESHOLD 1024 #define TRIGGER_LEVEL 200 #define DHT_PIN 4 #define PERIOD 100000000 // 100s //#define DEBUG //#define LOG_TO_SERIAL #define SEND_485 AM2302::AM2302_Sensor am2302{DHT_PIN}; boolean raw_states[8]; boolean states[8]; unsigned long capacitor[8]; unsigned long times[8]; unsigned long sensor_time = 0; void setup(){ for (int i=0; i<8;i++) { capacitor[i] = 0; raw_states[i] = LOW; states[i] = LOW; } 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(BTN_INT),isr,CHANGE); String s = "{nano:"+String(ID)+",hw:"+HW_VERSION+","+PROGRAM+":"+SW_VERSION+"}"; Serial.println(s); send485(s.c_str()); #ifdef LOG_TO_SERIAL Serial.println("14 15 16 17 18 19 20 21"); #endif } void isr(){ raw_states[0] = analogRead(14)>1; // if the capacitor reaches a certain treshold, the state is changed boolean new_state = capacitor[i]>TRESHOLD; // TODO: drop state after a maximum HIGH time // when the state changes, the duration of the last state is calculated if (states[i] != new_state){ long diff = (now - times[i])/1000; times[i] = now; if (states[i]) send(i+1,diff); // old state was HIGH → we are going LOW states[i] = new_state; } } 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()); } } }