DHT plus two relays



  • HI Everyone,

    I have my temp/hum sensor in my AV cab and what two computer fans to cool it down. I have tried this and it originally worked with one relay and I got creative and screwed it up. When i tried to get it back to the original version i couldn't as I yes saved over it. I have checked on the forum and see projects like this but they don't appear to work. Can should one give a few pointers?

    #define MY_DEBUG
    #define MY_RADIO_NRF24
    #define MY_REPEATER_FEATURE
    #define MY_NODE_ID 29
    
    #include <MyConfig.h>
    #include <MySensors.h>
    #include <SPI.h>
    #include <DHT.h>
    
    
    #define DHT_DATA_PIN 3
    #define RELAY_1  4 
    #define CHILD_ID_HUM 28
    #define CHILD_ID_TEMP 29
    #define NUMBER_OF_RELAYS 1
    #define RELAY_ON 1 
    #define RELAY_OFF 0
    #define SENSOR_TEMP_OFFSET 0
    
    static const uint64_t UPDATE_INTERVAL = 40000;
    static const uint8_t FORCE_UPDATE_N_READS = 10;
    
    float lastTemp;
    float lastHum;
    uint8_t nNoUpdatesTemp;
    uint8_t nNoUpdatesHum;
    bool metric = true;
    
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    DHT dht;
    
    void before()
    {
    for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
    pinMode(pin, OUTPUT);
    digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
    }
    }
    
    void presentation()
    {
    sendSketchInfo("TempHumRelay", "1.2");
      present(CHILD_ID_HUM, S_HUM);
      present(CHILD_ID_TEMP, S_TEMP);
      metric = getControllerConfig().isMetric;
      for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
      present(sensor, S_BINARY);
    }
    }
    
    void setup()
    {
     dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
      if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
        Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
      }
        sleep(dht.getMinimumSamplingPeriod());
    }
    void loop()
    {
       dht.readSensor(true);
      float temperature = dht.getTemperature();
      if (isnan(temperature)) {
        Serial.println("Failed reading temperature from DHT!");
      } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
        lastTemp = temperature;
        if (!metric) {
          temperature = dht.toFahrenheit(temperature);
        }
        nNoUpdatesTemp = 0;
        temperature += SENSOR_TEMP_OFFSET;
        send(msgTemp.set(temperature, 1));
    
        #ifdef MY_DEBUG
        Serial.print("T: ");
        Serial.println(temperature);
        #endif
      } else {
        nNoUpdatesTemp++;
      }
      float humidity = dht.getHumidity();
      if (isnan(humidity)) {
        Serial.println("Failed reading humidity from DHT");
      } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
        lastHum = humidity;
        nNoUpdatesHum = 0;
        send(msgHum.set(humidity, 1));
    
        #ifdef MY_DEBUG
        Serial.print("H: ");
        Serial.println(humidity);
        #endif
      } else {
        nNoUpdatesHum++;
      }
      sleep(UPDATE_INTERVAL); 
    }
    void receive(const MyMessage &message)
    {
      if (message.type==V_STATUS) {
        digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
        saveState(message.sensor, message.getBool());
        Serial.print("Incoming change for sensor:");
        Serial.print(message.sensor);
        Serial.print(", New status: ");
        Serial.println(message.getBool());
      }  }
    

  • Mod

    @Newzwaver in what way doesn't it work? It would be easier to help you if we knew what to look for 🙂

    My best guess so far is that the node goes to sleep, which means it can not receive changes to the relays.



  • I am only speculating, but I think that he is missing the MySensors part of things. It sounds like he wants to run two relays with a temp/hum sensor and that's it. So he tries a MySensors sketch and without a gateway to respond, the sketch just hangs waiting for a gateway to connect to. Again, I could be wrong.



  • This works whether its correct or not it is working again.
    // Enable debug prints to serial monitor
    #define MY_DEBUG

    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    #define MY_NODE_ID 31
    // Enable repeater functionality for this node
    #define MY_REPEATER_FEATURE

    #include <MyConfig.h>
    #include <MySensors.h>
    #include <SPI.h>
    #include <DHT.h>

    #define DHT_DATA_PIN 3
    #define RELAY_1 4 // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
    #define CHILD_ID_HUM 28
    #define CHILD_ID_TEMP 27
    #define NUMBER_OF_RELAYS 2 // Total number of attached relays
    #define RELAY_ON 1 // GPIO value to write to turn on attached relay
    #define RELAY_OFF 0 // GPIO value to write to turn off attached relay

    // 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 = 10000;

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

    float lastTemp;
    float lastHum;
    uint8_t nNoUpdatesTemp;
    uint8_t nNoUpdatesHum;
    bool metric = true;

    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    DHT dht;

    void before()
    {
    for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
    // Then set relay pins in output mode
    pinMode(pin, OUTPUT);
    // Set relay to last known state (using eeprom storage)
    digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
    }
    }

    void presentation()
    {
    // Send the sketch version information to the gateway and Controller
    sendSketchInfo("TempHum2Relay", "1.1B");
    // Register all sensors to gw (they will be created as child devices)
    present(CHILD_ID_HUM, S_HUM);
    present(CHILD_ID_TEMP, S_TEMP);
    metric = getControllerConfig().isMetric;
    for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
    // Register all sensors to gw (they will be created as child devices)
    present(sensor, S_BINARY);
    }
    }

    void setup()
    {
    dht.setup(DHT_DATA_PIN); // 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()
    {
    // 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;
    if (!metric) {
    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 for a while to save energy
    sleep(UPDATE_INTERVAL);
    }

    void receive(const MyMessage &message)
    {
    // We only expect one type of message from controller. But we better check anyway.
    if (message.type==V_STATUS) {
    // Change relay state
    digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
    // Store state in eeprom
    saveState(message.sensor, message.getBool());
    // Write some debug info
    Serial.print("Incoming change for sensor:");
    Serial.print(message.sensor);
    Serial.print(", New status: ");
    Serial.println(message.getBool());

    } }



  • @Newzwaver When you post code, it helps out a lot if you use the code tag button </> before pasting in your code.

    The other alternative which is basically what the code tag button does is to put 3 tick marks ( ``` ) before and after your code.

    It keeps the code indented and makes it MUCH easier to read.


 

302
Online

7.5k
Users

8.4k
Topics

90.3k
Posts