Binary / Temp sensor help - sleep time
-
I combined temp and binary (2x) sketches.
All works ok if I remove "sleep time" but in this case I get flooded with temperature sensor data.
If "sleep time" is used then binary switches don't change states.How to amend sketch to send temp to gw at certain interval ie 30 seconds?
// 2x binary switch + dallas temp example // Connect button or door/window reed switch between // digitial I/O pin 4,5 (BUTTON_PIN_4/BUTTON_PIN_5 below) and GND. // Connect dallas temp sensor to digital pin 3 #include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #include <DallasTemperature.h> #include <OneWire.h> #define CHILD_ID_4 4 #define CHILD_ID_5 5 #define BUTTON_PIN_4 4 // Arduino Digital I/O pin for button/reed switch #define BUTTON_PIN_5 5 // Arduino Digital I/O pin for button/reed switch #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected #define MAX_ATTACHED_DS18B20 16 unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds) OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); MySensor gw; Bounce debouncer = Bounce(); Bounce debouncer_2 = Bounce(); int oldValue=-1; int oldValue_2 =-1; float lastTemperature[MAX_ATTACHED_DS18B20]; int numSensors=0; boolean receivedConfig = false; boolean metric = true; // Initialize temperature message MyMessage msg(0,V_TEMP); // Change to V_LIGHT if you use S_LIGHT in presentation below MyMessage msg4(CHILD_ID_4,V_TRIPPED); MyMessage msg5(CHILD_ID_5,V_TRIPPED); void setup() { // Startup OneWire sensors.begin(); // Startup and initialize MySensors library. Set callback for incoming messages. gw.begin(); // Send the Sketch Version Information to the Gateway gw.sendSketchInfo("Door/Temp", "1.0"); // Fetch the number of attached temperature sensors numSensors = sensors.getDeviceCount(); // Present all sensors to controller for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { gw.present(i, S_TEMP); } // Setup the button pinMode(BUTTON_PIN_4,INPUT); pinMode(BUTTON_PIN_5,INPUT); // Activate internal pull-up digitalWrite(BUTTON_PIN_4,HIGH); digitalWrite(BUTTON_PIN_5,HIGH); // After setting up the button, setup debouncer debouncer.attach(BUTTON_PIN_4); debouncer.interval(5); debouncer_2.attach(BUTTON_PIN_5); debouncer_2.interval(5); // Register binary input sensor to gw (they will be created as child devices) // You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage. // If S_LIGHT is used, remember to update variable type you send in. See "msg" above. gw.present(CHILD_ID_4, S_DOOR); gw.present(CHILD_ID_5, S_DOOR); } // Check if digital input has changed and send in new value void loop() { debouncer.update(); // Get the update value int value = debouncer.read(); if (value != oldValue) { // Send in the new value gw.send(msg4.set(value==HIGH ? 1 : 0)); oldValue = value; } debouncer_2.update(); // Get the update value int value_2 = debouncer_2.read(); if (value_2 != oldValue_2) { // Send in the new value gw.send(msg5.set(value_2==HIGH ? 1 : 0)); oldValue_2 = value_2; } // Process incoming messages (like config from server) gw.process(); // Fetch temperatures from Dallas sensors sensors.requestTemperatures(); // Read temperatures and send them to controller for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { // Fetch and round temperature to one decimal float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.; // Only send data if temperature has changed and no error if (lastTemperature[i] != temperature && temperature != -127.00) { // Send in the new temperature gw.send(msg.setSensor(i).set(temperature,1)); lastTemperature[i]=temperature; } } gw.sleep(SLEEP_TIME); }
-
you can try this way... untested but it compiles:
// 2x binary switch + dallas temp example // Connect button or door/window reed switch between // digitial I/O pin 4,5 (BUTTON_PIN_4/BUTTON_PIN_5 below) and GND. // Connect dallas temp sensor to digital pin 3 #include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #include <DallasTemperature.h> #include <OneWire.h> // #define CHILD_ID_4 4 #define CHILD_ID_5 5 #define BUTTON_PIN_4 4 // Arduino Digital I/O pin for button/reed switch #define BUTTON_PIN_5 5 // Arduino Digital I/O pin for button/reed switch #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected #define MAX_ATTACHED_DS18B20 16 // //unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds) OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); MySensor gw; Bounce debouncer = Bounce(); Bounce debouncer_2 = Bounce(); int oldValue=-1; int oldValue_2 =-1; float lastTemperature[MAX_ATTACHED_DS18B20]; int numSensors=0; boolean receivedConfig = false; boolean metric = true; // MyMessage msg(0,V_TEMP); MyMessage msg4(CHILD_ID_4,V_TRIPPED); MyMessage msg5(CHILD_ID_5,V_TRIPPED); // void setup() { sensors.begin(); gw.begin(); gw.sendSketchInfo("Door/Temp", "1.0"); numSensors = sensors.getDeviceCount(); for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { gw.present(i, S_TEMP); } pinMode(BUTTON_PIN_4,INPUT); pinMode(BUTTON_PIN_5,INPUT); // Activate internal pull-up digitalWrite(BUTTON_PIN_4,HIGH); digitalWrite(BUTTON_PIN_5,HIGH); // debouncer.attach(BUTTON_PIN_4); debouncer.interval(5); debouncer_2.attach(BUTTON_PIN_5); debouncer_2.interval(5); gw.present(CHILD_ID_4, S_DOOR); gw.present(CHILD_ID_5, S_DOOR); } // void loop() { debouncer.update(); int value = debouncer.read(); if (value != oldValue) { gw.send(msg4.set(value==HIGH ? 1 : 0)); oldValue = value; } debouncer_2.update(); int value_2 = debouncer_2.read(); if (value_2 != oldValue_2) { gw.send(msg5.set(value_2==HIGH ? 1 : 0)); oldValue_2 = value_2; } gw.process(); updateTemperature(30);// update time in seconds //gw.sleep(SLEEP_TIME); } void updateTemperature(int frequency) { static unsigned long lastUpdateTime; if (millis() - lastUpdateTime >= frequency * 1000UL) { sensors.requestTemperatures(); for (int i=0; i<numSensors && i< MAX_ATTACHED_DS18B20; i++) { float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.; if (lastTemperature[i] != temperature && temperature != -127.00) { gw.send(msg.setSensor(i).set(temperature,1)); lastTemperature[i]=temperature; } } lastUpdateTime += frequency * 1000UL; } }
-
@BulldogLowell thank you, I uploaded it and so far it works fine.
2 out of 3
Suggested Topics
-
Temperature Sensor Configuration
General Discussion • 22 Jan 2015, 00:08 • rdevine 22 Jan 2015, 15:30 -
💬 MySGrowLED - MySensors control for Grow Lights or Greenhouse
OpenHardware.io • 9 May 2016, 06:03 • openhardware.io 27 Jul 2017, 20:51 -
💬 Temp_Hum sensors
OpenHardware.io • 2 Jan 2019, 08:41 • openhardware.io 2 Jan 2019, 08:41 -
Mys Interposer NRF/Arduino Pro Mini
OpenHardware.io • 23 Mar 2016, 20:45 • openhardware.io 25 May 2017, 15:59 -
How does it work? Sleep , WDG ..
General Discussion • 24 Nov 2014, 07:49 • dzairo 28 Nov 2014, 23:20 -
Ds18b20/ nodemcu fluctuations in temp
Hardware • 18 May 2020, 06:19 • mjdula 20 May 2020, 23:51 -
💬 Sensebender Micro
OpenHardware.io • 6 Jan 2016, 22:57 • openhardware.io 8 Aug 2021, 16:02 -
Motion detector with temperature and barometer function
My Project • 19 Feb 2017, 10:06 • bgunnarb 19 Feb 2017, 10:06