From a0dfb4c8f530d2fe9eda242b9b5b3fe6102b1453 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 19 Dec 2023 00:45:50 +0100 Subject: [PATCH] updated temp sender Signed-off-by: Stephan Richter --- Software/Sender/Sender.ino | 3 +- Software/TempSender/TempSender.ino | 78 ++++++++++++++++++------------ 2 files changed, 49 insertions(+), 32 deletions(-) diff --git a/Software/Sender/Sender.ino b/Software/Sender/Sender.ino index a14aec2..fee24fd 100644 --- a/Software/Sender/Sender.ino +++ b/Software/Sender/Sender.ino @@ -82,7 +82,7 @@ void isr(){ } void send(int btn, long duration){ - String s = "{nano:"+String(ID)+",btn:"+String(btn)+",dura:"+String(duration)+"}"; + String s = "{nano:"+String(ID)+",btn:"+String(btn)+",ms:"+String(duration)+"}"; #ifdef SEND_485 for (int i = 0; i<10; i++){ if (send485(s.c_str())) break; @@ -95,7 +95,6 @@ void send(int btn, long duration){ void loop(){ unsigned long now = micros(); - boolean pause = true; for (int i=0;i<8;i++){ // we emulate a capacitor: // when the button is pressed, it slowly loads, if the button is released, it unloads. diff --git a/Software/TempSender/TempSender.ino b/Software/TempSender/TempSender.ino index e60a414..82d927c 100644 --- a/Software/TempSender/TempSender.ino +++ b/Software/TempSender/TempSender.ino @@ -4,23 +4,28 @@ * 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 -#define PROGRAM "RS485-Nano 2.0 / TempSender 1.1" +#define PROGRAM "RS485-Nano 2.0 / TempSender 1.2" #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 1024 + #define DHT_PIN 4 -#define TRESHOLD 100000 // 100ms #define PERIOD 100000000 // 100s -#define ID 3 + +#define ID 0 // 0=Test // 1=Arbeitszimmer // 2=Küche @@ -31,12 +36,19 @@ 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 = PERIOD; 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: @@ -50,7 +62,7 @@ void setup(){ pinMode(20,INPUT_PULLUP); pinMode(21,INPUT_PULLUP); - attachInterrupt(digitalPinToInterrupt(2),isr,FALLING); + attachInterrupt(digitalPinToInterrupt(BTN_INT),isr,CHANGE); // Print a message to the LCD. Serial.println(PROGRAM); #ifdef LOG_TO_SERIAL @@ -59,45 +71,55 @@ void setup(){ } 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); + raw_states[0] = analogRead(14)<400; + raw_states[1] = analogRead(15)<400; + raw_states[2] = analogRead(16)<400; + raw_states[3] = analogRead(17)<400; + + raw_states[4] = analogRead(18)<400; + raw_states[5] = analogRead(19)<400; + raw_states[6] = analogRead(20)<400; + raw_states[7] = analogRead(21)<400; #ifdef LOG_TO_SERIAL for (int i=0;i<8;i++){ - Serial.print(" "); Serial.print(states[i]); Serial.print(" "); + Serial.print(" "); + Serial.print(raw_states[i]); + Serial.print(" "); } Serial.println(); #endif } +void send(int btn, long duration){ + String s = "{nano:"+String(ID)+",btn:"+String(btn)+",ms:"+String(duration)+"}"; #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:"); } -} +#else + Serial.println(s); #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; + // we emulate a capacitor: + // when the button is pressed, it slowly loads, if the button is released, it unloads. + capacitor[i] = raw_states[i] ? capacitor[i]+1 : capacitor[i]>>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; } } @@ -107,10 +129,6 @@ void loop(){ 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 } } - }