/* * 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.1 / TempSender 1.1" #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 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 } } }