Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Development
  3. Cobine working DHT22 and LDR with a RelayWithButtonActuator

Cobine working DHT22 and LDR with a RelayWithButtonActuator

Scheduled Pinned Locked Moved Development
dht22 ldr relay
36 Posts 4 Posters 5.3k Views 5 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • BartEB Offline
    BartEB Offline
    BartE
    Contest Winner
    wrote on last edited by BartE
    #10

    @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)

    DickD 1 Reply Last reply
    0
    • BartEB BartE

      @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)

      DickD Offline
      DickD Offline
      Dick
      wrote on last edited by
      #11

      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

      DickD 1 Reply Last reply
      0
      • DickD Dick

        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

        DickD Offline
        DickD Offline
        Dick
        wrote on last edited by
        #12

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

        DickD 1 Reply Last reply
        0
        • DickD Dick

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

          DickD Offline
          DickD Offline
          Dick
          wrote on last edited by
          #13

          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());
          }
          }
          
          
          1 Reply Last reply
          0
          • mfalkviddM Offline
            mfalkviddM Offline
            mfalkvidd
            Mod
            wrote on last edited by mfalkvidd
            #14

            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();
            
            DickD 1 Reply Last reply
            0
            • mfalkviddM mfalkvidd

              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();
              
              DickD Offline
              DickD Offline
              Dick
              wrote on last edited by
              #15

              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?

              1 Reply Last reply
              0
              • mfalkviddM Offline
                mfalkviddM Offline
                mfalkvidd
                Mod
                wrote on last edited by
                #16

                Try commenting out

                state = gw.loadState(CHILD_ID);
                

                until you are ready to handle incoming messages.

                DickD 1 Reply Last reply
                0
                • mfalkviddM mfalkvidd

                  Try commenting out

                  state = gw.loadState(CHILD_ID);
                  

                  until you are ready to handle incoming messages.

                  DickD Offline
                  DickD Offline
                  Dick
                  wrote on last edited by
                  #17

                  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.

                  1 Reply Last reply
                  0
                  • alexsh1A Offline
                    alexsh1A Offline
                    alexsh1
                    wrote on last edited by alexsh1
                    #18

                    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());
                       } 
                    }
                    
                    DickD 1 Reply Last reply
                    0
                    • alexsh1A alexsh1

                      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());
                         } 
                      }
                      
                      DickD Offline
                      DickD Offline
                      Dick
                      wrote on last edited by
                      #19

                      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.

                      alexsh1A 1 Reply Last reply
                      0
                      • DickD Dick

                        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.

                        alexsh1A Offline
                        alexsh1A Offline
                        alexsh1
                        wrote on last edited by alexsh1
                        #20

                        @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.

                        DickD 1 Reply Last reply
                        1
                        • alexsh1A alexsh1

                          @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.

                          DickD Offline
                          DickD Offline
                          Dick
                          wrote on last edited by
                          #21

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

                          BartEB 1 Reply Last reply
                          1
                          • DickD Dick

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

                            BartEB Offline
                            BartEB Offline
                            BartE
                            Contest Winner
                            wrote on last edited by BartE
                            #22

                            @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);
                            
                            DickD 1 Reply Last reply
                            0
                            • BartEB BartE

                              @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);
                              
                              DickD Offline
                              DickD Offline
                              Dick
                              wrote on last edited by
                              #23

                              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());
                              
                              
                              }
                              
                               
                               
                              
                              
                              1 Reply Last reply
                              0
                              • mfalkviddM Offline
                                mfalkviddM Offline
                                mfalkvidd
                                Mod
                                wrote on last edited by mfalkvidd
                                #24

                                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?

                                DickD 1 Reply Last reply
                                0
                                • mfalkviddM mfalkvidd

                                  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?

                                  DickD Offline
                                  DickD Offline
                                  Dick
                                  wrote on last edited by
                                  #25

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

                                  BartEB 1 Reply Last reply
                                  0
                                  • DickD Dick

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

                                    BartEB Offline
                                    BartEB Offline
                                    BartE
                                    Contest Winner
                                    wrote on last edited by BartE
                                    #26

                                    @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

                                    DickD 3 Replies Last reply
                                    1
                                    • BartEB BartE

                                      @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

                                      DickD Offline
                                      DickD Offline
                                      Dick
                                      wrote on last edited by
                                      #27

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

                                      1 Reply Last reply
                                      0
                                      • BartEB BartE

                                        @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

                                        DickD Offline
                                        DickD Offline
                                        Dick
                                        wrote on last edited by
                                        #28

                                        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?

                                        BartEB 1 Reply Last reply
                                        0
                                        • DickD Dick

                                          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?

                                          BartEB Offline
                                          BartEB Offline
                                          BartE
                                          Contest Winner
                                          wrote on last edited by
                                          #29

                                          @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) ?

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          32

                                          Online

                                          11.7k

                                          Users

                                          11.2k

                                          Topics

                                          113.1k

                                          Posts


                                          Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • MySensors
                                          • OpenHardware.io
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular