Cobine working DHT22 and LDR with a RelayWithButtonActuator
-
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.
-
@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 :smiley:@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 0to
#define LIGHT_SENSOR_ANALOG_PIN A0And you better also add this line to the setup function
pinMode(LIGHT_SENSOR_ANALOG_PIN, INPUT); -
@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 0to
#define LIGHT_SENSOR_ANALOG_PIN A0And 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()); } -
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 backAt 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);
-
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 backAt 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);
@Dick
laatste:163: error: 'msg' was not declared in this scopemsg should become msgLight
gw.send(msgLight.set(state ? false : true), true); // Send new state and request ack backand move one } just below this line
gw.wait(HEARTBEAT); //sleep a bit } }to the very end of you sketch
-
@Dick
laatste:163: error: 'msg' was not declared in this scopemsg should become msgLight
gw.send(msgLight.set(state ? false : true), true); // Send new state and request ack backand move one } just below this line
gw.wait(HEARTBEAT); //sleep a bit } }to the very end of you sketch
-
@Dick
laatste:163: error: 'msg' was not declared in this scopemsg should become msgLight
gw.send(msgLight.set(state ? false : true), true); // Send new state and request ack backand move one } just below this line
gw.wait(HEARTBEAT); //sleep a bit } }to the very end of you sketch
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? -
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? -
@Dick
laatste:163: error: 'msg' was not declared in this scopemsg should become msgLight
gw.send(msgLight.set(state ? false : true), true); // Send new state and request ack backand move one } just below this line
gw.wait(HEARTBEAT); //sleep a bit } }to the very end of you sketch
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()); } } -
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()); } } -
Change these lines
oldValue = value; gw.wait(HEARTBEAT); //sleep a bit } }to
oldValue = value; } gw.wait(HEARTBEAT); //sleep a bit } -
Change these lines
oldValue = value; gw.wait(HEARTBEAT); //sleep a bit } }to
oldValue = value; } gw.wait(HEARTBEAT); //sleep a bit }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 -
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@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
-
@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.