Door, Motion and Temperature Sensor
-
@hek as I said before, Dallas library is bit outdated. Is it possible to update dallas and onewire libraries? I provided links for newer versions of this libraries in this thread. I can do PR in github myself, but I don't know how to do it :) I need to read github manuals first :)
requestTemperatures() is can be non-blocking in newer version of dallas library, so code can deep sleep (better for batteries) or process messages (better for repeaters and msg-receiving nodes) about 750 ms.
Using github is quite easy (when you get a hang of it). We can use this as a "training session" if you want?
I did a quick getting-started guide here:
http://forum.mysensors.org/topic/330/how-to-contribute-code-to-the-mysensors-projectBasically you need to
- Fork the mysensors project on github
- Clone your fork from your computer.
- Replace the libraries that is outdated.
- Commit as push the changes back to your fork of github.
- Create a pull-request (see above instructions) which I'll review and merge.
Easy peasy.. :)
-
Using github is quite easy (when you get a hang of it). We can use this as a "training session" if you want?
I did a quick getting-started guide here:
http://forum.mysensors.org/topic/330/how-to-contribute-code-to-the-mysensors-projectBasically you need to
- Fork the mysensors project on github
- Clone your fork from your computer.
- Replace the libraries that is outdated.
- Commit as push the changes back to your fork of github.
- Create a pull-request (see above instructions) which I'll review and merge.
Easy peasy.. :)
@hek thank you, I'll read and try on dallas&onewire :)
-
@hek thank you, I'll read and try on dallas&onewire :)
-
Great, just ask (or open a chat) if you run into trouble.
@hek I have forked MySensors project, added 3 commits into master branch with updated libraries and updated dallas sensors example (lower power usage).
I'm using similar code in my own version of MySensors 1.5-dev in my home, but I havn't tested this committed 1.4.1 github code on real hardware, so I will make PR after test on real hardware.
https://github.com/mysensors/Arduino/compare/master...roboprint:master?diff=split&name=master
-
@hek It seems that I did it. If this push request is correct, what I should patch? Development branch, master branch or both?
-
Guys, I had some free time tonight and tried to apply this fix... I ended up re-installing the arduino IDE + downloading the latest version, which now is 1.4.1 as opposed to the 1.4 that I used to have ?
Anyways I had to upgrade my ethernet gateway (ENC28J60) and it's no longer working now... any hints will be golden.
LE: I was too tired to check the sketch... I forgot to include the correct library and went to all debugging first, reset router config to default, but in the end I did notice the issue :) So I learned a valuable lesson, never work on this if it's late or you're tired. -
Hello guys,
I really need an expert's opinion on this because I'm experiencing some trouble... I've tried to include suggestions from all you guys, except the delay part, but so far it works partially... in my original code the temperature worked, and now it doesn't. The rest works ok, sensor and motion, so I would be grateful if anyone could take a look at my code and help me with it... I kind of need to get it in place soon, as I intend to leave my house for some time.
Thank you.
//This sketch is for Door & Motion & Temp Sensor #include <MySensor.h> #include <SPI.h> #include <DallasTemperature.h> #include <OneWire.h> #include <Bounce2.h> #define CLIENT_ID AUTO // Sets MYSensors client id #define RADIO_CH 76 // Sets MYSensors to use Radio Channel #define TRIGGER 3 // used to connect motion sensor #define BUTTON_PIN 4 // used to connect door/window sensor //Temp Sensor bits #define ONE_WIRE_BUS 14 // Pin where dallas sensor is connected OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DallasSensors(&oneWire); float lastTemperature ; #define CHILD_ID_T1 3 //CHILD ID for temp //Door/Window bits #define CHILD_ID_D1 1 //CHILD ID for door/window //Trigger Sensor Bits #define CHILD_ID_S1 2 //CHILD ID for Motion sensor boolean lastTripped = 0; MySensor gw; Bounce debouncer = Bounce(); int oldValue=-1; // Change to V_LIGHT if you use S_LIGHT in presentation below MyMessage msg(CHILD_ID_D1,V_TRIPPED); MyMessage triggerMsg(CHILD_ID_S1,V_TRIPPED); MyMessage tempMsg(CHILD_ID_T1,V_TEMP); void setup() { // Startup OneWire Temp Sensors DallasSensors.begin(); DallasSensors.setWaitForConversion(false); // Initialize library and add callback for incoming messages gw.begin(NULL, AUTO, true); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Multi Sensor", "1.1"); // Register all sensors to gw (they will be created as child devices) gw.present(CHILD_ID_D1, S_DOOR); gw.present(CHILD_ID_T1, S_TEMP); gw.present(CHILD_ID_S1, S_MOTION); // Setup the button pinMode(BUTTON_PIN,INPUT); // Activate internal pull-up digitalWrite(BUTTON_PIN,HIGH); // After setting up the button, setup debouncer debouncer.attach(BUTTON_PIN); debouncer.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. } void loop() { // Alway process incoming messages whenever possible gw.process(); // Check for motion change value boolean tripped = digitalRead(TRIGGER) == HIGH; if (lastTripped != tripped ) { gw.send(triggerMsg.set(tripped?"1":"0")); // Send new state and request ack back Serial.println("Tripped"); lastTripped=tripped; } // Check if digital input has changed and send in new value debouncer.update(); // Get the update value int value = debouncer.read(); if (value != oldValue) { // Send in the new value gw.send(msg.set(value==HIGH ? 1 : 0)); oldValue = value; } DallasSensors.requestTemperatures(); // no delay here gw.wait(750); // insert another value for non-12-bit resolution float tempC = DallasSensors.getTempCByIndex(1); // Only send data if temperature has changed and no error if (lastTemperature != tempC && tempC != -127.00) { // Send in the new temperature gw.send(tempMsg.set(tempC,1)); lastTemperature=tempC; } } -
what does the Serial output show during execution of the sketch?
-
@BulldogLowell Unfortunately I don't have a way to test that yet... I'm uploading the sketch using an arduino uno, and I have no idea how to do that with it. I do have an FTDI serial adapter but is not picked up by the IDE, it was at some point but no longer... probably fake :|
-
I don't know what's the issue, but I'd still prefer a normal timing code instead of just the gw.wait(). The fetching of temperatures in every loop makes no sense to me.
-
I don't know what's the issue, but I'd still prefer a normal timing code instead of just the gw.wait(). The fetching of temperatures in every loop makes no sense to me.
@m26872 If you have time, could you please tell me how to do that, I know you've posted a link a few post back but I didn't do much with it :(
-
@m26872 If you have time, could you please tell me how to do that, I know you've posted a link a few post back but I didn't do much with it :(
@CaptainZap You should not query dallas sensor temperature every 750 ms. This heats up sensor itself and quite useless.
Use something like this:
unsigned long SLEEP_TIME = 30000; // Sleep time between reports (in milliseconds) unsigned long lastRefreshTime = 0; void loop() { gw.wait(100); boolean bNeedRefresh = (millis() - lastRefreshTime) > SLEEP_TIME; if (bNeedRefresh) { lastRefreshTime = millis(); DallasSensors.requestTemperatures(); gw.wait(750); float tempC = DallasSensors.getTempCByIndex(1); float difference = lastTemperature - tempC; if (tempC != -127.00 && abs(difference) > 0.5) { // Send in the new temperature gw.send(tempMsg.set(tempC, 1)); lastTemperature = tempC; } } } -
@CaptainZap You should not query dallas sensor temperature every 750 ms. This heats up sensor itself and quite useless.
Use something like this:
unsigned long SLEEP_TIME = 30000; // Sleep time between reports (in milliseconds) unsigned long lastRefreshTime = 0; void loop() { gw.wait(100); boolean bNeedRefresh = (millis() - lastRefreshTime) > SLEEP_TIME; if (bNeedRefresh) { lastRefreshTime = millis(); DallasSensors.requestTemperatures(); gw.wait(750); float tempC = DallasSensors.getTempCByIndex(1); float difference = lastTemperature - tempC; if (tempC != -127.00 && abs(difference) > 0.5) { // Send in the new temperature gw.send(tempMsg.set(tempC, 1)); lastTemperature = tempC; } } }@robosensor Thanks so much, I highly appreciate your comments. Will test this tomorrow, and hopefully, soon share my hardware designs :D
-
Just uploaded the new sketch to my nodes, one built on a pro mini, and one built on a nano (got one to view serial output), however both nodes have the same behavior when added to the Vera unit... the repeater node doesn't show up (is this somehow related to UI7 ?), and the weird thing is that temperature value is never populated.
Regarding the repeater, looking into the user_data output I can see that a repeater node is created, but it's not used as a parent device for the sensors... as all sensors have as parent the gateway. I'm using this version of the plugin :
https://github.com/mysensors/Vera/tree/UI7This is the serial monitor output from the nano :
repeater started, id 13 send: 13-13-1-0 s=255,c=0,t=18,pt=0,l=5,st=ok:1.4.1 send: 13-13-1-0 s=255,c=3,t=6,pt=1,l=1,st=ok:1 send: 13-13-1-0 s=255,c=3,t=11,pt=0,l=12,st=ok:Multi Sensor send: 13-13-1-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.1 send: 13-13-1-0 s=1,c=0,t=0,pt=0,l=0,st=ok: send: 13-13-1-0 s=3,c=0,t=6,pt=0,l=0,st=ok: send: 13-13-1-0 s=2,c=0,t=1,pt=0,l=0,st=ok: send: 13-13-1-0 s=1,c=1,t=16,pt=2,l=2,st=ok:0This is the updated sketch:
//This sketch is for Door & Motion & Temp Sensor //rev3 - changed temp pin to 5 & temperature logic re-worked #include <MySensor.h> #include <SPI.h> #include <DallasTemperature.h> #include <OneWire.h> #include <Bounce2.h> #define CLIENT_ID AUTO // Sets MYSensors client id #define RADIO_CH 76 // Sets MYSensors to use Radio Channel #define TRIGGER 3 // used to connect motion sensor #define BUTTON_PIN 4 // used to connect door/window sensor //Temp Sensor bits #define ONE_WIRE_BUS 5 // Pin where dallas sensor is connected - on Rboard this is A0(D14) OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DallasSensors(&oneWire); float lastTemperature ; #define CHILD_ID_T1 3 //CHILD ID for temp //Door/Window bits #define CHILD_ID_D1 1 //CHILD ID for door/window //Trigger Sensor Bits #define CHILD_ID_S1 2 //CHILD ID for Motion sensor boolean lastTripped = 0; unsigned long SLEEP_TIME = 30000; // Sleep time between reports (in milliseconds) unsigned long lastRefreshTime = 0; MySensor gw; Bounce debouncer = Bounce(); int oldValue=-1; // Change to V_LIGHT if you use S_LIGHT in presentation below MyMessage msg(CHILD_ID_D1,V_TRIPPED); MyMessage triggerMsg(CHILD_ID_S1,V_TRIPPED); MyMessage tempMsg(CHILD_ID_T1,V_TEMP); void setup() { // Startup OneWire Temp Sensors DallasSensors.begin(); DallasSensors.setWaitForConversion(false); // Initialize library and add callback for incoming messages gw.begin(NULL, AUTO, true); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Multi Sensor", "1.1"); // Register all sensors to gw (they will be created as child devices) gw.present(CHILD_ID_D1, S_DOOR); gw.present(CHILD_ID_T1, S_TEMP); gw.present(CHILD_ID_S1, S_MOTION); // Setup the button pinMode(BUTTON_PIN,INPUT); // Activate internal pull-up digitalWrite(BUTTON_PIN,HIGH); // After setting up the button, setup debouncer debouncer.attach(BUTTON_PIN); debouncer.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. } void loop() { // Alway process incoming messages whenever possible gw.process(); // Check for motion change value boolean tripped = digitalRead(TRIGGER) == HIGH; if (lastTripped != tripped ) { gw.send(triggerMsg.set(tripped?"1":"0")); // Send new state and request ack back Serial.println("Tripped"); lastTripped=tripped; } // Check if digital input has changed and send in new value debouncer.update(); // Get the update value int value = debouncer.read(); if (value != oldValue) { // Send in the new value gw.send(msg.set(value==HIGH ? 1 : 0)); oldValue = value; } gw.wait(100); boolean bNeedRefresh = (millis() - lastRefreshTime) > SLEEP_TIME; if (bNeedRefresh) { lastRefreshTime = millis(); DallasSensors.requestTemperatures(); gw.wait(750); float tempC = DallasSensors.getTempCByIndex(1); float difference = lastTemperature - tempC; if (tempC != -127.00 && abs(difference) > 0.5) { // Send in the new temperature gw.send(tempMsg.set(tempC, 1)); lastTemperature = tempC; } } }Any feedback will be appreciated. Thanks.
-
Can anyone share their thoughts ? I've been running two identical nodes, with no temperature output for a few days now :(
-
Can anyone share their thoughts ? I've been running two identical nodes, with no temperature output for a few days now :(
@CaptainZap Did you delete the original devices from Vera after you changed the code? I had something similar happen when I rewrote a sketch to modify battery monitoring and Vera would not show the new data. I deleted the node and child devices and reincluded them from scratch and then it worked.