Trouble combining sketches for temp and motion control



  • Hi,

    So I am new to building sensors.

    I have managed to build a ethernet gateway and have this connect to my Vera2.

    Furthermore I have succeeded in building temperature and motion sensors.

    So far so good.

    Now I want to combine the sensors in a new sensor - a 230V powered motion and temp sensor (based on a Nano-clone)

    I have search the forum to see if anyone else has made this kind of sensor (for me to copy the sketch) but with no luck.

    I have the tried to combine the temp sketch and the motion sketch from the build-page, into the below sketch but the sketch wont compile. I have no experience in this so my combination is mostly based on gut-feeling 🙂

    Is there any one who can have a look at the sketch and explain where I go wrong or even better - are there anyone with a similar sensor and working sketch that I can use?

    #include <MySensor.h>
    #include <SPI.h>
    #include <DallasTemperature.h>
    #include <OneWire.h>

    #define CHILD_ID_MOT 2 // Id of the sensor child
    #define ONE_WIRE_BUS 4 // 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);

    #define DIGITAL_INPUT_SENSOR 3 // The digital input you attached your motion sensor. (Only 2 and 3 generates interrupt!)
    #define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway)

    MySensor gw;
    float lastTemperature[MAX_ATTACHED_DS18B20];
    int numSensors=0;
    boolean receivedConfig = false;
    boolean metric = true;
    // Initialize temperature message
    MyMessage msg(0,V_TEMP);

    // Initialize motion message
    MyMessage msgMot(CHILD_ID_MOT, V_TRIPPED);

    void setup()
    {
    sensors.begin();

    gw.begin();

    // Send the sketch version information to the gateway and Controller
    gw.sendSketchInfo("Motion Sensor", "1.0");

    numSensors = sensors.getDeviceCount();

    for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
    gw.present(i, S_TEMP);

    pinMode(DIGITAL_INPUT_SENSOR, INPUT); // sets the motion sensor digital pin as input
    // Register all sensors to gw (they will be created as child devices)
    gw.present(CHILD_ID_MOT, S_MOTION);

    // Send the sketch version information to the gateway and Controller
    gw.sendSketchInfo("Temperature Sensor", "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);
    }
    }

    void loop()
    {

    // Read digital motion value
    boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH;

    Serial.println(tripped);
    gw.send(msg.set(tripped?"1":"0")); // Send tripped value to gw

    {
    // 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;
    }
    

    }

    // Sleep until interrupt comes in on motion sensor. Send update every two minute.
    gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);
    }
    }

    Thanks!


  • Admin

    Here is a sketch I use myself. A combination of hum/temp (DHT) and motion.

    It reports motion status on motion or every 30 sec.

    #include <SPI.h>
    #include <MySensor.h>  
    #include <DHT.h>  
    
    #define CHILD_ID_HUM 0
    #define CHILD_ID_TEMP 1
    #define CHILD_ID_MOTION 3
    
    #define HUMIDITY_SENSOR_DIGITAL_PIN 6
    #define MOTION_SENSOR_PIN 3
    #define INTERRUPT MOTION_SENSOR_PIN-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
    
    unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
    
    MySensor gw;
    DHT dht;
    float lastTemp;
    float lastHum;
    boolean metric = true; 
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    MyMessage msgMotion(CHILD_ID_MOTION, V_TRIPPED);
    
    
    void setup()  
    { 
      gw.begin();
      dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN); 
    
      // Send the Sketch Version Information to the Gateway
      gw.sendSketchInfo("Multi Motion+Hum", "1.0");
    
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID_HUM, S_HUM);
      gw.present(CHILD_ID_TEMP, S_TEMP);
    
      pinMode(MOTION_SENSOR_PIN, INPUT);      // sets the motion sensor digital pin as input
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID_MOTION, S_MOTION);
      
      metric = gw.getConfig().isMetric;
    }
    
    void loop()      
    {  
      // Read digital motion value
      boolean tripped = digitalRead(MOTION_SENSOR_PIN) == HIGH; 
      
      Serial.print("Tripped: ");
      Serial.println(tripped);
      gw.send(msgMotion.set(tripped?"1":"0"));  // Send tripped value to gw 
    
      delay(dht.getMinimumSamplingPeriod());
    
      float temperature = dht.getTemperature();
      if (isnan(temperature)) {
          Serial.println("Failed reading temperature from DHT");
      } else if (temperature != lastTemp) {
        lastTemp = temperature;
        if (!metric) {
          temperature = dht.toFahrenheit(temperature);
        }
        gw.send(msgTemp.set(temperature, 1));
        Serial.print("T: ");
        Serial.println(temperature);
      }
      
      float humidity = dht.getHumidity();
      if (isnan(humidity)) {
          Serial.println("Failed reading humidity from DHT");
      } else if (humidity != lastHum) {
          lastHum = humidity;
          gw.send(msgHum.set(humidity, 1));
          Serial.print("H: ");
          Serial.println(humidity);
      }
      
      gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);
    }
    
    
    


  • @hek Wow - thanks for a fast reply

    I have used a some what similar sketch as a basis and I guess I go wrong when adapting the sketch to the Dallas sensor which I presume is needed?


  • Admin

    The DHT11/22 sensor gives both temperature and humidity.



  • @hek But I was hoping to use the DS18b20?


  • Admin

    Yep, I know. This was just an example how I combined them to help you a bit while exploring the wonderful world of embedded programming 😉



  • I am gratefull 😉

    I will try to compare the sketches.



  • Hek, tried your sketch. Motion works but not getting a temp reading on my Vera. Using the dht 22,sensor onto pin 6. Am I missing something? I'm using the same power that the motion uses on the nano.


  • Hardware Contributor

    Do you have a bare DHT that needs a resistor?
    link text
    What does the serial say?



  • It doesnt give a reading for temperature or humidity. Sensor works. Yeah it's the solder free module dht 22 that has the three pronges



  • @davvvvvo Did you re-include the node after changing the sketch? What controller are you using? Post your sketch using the </> tool.



  • @Dwalt yes I removed the node off Vera U7 and re added it as instructions say. Using Nana serial controller. The motion sensor works perfectly. I'm using hek sketch, I just cut and paste the sketch into to program and compiled and uploaded. Do I need a resistor with the dht 22 temp sensor because I don't have one on it at the moment.



  • @davvvvvo If you used Hek's sketch above and your DHT is connected to pin 6 and the PIR on pin 3, it should work. How are you powering the DHT and PIR? You should be using the nano's 5v. You do not need a separate resistor on the DHT module (3 pins), it has one onboard the module. Are you seeing the temp and hum child devices in Vera? If so, try powering the node off-on and reloading the Vera page.



  • @Dwalt I'm powering both sensors off the 5v pin on the board so they are sharing the power. Temp is on pin 6. All three nodes added to Vera. I can arm or bypass the motion and this works, the temp and humidity node are on Vera but not showing any numbers. Temp is at 0 degrees and humidity is at 0%. I tried cycling the nodes off and on a few times. With no results.



  • @davvvvvo If you eliminate any wiring mistakes, I assume you must have a bad DHT sensor. You could try it without the PIR and load up the basic temp/hum sketch to see if it works or see if you can see anything through the serial log.



  • @Dwalt Just used the DHT sensor on its own and loaded the humidity sketch and it works perfectly. did try and load the dallas temp sketch and that didnt work on its own. Question will i need to upload if there is one someting like a dallas.JSON or or another XML onto vera for hek's sketch to work possibly?



  • @davvvvvo The Dallas sensor is completely different from the DHT and does not factor into your setup. The DHT provides both temp and humidity. The Dallas temp sensor uses a separate library for pulling data from that particular sensor. Can you post your serial log from your sensor with both DHT and PIR connected using the sketch Hek provided above? That would tell us what is happening at the communication level between the sensor node and gateway.



  • @Dwalt how do i go about gathering the serial log. Can i plug in the sensor and download the serial log with the arduino program



  • This post is deleted!


  • @Dwalt
    sensor started, id 2
    send: 2-2-0-0 s=255,c=0,t=17,pt=0,l=5,st=ok:1.4.1
    send: 2-2-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
    send: 2-2-0-0 s=255,c=3,t=11,pt=0,l=16,st=ok:Multi Motion+Hum
    send: 2-2-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
    send: 2-2-0-0 s=0,c=0,t=7,pt=0,l=0,st=ok:
    send: 2-2-0-0 s=1,c=0,t=6,pt=0,l=0,st=ok:
    send: 2-2-0-0 s=3,c=0,t=1,pt=0,l=0,st=ok:
    Tripped: 0
    send: 2-2-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
    Failed reading temperature from DHT
    Failed reading humidity from DHT
    Tripped: 0
    send: 2-2-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
    Failed reading temperature from DHT
    Failed reading humidity from DHT
    Tripped: 0
    send: 2-2-0-0 s=3,c=1,t=16,pt=0,l=1,st=ok:0
    Failed reading temperature from DHT
    Failed reading humidity from DHT


  • Hardware Contributor

    Its a problem with the DHT, the setup between Arduino and DHT sensor i think...

    -Tried another DHT-Sensor or bare DHT code?
    -Tried another inputpin on the arduino (i got this message when i didnt solder the pin properly)
    -Check/change wiring.

    Also try the delay(dht.getMinimumSamplingPeriod()); before the motion sensor code and see if this changes anything.



  • @sundberg84 I have two DHT22 sensors which I have tried both. They both work when I run the humidity sketch on its own but not when I try this sketch. Having never written code before this "delay(dht.getMinimumSamplingPeriod());" I have no clue what this is. Also if I used pin 5 for example how would I go changing the code to represent this. Cheers everyone so far for your help fault finding what's wrong with my set up. I don't usually give up but this simple one is testing my patients to the point I might just run a temp sensor on its own.


  • Hero Member

    @davvvvvo

    "delay(dht.getMinimumSamplingPeriod());" is used to not retrieve info from the DHT22 too often. The sensors don't respond if polled too frequently and this is a function in the DHT library. To change the sketch to use pin 5, change this line:

    #define HUMIDITY_SENSOR_DIGITAL_PIN 6

    to

    #define HUMIDITY_SENSOR_DIGITAL_PIN 5

    Is the sketch you are using identical to the one @hek posted? How are you powering your board?

    Cheers
    Al



  • @Sparkman yes it's the same sketch hek uploaded word for word. Powering using a phone charger 5v 1amp. Im putting it down to I might have a faulty pin 6 or the sketch doesn't play well with Vera and the plugin. Does anyone have another sketch?


Log in to reply
 

Suggested Topics

  • 3
  • 5
  • 6
  • 6

0
Online

11.4k
Users

11.1k
Topics

112.7k
Posts