Cobine working DHT22 and LDR with a RelayWithButtonActuator



  • DHT22 2x with LDR working node but I want the RelayWithButtonActuator integrate in it. Who can help me with that?

    This is what I have and working but without the RelayWithButtonAcuator.

    #include <SPI.h>
    #include <MySensor.h>
    #include <DHT.h>

    #define CHILD_ID_HUM1 0
    #define CHILD_ID_HUM2 1
    #define CHILD_ID_TEMP1 3
    #define CHILD_ID_TEMP2 4

    unsigned long SLEEP_TIME = 3000; // Sleep time between reads (in milliseconds)

    MySensor gw;
    DHT* dht[2];
    byte sensorPin[2] = {3, 4};
    float lastTemp[2] = {0.0, 0.0};
    float lastHum[2] = {0.0, 0.0};

    boolean metric = true;
    //MyMessage msgHum(CHILD_ID_HUM1, V_HUM);
    //MyMessage msgTemp(CHILD_ID_TEMP1, V_TEMP);

    void setup()
    {
    gw.begin();
    for (int i = 0; i < 2; i++)
    {
    dht[i] = new DHT;
    dht[i]->setup(sensorPin[i]);
    }

    gw.sendSketchInfo("Humidity", "1.0");

    gw.present(CHILD_ID_HUM1, S_HUM);
    gw.present(CHILD_ID_HUM2, S_HUM);
    gw.present(CHILD_ID_TEMP1, S_TEMP);
    gw.present(CHILD_ID_TEMP1, S_TEMP);

    metric = gw.getConfig().isMetric;
    }

    void loop()
    {
    for (int i = 0; i < 2; i++)
    {
    delay(dht[i]->getMinimumSamplingPeriod());
    float temperature = dht[i]->getTemperature();
    if (isnan(temperature))
    {
    Serial.print(F("Failed reading temperature from DHT"));
    Serial.println(i);
    }
    else if (temperature != lastTemp[i])
    {
    lastTemp[i] = temperature;
    if (!metric)
    {
    temperature = dht[i]->toFahrenheit(temperature);
    }
    //gw.send(msgTemp.set(temperature, i));
    Serial.print(F("T"));
    Serial.print(i);
    Serial.print(F("= "));
    Serial.println(temperature);
    }
    float humidity = dht[i]->getHumidity();
    if (isnan(humidity))
    {
    Serial.print("Failed reading humidity from DHT");
    Serial.println(i);
    }
    else if (humidity != lastHum[i])
    {
    lastHum[i] = humidity;
    //gw.send(msgHum.set(humidity, 1));
    Serial.print(F("H"));
    Serial.print(i);
    Serial.print(F("= "));
    Serial.println(humidity);
    }
    }
    gw.sleep(SLEEP_TIME); //sleep a bit
    }


  • Mod



  • @mfalkvidd
    Thankt you for the reply, I used the instructions already but After 1 week of testing all solutions and nothing worked, I ask for help. I know, I lerned a lot by experimenting but Now I want a solution so I can try to understand what went wrong, ha ha.



  • is somebody interested in challanging my problem?


  • Contest Winner

    @Dick please note: i did not test it on an actual node but this combination should work

    #include <SPI.h>
    #include <MySensor.h>
    #include <DHT.h>
    #include <Bounce2.h>
    
    #define CHILD_ID_HUM1 0
    #define CHILD_ID_HUM2 1
    #define CHILD_ID_TEMP1 3
    #define CHILD_ID_TEMP2 4
    
    // RelayWithActuator stuff
    #define RELAY_PIN  4  // Arduino Digital I/O pin number for relay 
    #define BUTTON_PIN  3  // Arduino Digital I/O pin number for button 
    #define CHILD_ID 5   // Id of the sensor child
    #define RELAY_ON 1
    #define RELAY_OFF 0
    Bounce debouncer = Bounce(); 
    bool state;
    MySensor gw;
    MyMessage msg(CHILD_ID,V_LIGHT);
    
    #define HEARTBEAT       10
    unsigned int     timer = 0;
    // Sleep time between reads (in milliseconds)
    #define SLEEP_TIME      3000 
    
    DHT* dht[2];
    byte sensorPin[2] = {3, 4};
    float lastTemp[2] = {0.0, 0.0};
    float lastHum[2] = {0.0, 0.0};
    
    boolean metric = true;
    //MyMessage msgHum(CHILD_ID_HUM1, V_HUM);
    //MyMessage msgTemp(CHILD_ID_TEMP1, V_TEMP);
    
    void setup()
    {
      gw.begin(incomingMessage, AUTO, true);
      for (int i = 0; i < 2; i++)
      {
        dht[i] = new DHT;
        dht[i]->setup(sensorPin[i]);
      }
    
      gw.sendSketchInfo("HumidityAndRelay", "1.0");
    
      gw.present(CHILD_ID_HUM1, S_HUM);
      gw.present(CHILD_ID_HUM2, S_HUM);
      gw.present(CHILD_ID_TEMP1, S_TEMP);
      gw.present(CHILD_ID_TEMP1, S_TEMP);
    
       // Setup the button and Activate internal pull-up
      pinMode(BUTTON_PIN,INPUT_PULLUP);
      
      // After setting up the button, setup debouncer
      debouncer.attach(BUTTON_PIN);
      debouncer.interval(5);
    
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID, S_LIGHT);
    
      // Make sure relays are off when starting up
      digitalWrite(RELAY_PIN, RELAY_OFF);
      // Then set relay pins in output mode
      pinMode(RELAY_PIN, OUTPUT);   
          
      // Set relay to last known state (using eeprom storage) 
      state = gw.loadState(CHILD_ID);
      digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
     
      timer = 0;
      metric = gw.getConfig().isMetric;
    }
    
    void loop()
    {
      gw.process(); 
      timer++;
      
      if (timer > (SLEEP_TIME / HEARTBEAT))   
      { 
        // Reset timer again and for the next timed loop
        timer = 0;
        for (int i = 0; i < 2; i++)
        {
          delay(dht[i]->getMinimumSamplingPeriod());
          float temperature = dht[i]->getTemperature();
          if (isnan(temperature))
          {
            Serial.print(F("Failed reading temperature from DHT"));
            Serial.println(i);
          }
          else if (temperature != lastTemp[i])
          {
            lastTemp[i] = temperature;
            if (!metric)
            {
              temperature = dht[i]->toFahrenheit(temperature);
            }
            //gw.send(msgTemp.set(temperature, i));
            Serial.print(F("T"));
            Serial.print(i);
            Serial.print(F("= "));
            Serial.println(temperature);
          }
          float humidity = dht[i]->getHumidity();
          if (isnan(humidity))
          {
            Serial.print("Failed reading humidity from DHT");
            Serial.println(i);
          }
          else if (humidity != lastHum[i])
          {
            lastHum[i] = humidity;
            //gw.send(msgHum.set(humidity, 1));
            Serial.print(F("H"));
            Serial.print(i);
            Serial.print(F("= "));
            Serial.println(humidity);
          }
        }
      } 
      
      // Get the button update state (true if a change was detected) 
      if (debouncer.update() && debouncer.read() == 0) {
          gw.send(msg.set(state?false:true), true); // Send new state and request ack back
      }
      
      gw.wait(HEARTBEAT); //sleep a bit
    }
    
    void incomingMessage(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
      if (message.isAck()) {
         Serial.println("This is an ack from gateway");
      }
    
      if (message.type == V_LIGHT) {
         // Change relay state
         state = message.getBool();
         digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
         // Store state in eeprom
         gw.saveState(CHILD_ID, state);
        
         // Write some debug info
         Serial.print("Incoming change for sensor:");
         Serial.print(message.sensor);
         Serial.print(", New status: ");
         Serial.println(message.getBool());
       } 
    }
    


  • @BartE
    It works fine but the relay does not stay ON after changing the status from "0" to "1".
    Another thing is that the light messuring part is missing, it was the the script I posted. I will try to get it implemented in yours. So If you know how to change the behaviour of the relay, I should appreciate it.


  • Contest Winner

    @Dick how does relay exactly response to the button?
    If you press the button (and keep it down) is the relay turned on?
    or is it switched on when you release the button again?
    The button can be "reversed" connected (on = off and off - on)
    You can play a bit with this line

    if (debouncer.update() && debouncer.read() == HIGH) {
    

    or

    if (debouncer.update() && debouncer.read() == LOW) {
    

    and how is the button wired? Does is connect to ground or to Vcc (5 volt) ?
    This sketch requires connection to ground (with internal PULL-UP)

    About the light measuring ?? i just did copy your example from the first post and copied the RelayWithSwitch example in it. (Please notice the message part of sending humidity and temperature are still commented out as in the posted sketch)

    The part i did add my self is the timer stuff (so keeping the switched being probed while the DHT sensor is only probed twice a minute)

    Cheers BartE



  • @BartE The button connect to gnd to switch. if connected to gnd the relay switch for a second and than again in rest, also if I keept the switch to gnd so it is momentory.

    Also about the light sensor integration as stated in my last meassage, I was experimenting I only get an error BOLTED in my script "no matching function for call to 'MyMessage::MyMessage(int, mysensor_data, mysensor_data)'"

    #include <SPI.h>
    #include <MySensor.h>
    #include <DHT.h>
    #include <Bounce2.h>

    #define CHILD_ID_HUM1 0
    #define CHILD_ID_HUM2 1
    #define CHILD_ID_TEMP1 3
    #define CHILD_ID_TEMP2 4

    #define CHILD_ID_LIGHT 0
    #define LIGHT_SENSOR_ANALOG_PIN 0

    // RelayWithActuator stuff
    #define RELAY_PIN 5 // Arduino Digital I/O pin number for relay
    #define BUTTON_PIN A1 // Arduino Digital I/O pin number for button
    #define CHILD_ID 5 // Id of the sensor child
    #define RELAY_ON 1
    #define RELAY_OFF 0
    Bounce debouncer = Bounce();
    bool state;
    MySensor gw;
    MyMessage msg(CHILD_ID,V_LIGHT, V_LIGHT_LEVEL);bolded text
    int lastLightLevel;

    #define HEARTBEAT 10
    unsigned int timer = 0;
    // Sleep time between reads (in milliseconds)
    #define SLEEP_TIME 3000

    DHT* dht[2];
    byte sensorPin[2] = {3, 4};
    float lastTemp[2] = {0.0, 0.0};
    float lastHum[2] = {0.0, 0.0};

    boolean metric = true;
    //MyMessage msgHum(CHILD_ID_HUM1, V_HUM);
    //MyMessage msgTemp(CHILD_ID_TEMP1, V_TEMP);

    void setup()
    {
    gw.begin(incomingMessage, AUTO, true);
    for (int i = 0; i < 2; i++)
    {
    dht[i] = new DHT;
    dht[i]->setup(sensorPin[i]);
    }

    gw.sendSketchInfo("HumidityAndRelay", "1.0");

    gw.present(CHILD_ID_HUM1, S_HUM);
    gw.present(CHILD_ID_HUM2, S_HUM);
    gw.present(CHILD_ID_TEMP1, S_TEMP);
    gw.present(CHILD_ID_TEMP1, S_TEMP);
    gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);

    // Setup the button and Activate internal pull-up
    pinMode(BUTTON_PIN,INPUT_PULLUP);

    // After setting up the button, setup debouncer
    debouncer.attach(BUTTON_PIN);
    debouncer.interval(5);

    // Register all sensors to gw (they will be created as child devices)
    gw.present(CHILD_ID, S_LIGHT);

    // Make sure relays are off when starting up
    digitalWrite(RELAY_PIN, RELAY_OFF);
    // Then set relay pins in output mode
    pinMode(RELAY_PIN, OUTPUT);

    // Set relay to last known state (using eeprom storage)
    state = gw.loadState(CHILD_ID);
    digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);

    timer = 0;
    metric = gw.getConfig().isMetric;
    }

    void loop()
    {
    gw.process();
    timer++;

    if (timer > (SLEEP_TIME / HEARTBEAT))
    {
    // Reset timer again and for the next timed loop
    timer = 0;
    for (int i = 0; i < 2; i++)
    {
    delay(dht[i]->getMinimumSamplingPeriod());
    float temperature = dht[i]->getTemperature();
    if (isnan(temperature))
    {
    Serial.print(F("Failed reading temperature from DHT"));
    Serial.println(i);
    }
    else if (temperature != lastTemp[i])
    {
    lastTemp[i] = temperature;
    if (!metric)
    {
    temperature = dht[i]->toFahrenheit(temperature);
    }
    //gw.send(msgTemp.set(temperature, i));
    Serial.print(F("T"));
    Serial.print(i);
    Serial.print(F("= "));
    Serial.println(temperature);
    }
    float humidity = dht[i]->getHumidity();
    if (isnan(humidity))
    {
    Serial.print("Failed reading humidity from DHT");
    Serial.println(i);
    }
    else if (humidity != lastHum[i])
    {
    lastHum[i] = humidity;
    //gw.send(msgHum.set(humidity, 1));
    Serial.print(F("H"));
    Serial.print(i);
    Serial.print(F("= "));
    Serial.println(humidity);
    }

    int lightLevel = (1023-analogRead(LIGHT_SENSOR_ANALOG_PIN))/10.23;
    //Serial.println(lightLevel);
    if (lightLevel != lastLightLevel) {
    //gw.send(msg.set(lightLevel));

      //lastLightLevel = lightLevel;
      Serial.print("L=");
      
      Serial.println(lightLevel);
    
      
    }
    

    }

    // Get the button update state (true if a change was detected)
    if (debouncer.update() && debouncer.read() == 0) {
    gw.send(msg.set(state?false:true), true); // Send new state and request ack back
    }

    gw.wait(HEARTBEAT); //sleep a bit
    }

    void incomingMessage(const MyMessage &message) {
    // We only expect one type of message from controller. But we better check anyway.
    if (message.isAck()) {
    Serial.println("This is an ack from gateway");
    }

    if (message.type == V_LIGHT) {
    // Change relay state
    state = message.getBool();
    digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
    // Store state in eeprom
    gw.saveState(CHILD_ID, state);

     // Write some debug info
     Serial.print("Incoming change for sensor:");
     Serial.print(message.sensor);
     Serial.print(", New status: ");
     Serial.println(message.getBool());
    

    }
    }



  • @Dick
    I get some closer but not complete working. Did also some playing met de debounce but no result. here the script till now with the error log

    italicised texttempHumand_relay:24: error: redefinition of 'MyMessage msg'

    MyMessage msg(CHILD_ID_LIGHT, V_LIGHT_LEVEL);

              ^
    

    tempHumand_relay:23: error: 'MyMessage msg' previously declared here

    MyMessage msg(CHILD_ID,V_LIGHT);

           ^
    

    E:\Arduino Projects\tempHumand_relay\tempHumand_relay.ino: In function 'void setup()':

    tempHumand_relay:43: error: 'incomingMessage' was not declared in this scope

    gw.begin(incomingMessage, AUTO, true);

            ^
    

    E:\Arduino Projects\tempHumand_relay\tempHumand_relay.ino: In function 'void loop()':

    tempHumand_relay:151: error: a function-definition is not allowed here before '{' token

    void incomingMessage(const MyMessage &message) {

                                                ^
    

    tempHumand_relay:171: error: expected '}' at end of input

    }

    ^

    redefinition of 'MyMessage msg'

    and now the code till now

    #include <SPI.h>
    #include <MySensor.h>
    #include <DHT.h>
    #include <Bounce2.h>

    #define CHILD_ID_HUM1 0
    #define CHILD_ID_HUM2 1
    #define CHILD_ID_TEMP1 3
    #define CHILD_ID_TEMP2 4

    #define CHILD_ID_LIGHT 0
    #define LIGHT_SENSOR_ANALOG_PIN 0

    // RelayWithActuator stuff
    #define RELAY_PIN 5 // Arduino Digital I/O pin number for relay
    #define BUTTON_PIN A1 // Arduino Digital I/O pin number for button
    #define CHILD_ID 5 // Id of the sensor child
    #define RELAY_ON 1
    #define RELAY_OFF 0
    Bounce debouncer = Bounce();
    bool state;
    MySensor gw;
    MyMessage msg(CHILD_ID,V_LIGHT);
    MyMessage msg(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
    int lastLightLevel;

    #define HEARTBEAT 10
    unsigned int timer = 0;
    // Sleep time between reads (in milliseconds)
    #define SLEEP_TIME 3000

    DHT* dht[2];
    byte sensorPin[2] = {3, 4};
    float lastTemp[2] = {0.0, 0.0};
    float lastHum[2] = {0.0, 0.0};

    boolean metric = true;
    //MyMessage msgHum(CHILD_ID_HUM1, V_HUM);
    //MyMessage msgTemp(CHILD_ID_TEMP1, V_TEMP);

    void setup()
    {
    gw.begin(incomingMessage, AUTO, true);
    for (int i = 0; i < 2; i++)
    {
    dht[i] = new DHT;
    dht[i]->setup(sensorPin[i]);
    }

    gw.sendSketchInfo("HumidityAndRelay", "1.0");

    gw.present(CHILD_ID_HUM1, S_HUM);
    gw.present(CHILD_ID_HUM2, S_HUM);
    gw.present(CHILD_ID_TEMP1, S_TEMP);
    gw.present(CHILD_ID_TEMP1, S_TEMP);

    // Setup the button and Activate internal pull-up
    pinMode(BUTTON_PIN,INPUT_PULLUP);

    // After setting up the button, setup debouncer
    debouncer.attach(BUTTON_PIN);
    debouncer.interval(5);

    // Register all sensors to gw (they will be created as child devices)
    gw.present(CHILD_ID, S_LIGHT);

    // Make sure relays are off when starting up
    digitalWrite(RELAY_PIN, RELAY_OFF);
    // Then set relay pins in output mode
    pinMode(RELAY_PIN, OUTPUT);

    // Set relay to last known state (using eeprom storage)
    state = gw.loadState(CHILD_ID);
    digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);

    timer = 0;
    metric = gw.getConfig().isMetric;
    }

    void loop()
    {
    gw.process();
    timer++;

    if (timer > (SLEEP_TIME / HEARTBEAT))
    {
    // Reset timer again and for the next timed loop
    timer = 0;
    for (int i = 0; i < 2; i++)
    {
    delay(dht[i]->getMinimumSamplingPeriod());
    float temperature = dht[i]->getTemperature();
    if (isnan(temperature))
    {
    Serial.print(F("Failed reading temperature from DHT"));
    Serial.println(i);
    }
    else if (temperature != lastTemp[i])
    {
    lastTemp[i] = temperature;
    if (!metric)
    {
    temperature = dht[i]->toFahrenheit(temperature);
    }
    //gw.send(msgTemp.set(temperature, i));
    Serial.print(F("T"));
    Serial.print(i);
    Serial.print(F("= "));
    Serial.println(temperature);
    }
    float humidity = dht[i]->getHumidity();
    if (isnan(humidity))
    {
    Serial.print("Failed reading humidity from DHT");
    Serial.println(i);
    }
    else if (humidity != lastHum[i])
    {
    lastHum[i] = humidity;
    //gw.send(msgHum.set(humidity, 1));
    Serial.print(F("H"));
    Serial.print(i);
    Serial.print(F("= "));
    Serial.println(humidity);
    }

    int lightLevel = (1023-analogRead(LIGHT_SENSOR_ANALOG_PIN))/10.23;
    //Serial.println(lightLevel);
    if (lightLevel != lastLightLevel) {
    //gw.send(msg.set(lightLevel));

      //lastLightLevel = lightLevel;
      Serial.print("L=");
      
      Serial.println(lightLevel);
    
    
    
      
    }
    

    }

    // Get the button update state (true if a change was detected)
    if (debouncer.update() && debouncer.read() == 0) {
    gw.send(msg.set(state?false:true), true); // Send new state and request ack back
    }

    gw.wait(HEARTBEAT); //sleep a bit
    }

    void incomingMessage(const MyMessage &message) {
    // We only expect one type of message from controller. But we better check anyway.
    if (message.isAck()) {
    Serial.println("This is an ack from gateway");
    }

    if (message.type == V_LIGHT) {
    // Change relay state
    state = message.getBool();
    digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
    // Store state in eeprom
    gw.saveState(CHILD_ID, state);

     // Write some debug info
     Serial.print("Incoming change for sensor:");
     Serial.print(message.sensor);
     Serial.print(", New status: ");
     Serial.println(message.getBool());
    

    }
    }
    }

    bolded text


  • Contest Winner

    @Dick
    Couple of remarks

    This peice of code tries to declare the same variable twice (msg)

    MyMessage msg(CHILD_ID,V_LIGHT);
    MyMessage msg(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
    

    change to name to msgLight and msgLightLeven

    MyMessage msgLight(CHILD_ID,V_LIGHT);
    MyMessage msgLightLevel(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
    

    You also have to changethis line:

    gw.send(msg.set(state?false:true), true); // Send new state and request ack back
    

    to this

    gw.send(msgLight.set(state?false:true), true); // Send new state and request ack back
    

    Also this line

    gw.send(msg.set(lightLevel));
    

    needs to be adapted to

    gw.send(msgLightLevel.set(lightLevel));
    

    And i think the last } needs to be removed
    Oh and please use the code mark up function for posting source code
    (by using the </> icon)



  • thank you Bart, I am learning with these adjustment, how things work together aso. I change the code as you mentioned and still getting verifying errors as included. I hope you can help me so I can finish this, for me not so easy project.

    E:\Arduino Projects\tempHumand_relay\tempHumand_relay.ino: In function 'void setup()':

    tempHumand_relay:43: error: 'incomingMessage' was not declared in this scope

    gw.begin(incomingMessage, AUTO, true);

            ^
    

    E:\Arduino Projects\tempHumand_relay\tempHumand_relay.ino: In function 'void loop()':

    tempHumand_relay:130: error: 'msgLightLevel' was not declared in this scope

       gw.send(msgLightLevel.set(lightLevel));
    
               ^
    

    tempHumand_relay:145: error: 'msgLight' was not declared in this scope

       gw.send(msgLight.set(state?false:true), true); // Send new state and request ack back
    
               ^
    

    tempHumand_relay:151: error: a function-definition is not allowed here before '{' token

    void incomingMessage(const MyMessage &message) {

                                                ^
    

    tempHumand_relay:170: error: expected '}' at end of input

    }

    'incomingMessage' was not declared in this scope



  • does anyone know how to go on with the final part of this project?



  • Compilation finished without errors.
    but I sea nothing on my serial monitor. What could be the issue?The script is now

    #include <SPI.h>
    #include <MySensor.h>
    #include <DHT.h>
    #include <Bounce2.h>
    #define CHILD_ID_HUM1 0
    #define CHILD_ID_HUM2 1
    #define CHILD_ID_TEMP1 3
    #define CHILD_ID_TEMP2 4
    #define CHILD_ID_LIGHT 0
    #define LIGHT_SENSOR_ANALOG_PIN 0
    // RelayWithActuator stuff
    #define RELAY_PIN 5 // Arduino Digital I/O pin number for relay
    #define BUTTON_PIN A1 // Arduino Digital I/O pin number for button
    #define CHILD_ID 5 // Id of the sensor child
    #define RELAY_ON 1
    #define RELAY_OFF 0
    Bounce debouncer = Bounce();
    bool state;
    MySensor gw;
    MyMessage msgLight(CHILD_ID,V_LIGHT); MyMessage msgLightLevel(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
    int lastLightLevel;
    #define HEARTBEAT 10
    unsigned int timer = 0;
    // Sleep time between reads (in milliseconds)
    #define SLEEP_TIME 3000
    DHT* dht[2];
    byte sensorPin[2] = {3, 4};
    float lastTemp[2] = {0.0, 0.0};
    float lastHum[2] = {0.0, 0.0};
    boolean metric = true;
    //MyMessage msgHum(CHILD_ID_HUM1, V_HUM);
    //MyMessage msgTemp(CHILD_ID_TEMP1, V_TEMP);
    void setup()
    {
    //gw.begin(incomingMessage, AUTO, true);
    gw.sendSketchInfo("HumidityAndRelay", "1.0");
    
    for (int i = 0; i < 2; i++)
    {
    dht[i] = new DHT;
    dht[i]->setup(sensorPin[i]);
    }
    
    gw.present(CHILD_ID_HUM1, S_HUM);
    gw.present(CHILD_ID_HUM2, S_HUM);
    gw.present(CHILD_ID_TEMP1, S_TEMP);
    gw.present(CHILD_ID_TEMP1, S_TEMP);
    // Setup the button and Activate internal pull-up
    pinMode(BUTTON_PIN,INPUT_PULLUP);
    // After setting up the button, setup debouncer
    debouncer.attach(BUTTON_PIN);
    debouncer.interval(5);
    // Register all sensors to gw (they will be created as child devices)
    gw.present(CHILD_ID, S_LIGHT);
    // Make sure relays are off when starting up
    digitalWrite(RELAY_PIN, RELAY_OFF);
    // Then set relay pins in output mode
    pinMode(RELAY_PIN, OUTPUT);
    // Set relay to last known state (using eeprom storage)
    state = gw.loadState(CHILD_ID);
    digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
    timer = 0;
    metric = gw.getConfig().isMetric;
    }
    void loop()
    {
    gw.process();
    timer++;
    if (timer > (SLEEP_TIME / HEARTBEAT))
    {
    // Reset timer again and for the next timed loop
    timer = 0;
    for (int i = 0; i < 2; i++)
    {
    delay(dht[i]->getMinimumSamplingPeriod());
    float temperature = dht[i]->getTemperature();
    if (isnan(temperature))
    {
    Serial.print(F("Failed reading temperature from DHT"));
    Serial.println(i);
    }
    else if (temperature != lastTemp[i])
    {
    lastTemp[i] = temperature;
    if (!metric)
    {
    temperature = dht[i]->toFahrenheit(temperature);
    }
    //gw.send(msgTemp.set(temperature, );
    Serial.print(F("T"));
    Serial.print(i);
    Serial.print(F("= "));
    Serial.println(temperature);
    }
    float humidity = dht[i]->getHumidity();
    if (isnan(humidity))
    {
    Serial.print("Failed reading humidity from DHT");
    Serial.println(i);
    }
    else if (humidity != lastHum[i])
    {
    lastHum[i] = humidity;
    //gw.send(msgHum.set(humidity, 1));
    Serial.print(F("H"));
    Serial.print(i);
    Serial.print(F("= "));
    Serial.println(humidity);
    }
    int lightLevel = (1023-analogRead(LIGHT_SENSOR_ANALOG_PIN))/10.23;
    //Serial.println(lightLevel);
    if (lightLevel != lastLightLevel) {
    gw.send(msgLightLevel.set(lightLevel));
    
      //lastLightLevel = lightLevel;
      Serial.print("L=");
      
      Serial.println(lightLevel);
    
    
    
      
    }
    }
    // Get the button update state (true if a change was detected)
    if (debouncer.update() && debouncer.read() == 0) {
    gw.send(msgLight.set(state?false:true), true); // Send new state and request ack back
    }
    gw.wait(HEARTBEAT); //sleep a bit
    }
    }
    void incomingMessage(const MyMessage &message) {
    // We only expect one type of message from controller. But we better check anyway.
    if (message.isAck()) {
    Serial.println("This is an ack from gateway");
    }
    if (message.type == V_LIGHT) {
    // Change relay state
    state = message.getBool();
    digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
    // Store state in eeprom
    gw.saveState(CHILD_ID, state);
     // Write some debug info
     Serial.print("Incoming change for sensor:");
     Serial.print(message.sensor);
     Serial.print(", New status: ");
     Serial.println(message.getBool());
    }
    }
    
    

  • Mod

    Is DEBUG enabled in MyConfig.h? If it isn't, you'll see nothing from MySensors on the serial monitor.
    If you want your own serial prints to be visible, you need to run

    Serial.begin(9600);
    

    (or whatever speed you want to use in the Serial Monitor) inside setup().

    You have commented out gw.begin. That means MySensors will not be started. If you don't want to handle incoming messages yet, you can use

    gw.begin();
    


  • debug is enabled and I change gw.begin () and it worked, I see temp and two hum mesurements. But also my relay is uncontroling switching every secunds and the changing is not visible in the monitoring window. has that something to do with the
    gw.begin(incomming
    change?


  • Mod

    Try commenting out

    state = gw.loadState(CHILD_ID);
    

    until you are ready to handle incoming messages.



  • I did what you suggested but no result. Perhaps I have to split-up the project into my initial plan (ldr, and 2x temp/Hum) and make another node for the relay because I do not know to solve the current issue.



  • Try to define BUTTON_PIN to a digital pin and see if it makes a difference.
    Change the following in the setup

    pinMode(BUTTON_PIN, INPUT);
    digitalWrite(BUTTON_PIN, HIGH);
    
    

    This is my sketch working on arduino+relay on my corner stand lamp and it is working fine on MySensors 1.5.4

    // This code is basically the same as the default RelayWithButtonActuator sketch. The only difference is the pin numbering.
    
    #include <MySensor.h>
    #include <SPI.h>
    #include <Bounce2.h>
    
    #define RELAY_PIN  3  // Arduino Digital I/O pin number for relay 
    #define BUTTON_PIN  4  // Arduino Digital I/O pin number for button 
    #define CHILD_ID 1   // Id of the sensor child
    #define RELAY_ON 1
    #define RELAY_OFF 0
    #define NODE_ADDRESS 2
    
    Bounce debouncer = Bounce(); 
    int oldValue=0;
    bool state;
    MySensor gw;
    MyMessage msg(CHILD_ID,V_LIGHT);
    
    void setup()  
    {  
      gw.begin(incomingMessage, NODE_ADDRESS, true);
    
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("Relay & Button", "1.0");
    
     // 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 all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID, S_LIGHT);
    
      // Make sure relays are off when starting up
    digitalWrite(RELAY_PIN, RELAY_OFF);
      // Then set relay pins in output mode
      pinMode(RELAY_PIN, OUTPUT);   
          
      // Set relay to last known state (using eeprom storage) 
      state = gw.loadState(CHILD_ID);
      digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
    }
    
    
    /*
    *  Example on how to asynchronously check for new messages from gw
    */
    void loop() 
    {
      gw.process();
      debouncer.update();
      // Get the update value
      int value = debouncer.read();
      if (value != oldValue && value==0) {
          gw.send(msg.set(state?false:true), true); // Send new state and request ack back
      }
      oldValue = value;
    } 
     
    void incomingMessage(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
      if (message.isAck()) {
         Serial.println("This is an ack from gateway");
      }
    
      if (message.type == V_LIGHT) {
         // Change relay state
         state = message.getBool();
         digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
         // Store state in eeprom
         gw.saveState(CHILD_ID, state);
        
         // Write some debug info
         Serial.print("Incoming change for sensor:");
         Serial.print(message.sensor);
         Serial.print(", New status: ");
         Serial.println(message.getBool());
       } 
    }
    


  • thank you Alex, it did not work. It is strange, in my topic BartE posted a srcipt what workerd almost perfect. Relay change was good and saw it in the Serial minitor changing from 0 to 1. after adding the LDR stuff it went wrong. So it must be something in the LDR add-on. combining is still not easy for me but I am learning.



  • @Dick With sketches it is like this sometimes - troubleshooting is time consuming.
    I would suggest the following. Try to comment out line by line on the LDR code, upload and see if it works. Try to insert as many Serial.print as you could to print the status of variables to the serial port.

    I do not have the LDR so cannot help you much on this one. I have multiple other sketches combined together working just fine.



  • @alexsh1
    That could I do, thanks for the tip and will do that today. Any idea is welcome 😃


  • Contest Winner

    @Dick I think this issue sits here you use Digital port 0 (which is the serial debug port) i.s.o. Analog port 0 (A0).

    Change this line

     #define LIGHT_SENSOR_ANALOG_PIN 0
    

    to

     #define LIGHT_SENSOR_ANALOG_PIN A0
    

    And you better also add this line to the setup function

    pinMode(LIGHT_SENSOR_ANALOG_PIN, INPUT);
    


  • have not tried all the given options but started again with all the previous advises of Bart. Noe I still struggle with an error
    "gw.begin(incomingMessage, AUTO, true);" in mij script. I checkt the "{ }" over and over again but it must be something else.
    can anybody take a look?

    #include <SPI.h>
     #include <MySensor.h>
     #include <DHT.h>
     #include <Bounce2.h>
    
    #define CHILD_ID_HUM1 0
     #define CHILD_ID_HUM2 1
     #define CHILD_ID_TEMP1 3
     #define CHILD_ID_TEMP2 4
    
    #define CHILD_ID_LIGHT 0
     #define LIGHT_SENSOR_ANALOG_PIN A0
    
    // RelayWithActuator stuff
     #define RELAY_PIN 5 // Arduino Digital I/O pin number for relay
     #define BUTTON_PIN 6 // Arduino Digital I/O pin number for button
     #define CHILD_ID 5 // Id of the sensor child
     #define RELAY_ON 1
     #define RELAY_OFF 0
     Bounce debouncer = Bounce();
     
    int oldValue=0;
    
     bool state;
     MySensor gw;
    MyMessage msgLight(CHILD_ID,V_LIGHT);
    MyMessage msgLightLevel(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
     int lastLightLevel;
    
    #define HEARTBEAT 10
     unsigned int timer = 0;
     // Sleep time between reads (in milliseconds)
     #define SLEEP_TIME 3000
    
    DHT* dht[2];
     byte sensorPin[2] = {3, 4};
     float lastTemp[2] = {0.0, 0.0};
     float lastHum[2] = {0.0, 0.0};
    
    boolean metric = true;
    //MyMessage msgHum(CHILD_ID_HUM1, V_HUM);
    //MyMessage msgTemp(CHILD_ID_TEMP1, V_TEMP);
    
    void setup()
     {
    
    gw.begin(incomingMessage, AUTO, true);
     
     gw.sendSketchInfo("HumidityAndRelay", "1.0");
     
     for (int i = 0; i < 2; i++)
     {
     dht[i] = new DHT;
     dht[i]->setup(sensorPin[i]);
     }
    
    
    
    gw.present(CHILD_ID_HUM1, S_HUM);
     gw.present(CHILD_ID_HUM2, S_HUM);
     gw.present(CHILD_ID_TEMP1, S_TEMP);
     gw.present(CHILD_ID_TEMP1, S_TEMP);
    
    // Setup the button and Activate internal pull-up
     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 all sensors to gw (they will be created as child devices)
     gw.present(CHILD_ID, S_LIGHT);
    
    // Make sure relays are off when starting up
     digitalWrite(RELAY_PIN, RELAY_OFF);
     // Then set relay pins in output mode
     pinMode(RELAY_PIN, OUTPUT);
    
     pinMode(LIGHT_SENSOR_ANALOG_PIN, INPUT);
    
    // Set relay to last known state (using eeprom storage)
     state = gw.loadState(CHILD_ID);
     digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
    
    timer = 0;
     metric = gw.getConfig().isMetric;
     }
     
    void loop()
     {
     gw.process();
     timer++;
    
    if (timer > (SLEEP_TIME / HEARTBEAT))
     {
     // Reset timer again and for the next timed loop
     timer = 0;
     for (int i = 0; i < 2; i++)
     {
     delay(dht[i]->getMinimumSamplingPeriod());
     float temperature = dht[i]->getTemperature();
     if (isnan(temperature))
     {
     Serial.print(F("Failed reading temperature from DHT"));
     Serial.println(i);
     }
     else if (temperature != lastTemp[i])
     {
     lastTemp[i] = temperature;
     if (!metric)
     {
     temperature = dht[i]->toFahrenheit(temperature);
     }
    //gw.send(msgTemp.set(temperature, i));
     Serial.print(F("T"));
     Serial.print(i);
     Serial.print(F("= "));
     Serial.println(temperature);
     }
     float humidity = dht[i]->getHumidity();
     if (isnan(humidity))
     {
     Serial.print("Failed reading humidity from DHT");
     Serial.println(i);
     }
     else if (humidity != lastHum[i])
     {
     lastHum[i] = humidity;
    //gw.send(msgHum.set(humidity, 1));
     Serial.print(F("H"));
     Serial.print(i);
     Serial.print(F("= "));
     Serial.println(humidity);
     }
    
    int lightLevel = (1023-analogRead(LIGHT_SENSOR_ANALOG_PIN))/10.23;
    //Serial.println(lightLevel);
     if (lightLevel != lastLightLevel) 
     {
    gw.send(msgLightLevel.set(lightLevel));
      //lastLightLevel = lightLevel;
      Serial.print("L=");
      
      Serial.println(lightLevel);
    
     }
    
      
    }
    
    
    
    
    debouncer.update();
      // Get the update value
      int value = debouncer.read();
      if (value != oldValue && value==0) 
      
      {
          gw.send(msg.set(state?false:true), true); // Send new state and request ack back
      }
      
      oldValue = value;
    } 
    
    
    gw.wait(HEARTBEAT); //sleep a bit
     }
     }
    
    void incomingMessage(const MyMessage &message) 
    {
     // We only expect one type of message from controller. But we better check anyway.
     if (message.isAck()) 
     {
     Serial.println("This is an ack from gateway");
     }
    
    if (message.type == V_LIGHT) 
    {
     // Change relay state
     state = message.getBool();
     digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
     // Store state in eeprom
     gw.saveState(CHILD_ID, state);
     // Write some debug info
     Serial.print("Incoming change for sensor:");
     Serial.print(message.sensor);
     Serial.print(", New status: ");
     Serial.println(message.getBool());
    
    
    }
    
     
     
    
    

  • Mod

    The auto-formatting feature in the Arduino IDE is very useful for makin the code easier to read (both for yourself and for us forum readers) and spot mistakes.

    What is the error message you are getting?



  • three errors. hope you can give an advise!

    In function 'void loop()':

    laatste:163: error: 'msg' was not declared in this scope

       gw.send(msg.set(state?false:true), true); // Send new state and request ack back
    

    At global scope:

    laatste:172: error: expected declaration before '}' token

    In function 'void setup()':

    laatste:47: error: 'incomingMessage' was not declared in this scope

    gw.begin(incomingMessage, AUTO, true);


  • Contest Winner

    @Dick
    laatste:163: error: 'msg' was not declared in this scope

    msg should become msgLight

    gw.send(msgLight.set(state ? false : true), true); // Send new state and request ack back
    

    and move one } just below this line

    gw.wait(HEARTBEAT); //sleep a bit
    }
    }
    

    to the very end of you sketch



  • no errors anymore. I test the script now and will also put the changes you posted befor.



  • tested and also add the changes of your message (9hrs ago).
    What I see on the serial monitor is, temp (2x), hum (2x) and light level but nothing of the relay. it is still clicking but no change in the logging from 1 to 0 etc. I already adjusted the script this morning with the 'RelayWithButtonActuator Example'. so only the relay part is not working and not visible in the serial log. Any idea?


  • Contest Winner

    @Dick are you sure it's not a hardware (wire) issue?

    What happens if you load the RelayWithButtonActuator example code (with the correct pinning of course) ?



  • here the latist version but not working

    #include <SPI.h>
     #include <MySensor.h>
     #include <DHT.h>
     #include <Bounce2.h>
    
    #define CHILD_ID_HUM1 0
     #define CHILD_ID_HUM2 1
     #define CHILD_ID_TEMP1 3
     #define CHILD_ID_TEMP2 4
    
    #define CHILD_ID_LIGHT 0
     #define LIGHT_SENSOR_ANALOG_PIN A0
    
    // RelayWithActuator stuff
     #define RELAY_PIN 5 // Arduino Digital I/O pin number for relay
     #define BUTTON_PIN 6 // Arduino Digital I/O pin number for button
     #define CHILD_ID 5 // Id of the sensor child
     #define RELAY_ON 1
     #define RELAY_OFF 0
     Bounce debouncer = Bounce();
     
    int oldValue=0;
    
     bool state;
     MySensor gw;
    MyMessage msgLight(CHILD_ID,V_LIGHT);
    MyMessage msgLightLevel(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
     int lastLightLevel;
    
    #define HEARTBEAT 10
     unsigned int timer = 0;
     // Sleep time between reads (in milliseconds)
     #define SLEEP_TIME 3000
    
    DHT* dht[2];
     byte sensorPin[2] = {3, 4};
     float lastTemp[2] = {0.0, 0.0};
     float lastHum[2] = {0.0, 0.0};
    
    boolean metric = true;
    //MyMessage msgHum(CHILD_ID_HUM1, V_HUM);
    //MyMessage msgTemp(CHILD_ID_TEMP1, V_TEMP);
    
    void setup()
     {
    
    gw.begin(incomingMessage, AUTO, true);
     
     gw.sendSketchInfo("HumidityAndRelay", "1.0");
     
     for (int i = 0; i < 2; i++)
    
    
     
     {
     dht[i] = new DHT;
     dht[i]->setup(sensorPin[i]);
     }
    
    
    
    gw.present(CHILD_ID_HUM1, S_HUM);
     gw.present(CHILD_ID_HUM2, S_HUM);
     gw.present(CHILD_ID_TEMP1, S_TEMP);
     gw.present(CHILD_ID_TEMP1, S_TEMP);
    
    // Setup the button and Activate internal pull-up
     pinMode(BUTTON_PIN,INPUT);
    // Activate internal pull-up
      digitalWrite(BUTTON_PIN,HIGH);
    
      pinMode(LIGHT_SENSOR_ANALOG_PIN, INPUT);
    
    
    // After setting up the button, setup debouncer
     debouncer.attach(BUTTON_PIN);
     debouncer.interval(5);
    
    // Register all sensors to gw (they will be created as child devices)
     gw.present(CHILD_ID, S_LIGHT);
    
    // Make sure relays are off when starting up
     digitalWrite(RELAY_PIN, RELAY_OFF);
     // Then set relay pins in output mode
     pinMode(RELAY_PIN, OUTPUT);
    
     pinMode(LIGHT_SENSOR_ANALOG_PIN, INPUT);
    
    // Set relay to last known state (using eeprom storage)
     state = gw.loadState(CHILD_ID);
     digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
    
    timer = 0;
     metric = gw.getConfig().isMetric;
     }
     
    void loop()
     {
     gw.process();
     timer++;
    
    if (timer > (SLEEP_TIME / HEARTBEAT))
     {
     // Reset timer again and for the next timed loop
     timer = 0;
     for (int i = 0; i < 2; i++)
     {
     delay(dht[i]->getMinimumSamplingPeriod());
     float temperature = dht[i]->getTemperature();
     if (isnan(temperature))
     {
     Serial.print(F("Failed reading temperature from DHT"));
     Serial.println(i);
     }
     else if (temperature != lastTemp[i])
     {
     lastTemp[i] = temperature;
     if (!metric)
     {
     temperature = dht[i]->toFahrenheit(temperature);
     }
    //gw.send(msgTemp.set(temperature, i));
     Serial.print(F("T"));
     Serial.print(i);
     Serial.print(F("= "));
     Serial.println(temperature);
     }
     float humidity = dht[i]->getHumidity();
     if (isnan(humidity))
     {
     Serial.print("Failed reading humidity from DHT");
     Serial.println(i);
     }
     else if (humidity != lastHum[i])
     {
     lastHum[i] = humidity;
    //gw.send(msgHum.set(humidity, 1));
     Serial.print(F("H"));
     Serial.print(i);
     Serial.print(F("= "));
     Serial.println(humidity);
     }
    
    int lightLevel = (1023-analogRead(LIGHT_SENSOR_ANALOG_PIN))/10.23;
    //Serial.println(lightLevel);
     if (lightLevel != lastLightLevel) 
     {
    gw.send(msgLightLevel.set(lightLevel));
      //lastLightLevel = lightLevel;
      Serial.print("L=");
      
      Serial.println(lightLevel);
    
     }
    
      
    }
    
    
    
    
    debouncer.update();
      // Get the update value
      int value = debouncer.read();
      if (value != oldValue && value==0) 
      
      {
          gw.send(msgLight.set(state ? false : true), true); // Send new state and request ack back
      }
      
      oldValue = value;
     
    
    
    gw.wait(HEARTBEAT); //sleep a bit
     }
     }
    
    void incomingMessage(const MyMessage &message) 
    {
     // We only expect one type of message from controller. But we better check anyway.
     if (message.isAck()) 
     {
     Serial.println("This is an ack from gateway");
     }
    
    if (message.type == V_LIGHT) 
    {
     // Change relay state
     state = message.getBool();
     digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
     // Store state in eeprom
     gw.saveState(CHILD_ID, state);
     // Write some debug info
     Serial.print("Incoming change for sensor:");
     Serial.print(message.sensor);
     Serial.print(", New status: ");
     Serial.println(message.getBool());
    
    
    }
    
    } 
     
    
    

  • Contest Winner

    @Dick

    Change these lines

        oldValue = value;
        gw.wait(HEARTBEAT); //sleep a bit
      }
    }
    

    to

        oldValue = value;
      }
      gw.wait(HEARTBEAT); //sleep a bit
    } 
    


  • and about the test of the RelayWithButtonActuator Example,
    it works fine. I adjust the lines now and will test it



  • tested but still clicking relay. As you can see that there is nothing to see in the serial log

    send: 4-4-0-0 s=255,c=3,t=15,pt=2,l=2,sg=0,st=ok:0
    send: 4-4-0-0 s=255,c=0,t=18,pt=0,l=5,sg=0,st=ok:1.5.4
    send: 4-4-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:0
    read: 0-0-4 s=255,c=3,t=6,pt=0,l=1,sg=0:M
    repeater started, id=4, parent=0, distance=1
    send: 4-4-0-0 s=255,c=3,t=11,pt=0,l=16,sg=0,st=ok:HumidityAndRelay
    send: 4-4-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=ok:1.0
    send: 4-4-0-0 s=0,c=0,t=7,pt=0,l=0,sg=0,st=ok:
    send: 4-4-0-0 s=1,c=0,t=7,pt=0,l=0,sg=0,st=ok:
    send: 4-4-0-0 s=3,c=0,t=6,pt=0,l=0,sg=0,st=ok:
    send: 4-4-0-0 s=3,c=0,t=6,pt=0,l=0,sg=0,st=ok:
    send: 4-4-0-0 s=5,c=0,t=3,pt=0,l=0,sg=0,st=ok:
    T0= 22.20
    H0= 61.80
    send: 4-4-0-0 s=0,c=1,t=23,pt=2,l=2,sg=0,st=ok:74
    L=74
    T1= 25.00
    H1= 60.20
    send: 4-4-0-0 s=0,c=1,t=23,pt=2,l=2,sg=0,st=ok:74
    L=74
    send: 4-4-0-0 s=0,c=1,t=23,pt=2,l=2,sg=0,st=ok:74
    L=74
    send: 4-4-0-0 s=0,c=1,t=23,pt=2,l=2,sg=0,st=ok:76
    L=76


  • Contest Winner

    @Dick If there is nothing visible in the log, then you can presume there is a hardware issue.

    Some possible issues:

    • loose relays wire (bad connection) --> try a different wire
    • wrong pin is used (if set as input the pin will "float" resulting in unstable relay behaviour) --> double check your pin number in code and actual PCB
    • pin double used ie the DHT drive poll this pin for some reason. --> use a different pin in both code and conection to relay


  • thank you BartE, I received today an new Uno and some other stuff so I can rebuild it al to see if it is an HW failure. I hope I can start tomorrow. I keep you informed but thanks for your support. to be continued.


  • Contest Winner

    @Dick Not sure what your approach is but normally i start with prototyping using these wires and when all works fine (software and hardware) i solder everything together on a PCB.


 

334
Online

7.8k
Users

8.7k
Topics

93.0k
Posts