Navigation

    • Register
    • Login
    • OpenHardware.io
    • Categories
    • Recent
    • Tags
    • Popular
    1. Home
    2. McPostal
    • Profile
    • Following
    • Followers
    • Topics
    • Posts
    • Best
    • Groups

    McPostal

    @McPostal

    1
    Reputation
    3
    Posts
    265
    Profile views
    0
    Followers
    0
    Following
    Joined Last Online

    McPostal Follow

    Best posts made by McPostal

    • RE: 3-in-1 Humidity Temp and Motion

      I combined Motion and Air Humidity and Sleep works. This is my first one and I'm pretty sure I have some unnecessary code in it.

      /**
       * The MySensors Arduino library handles the wireless radio link and protocol
       * between your home built sensors/actuators and HA controller of choice.
       * The sensors forms a self healing radio network with optional repeaters. Each
       * repeater and gateway builds a routing tables in EEPROM which keeps track of the
       * network topology allowing messages to be routed to nodes.
       *
       * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
       * Copyright (C) 2013-2015 Sensnology AB
       * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
       *
       * Documentation: http://www.mysensors.org
       * Support Forum: http://forum.mysensors.org
       *
       * This program is free software; you can redistribute it and/or
       * modify it under the terms of the GNU General Public License
       * version 2 as published by the Free Software Foundation.
       *
       *******************************
       *
       * REVISION HISTORY
       * Motion: Version 1.0 - Henrik Ekblad
       * 
       * Humidity: Version 1.0: Henrik EKblad
       * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
       * 
       * DESCRIPTION
       * Combination of Motion Sensor example and Air Humidity example
       * http://www.mysensors.org/build/motion
       * https://www.mysensors.org/build/humidity
       * 
       */
      
      // Enable debug prints
       #define MY_DEBUG
      
      // Enable and select radio type attached
      #define MY_RADIO_NRF24
      //#define MY_RADIO_RFM69
      
      #include <MySensors.h>
      #include <SPI.h>
      #include <DHT.h>
      
      float lastTemp;
      float lastHum;
      uint8_t nNoUpdatesTemp;
      uint8_t nNoUpdatesHum;
      unsigned long SLEEP_TIME = 60000; // Sleep time between reports (in milliseconds)
      #define MOTION_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
      #define DHT_INPUT_SENSOR 4     // The digital input of attached DHT sensor
      
      // Set this offset if the sensor has a permanent small offset to the real temperatures
      #define SENSOR_TEMP_OFFSET 0
      
      // Sleep time between sensor updates (in milliseconds)
      // Must be >1000ms for DHT22 and >2000ms for DHT11
      static const uint64_t UPDATE_INTERVAL = 60000;
      
      // Force sending an update of the temperature after n sensor reads, so a controller showing the
      // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
      // the value didn't change since;
      // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
      static const uint8_t FORCE_UPDATE_N_READS = 10;
      
      #define CHILD_ID_HUMID 0        // ID of the Humidity child
      #define CHILD_ID_TEMP 1         // ID of the Tempurature child
      #define CHILD_ID_MOTION1 2   // Id of the Motion sensor child
      
      // Initialize motion message
      MyMessage msgMotion(CHILD_ID_MOTION1, V_TRIPPED);
      MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
      MyMessage msgHum(CHILD_ID_HUMID, V_HUM);
      DHT dht;
      
      
      void presentation()
      {
        // Send the sketch version information to the gateway and Controller
        sendSketchInfo("Motion Temp Humidity", "1.0");
      
        // Register all sensors to gw (they will be created as child devices)
        present(CHILD_ID_MOTION1, S_MOTION);
        present(CHILD_ID_TEMP, V_TEMP);
        present(CHILD_ID_HUMID, V_HUM);
      }
      
      void setup()
      {
      	pinMode(MOTION_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input
        dht.setup(DHT_INPUT_SENSOR); // set data pin of DHT sensor
        if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
          Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
        }
        // Sleep for the time of the minimum sampling period to give the sensor time to power up
        // (otherwise, timeout errors might occure for the first reading)
        sleep(dht.getMinimumSamplingPeriod());
      }
      
      
      
      void loop()
      {
      	// Read digital motion value
      	bool tripped = digitalRead(MOTION_INPUT_SENSOR) == HIGH;
      
      	Serial.println(tripped);
      	send(msgMotion.set(tripped?"1":"0"));  // Send tripped value to gw
      
        #ifdef MY_DEBUG
             Serial.print("Motion: ");
             Serial.println(tripped);
        #endif
      
      
      // DHT ****************************************************************************
        // Force reading sensor, so it works also after sleep()
        dht.readSensor(true);
      
        // Get temperature from DHT library
        float temperature = dht.getTemperature();
        if (isnan(temperature)) {
          Serial.println("Failed reading temperature from DHT!");
        } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
          // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
          lastTemp = temperature;
          temperature = dht.toFahrenheit(temperature);
        
          // Reset no updates counter
          nNoUpdatesTemp = 0;
          temperature += SENSOR_TEMP_OFFSET;
          send(msgTemp.set(temperature, 1));
      
          #ifdef MY_DEBUG
          Serial.print("T: ");
          Serial.println(temperature);
          #endif
        } else {
          // Increase no update counter if the temperature stayed the same
          nNoUpdatesTemp++;
        }
      
        // Get humidity from DHT library
        float humidity = dht.getHumidity();
        if (isnan(humidity)) {
          Serial.println("Failed reading humidity from DHT");
        } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
          // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
          lastHum = humidity;
          // Reset no updates counter
          nNoUpdatesHum = 0;
          send(msgHum.set(humidity, 1));
      
          #ifdef MY_DEBUG
          Serial.print("H: ");
          Serial.println(humidity);
          #endif
        } else {
          // Increase no update counter if the humidity stayed the same
          nNoUpdatesHum++;
        }
      
      
      	// Sleep until interrupt comes in on motion sensor. Send update after (SLEEP_TIME) milliseconds has passed.
      	sleep(digitalPinToInterrupt(MOTION_INPUT_SENSOR), CHANGE, SLEEP_TIME);
      }
      posted in My Project
      McPostal
      McPostal

    Latest posts made by McPostal

    • RE: 3-in-1 Humidity Temp and Motion

      @stocken

      Under "void presentation()" , present(CHILD_ID_MOT, V_TRIPPED); //me should be

      present(CHILD_ID_MOT, S_MOTION); //me

      that should fix the light level problem.

      I haven't done a relay yet. If no one else responds I look at it later tonight. I also have a relay but haven't had time to try and implement it yet.

      posted in My Project
      McPostal
      McPostal
    • RE: 3-in-1 Humidity Temp and Motion

      Nice! I realized the motion was being updated every cycle after I posted my code. I also left out references to metric temperature readings. I fixed the motion part in my code but didn't post it yet because I had already added a second motion sensor. What I did different was not forcing the motion update. I want the time stamp to reflect the last time someone was in the room.

      posted in My Project
      McPostal
      McPostal
    • RE: 3-in-1 Humidity Temp and Motion

      I combined Motion and Air Humidity and Sleep works. This is my first one and I'm pretty sure I have some unnecessary code in it.

      /**
       * The MySensors Arduino library handles the wireless radio link and protocol
       * between your home built sensors/actuators and HA controller of choice.
       * The sensors forms a self healing radio network with optional repeaters. Each
       * repeater and gateway builds a routing tables in EEPROM which keeps track of the
       * network topology allowing messages to be routed to nodes.
       *
       * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
       * Copyright (C) 2013-2015 Sensnology AB
       * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
       *
       * Documentation: http://www.mysensors.org
       * Support Forum: http://forum.mysensors.org
       *
       * This program is free software; you can redistribute it and/or
       * modify it under the terms of the GNU General Public License
       * version 2 as published by the Free Software Foundation.
       *
       *******************************
       *
       * REVISION HISTORY
       * Motion: Version 1.0 - Henrik Ekblad
       * 
       * Humidity: Version 1.0: Henrik EKblad
       * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
       * 
       * DESCRIPTION
       * Combination of Motion Sensor example and Air Humidity example
       * http://www.mysensors.org/build/motion
       * https://www.mysensors.org/build/humidity
       * 
       */
      
      // Enable debug prints
       #define MY_DEBUG
      
      // Enable and select radio type attached
      #define MY_RADIO_NRF24
      //#define MY_RADIO_RFM69
      
      #include <MySensors.h>
      #include <SPI.h>
      #include <DHT.h>
      
      float lastTemp;
      float lastHum;
      uint8_t nNoUpdatesTemp;
      uint8_t nNoUpdatesHum;
      unsigned long SLEEP_TIME = 60000; // Sleep time between reports (in milliseconds)
      #define MOTION_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
      #define DHT_INPUT_SENSOR 4     // The digital input of attached DHT sensor
      
      // Set this offset if the sensor has a permanent small offset to the real temperatures
      #define SENSOR_TEMP_OFFSET 0
      
      // Sleep time between sensor updates (in milliseconds)
      // Must be >1000ms for DHT22 and >2000ms for DHT11
      static const uint64_t UPDATE_INTERVAL = 60000;
      
      // Force sending an update of the temperature after n sensor reads, so a controller showing the
      // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
      // the value didn't change since;
      // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
      static const uint8_t FORCE_UPDATE_N_READS = 10;
      
      #define CHILD_ID_HUMID 0        // ID of the Humidity child
      #define CHILD_ID_TEMP 1         // ID of the Tempurature child
      #define CHILD_ID_MOTION1 2   // Id of the Motion sensor child
      
      // Initialize motion message
      MyMessage msgMotion(CHILD_ID_MOTION1, V_TRIPPED);
      MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
      MyMessage msgHum(CHILD_ID_HUMID, V_HUM);
      DHT dht;
      
      
      void presentation()
      {
        // Send the sketch version information to the gateway and Controller
        sendSketchInfo("Motion Temp Humidity", "1.0");
      
        // Register all sensors to gw (they will be created as child devices)
        present(CHILD_ID_MOTION1, S_MOTION);
        present(CHILD_ID_TEMP, V_TEMP);
        present(CHILD_ID_HUMID, V_HUM);
      }
      
      void setup()
      {
      	pinMode(MOTION_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input
        dht.setup(DHT_INPUT_SENSOR); // set data pin of DHT sensor
        if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
          Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
        }
        // Sleep for the time of the minimum sampling period to give the sensor time to power up
        // (otherwise, timeout errors might occure for the first reading)
        sleep(dht.getMinimumSamplingPeriod());
      }
      
      
      
      void loop()
      {
      	// Read digital motion value
      	bool tripped = digitalRead(MOTION_INPUT_SENSOR) == HIGH;
      
      	Serial.println(tripped);
      	send(msgMotion.set(tripped?"1":"0"));  // Send tripped value to gw
      
        #ifdef MY_DEBUG
             Serial.print("Motion: ");
             Serial.println(tripped);
        #endif
      
      
      // DHT ****************************************************************************
        // Force reading sensor, so it works also after sleep()
        dht.readSensor(true);
      
        // Get temperature from DHT library
        float temperature = dht.getTemperature();
        if (isnan(temperature)) {
          Serial.println("Failed reading temperature from DHT!");
        } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
          // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
          lastTemp = temperature;
          temperature = dht.toFahrenheit(temperature);
        
          // Reset no updates counter
          nNoUpdatesTemp = 0;
          temperature += SENSOR_TEMP_OFFSET;
          send(msgTemp.set(temperature, 1));
      
          #ifdef MY_DEBUG
          Serial.print("T: ");
          Serial.println(temperature);
          #endif
        } else {
          // Increase no update counter if the temperature stayed the same
          nNoUpdatesTemp++;
        }
      
        // Get humidity from DHT library
        float humidity = dht.getHumidity();
        if (isnan(humidity)) {
          Serial.println("Failed reading humidity from DHT");
        } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
          // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
          lastHum = humidity;
          // Reset no updates counter
          nNoUpdatesHum = 0;
          send(msgHum.set(humidity, 1));
      
          #ifdef MY_DEBUG
          Serial.print("H: ");
          Serial.println(humidity);
          #endif
        } else {
          // Increase no update counter if the humidity stayed the same
          nNoUpdatesHum++;
        }
      
      
      	// Sleep until interrupt comes in on motion sensor. Send update after (SLEEP_TIME) milliseconds has passed.
      	sleep(digitalPinToInterrupt(MOTION_INPUT_SENSOR), CHANGE, SLEEP_TIME);
      }
      posted in My Project
      McPostal
      McPostal