I'm having an issue with a BH1750 light sensor where it only reads once and won't read again if I use sleep. I was initially building a multi sensor for motion, temperature and light level, and got the motion and temperature working fine, but hit this issue when adding the light level sensor. I assumed it was my code so stripped the whole thing back to basics and created a basic sensor with just an Arduino and the BH1750, all worked fine reading the levels.
I then tried to create just a light level sensor using mysensors and even when using the example code had the issue where it would read once and send the info to the controller, but then just hangs on the second read (after sleeping). Specifically this line:
lux = lightSensor.readLightLevel();
I can make it work by removing the sleep command and adding a delay, but this is no good if I want to use it with a motion sensor!
I've searched the forums and stumbled across this thread with a similar issue but the resolution was to use 2.3.1 beta and I am on 2.3.2 already. I also tried adding waits either side of the point where it hangs to give the sensor time to wake up after sleep, but that didn't help either!
My code (which is derived from the mysensors sample code and the homeassistant sample, which happens to be for this exact sensor!!):
// Enable debug prints to serial monitor
#define MY_DEBUG
// Enable and select radio type attached
#define MY_RADIO_RF24
//#define MY_RADIO_RFM69
//define ID
#define MY_NODE_ID 95
#define MY_PARENT_NODE_ID 0
#include <MySensors.h>
#include <BH1750.h>
#include <Wire.h>
#define LIGHT_CHILD_ID 3
unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds) (shortened for testing purposes!)
BH1750 lightSensor;
MyMessage msg(LIGHT_CHILD_ID, V_LEVEL);
uint16_t lastlux = 0;
uint16_t lux;
bool initialValueSent = false;
void setup()
{
lightSensor.begin();
}
void presentation() {
// Send the sketch version information to the gateway and Controller
sendSketchInfo("Light Lux Sensor", "1.0");
// Register all sensors to gateway (they will be created as child devices)
present(LIGHT_CHILD_ID, S_LIGHT_LEVEL);
}
void loop()
{
if (!initialValueSent) {
Serial.println("Sending initial value");
send(msg.set(lastlux));
Serial.println("Requesting initial value from controller");
request(LIGHT_CHILD_ID, V_LEVEL);
wait(2000, C_SET, V_LEVEL);
}
wait(10000);
Serial.println("Reading Light Level"); //added for debugging
lux = lightSensor.readLightLevel(); // Get Lux value
wait(20);
Serial.print("Value is: ");
Serial.println(lux); //added for debugging
if (lux != lastlux) {
send(msg.set(lux));
lastlux = lux;
}
sleep(SLEEP_TIME);
}
void receive(const MyMessage &message) {
if (message.type == V_LEVEL) {
if (!initialValueSent) {
Serial.println("Receiving initial value from controller");
initialValueSent = true;
}
}
}
The serial monitor output is:
__ __ ____
| \/ |_ _/ ___| ___ _ __ ___ ___ _ __ ___
| |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __|
| | | | |_| |___| | __/ | | \__ \ _ | | \__ \
|_| |_|\__, |____/ \___|_| |_|___/\___/|_| |___/
|___/ 2.3.2
16 MCO:BGN:INIT NODE,CP=RNNNA---,FQ=16,REL=255,VER=2.3.2
26 TSM:INIT
28 TSF:WUR:MS=0
34 TSM:INIT:TSP OK
36 TSM:INIT:STATID=95
38 TSF:SID:OK,ID=95
39 TSM:FPAR
44 ?TSF:MSG:SEND,95-95-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
632 TSF:MSG:READ,11-11-95,s=255,c=3,t=8,pt=1,l=1,sg=0:1
637 TSF:MSG:FPAR OK,ID=11,D=2
2052 TSM:FPAR:OK
2053 TSM:ID
2054 TSM:ID:OK
2056 TSM:UPL
2059 TSF:MSG:SEND,95-95-11-0,s=255,c=3,t=24,pt=1,l=1,sg=0,ft=0,st=OK:1
2081 TSF:MSG:READ,0-11-95,s=255,c=3,t=25,pt=1,l=1,sg=0:2
2086 TSF:MSG:PONG RECV,HP=2
2089 TSM:UPL:OK
2091 TSM:READY:ID=95,PAR=11,DIS=2
2096 TSF:MSG:SEND,95-95-11-0,s=255,c=3,t=15,pt=6,l=2,sg=0,ft=0,st=OK:0100
2106 TSF:MSG:READ,0-11-95,s=255,c=3,t=15,pt=6,l=2,sg=0:0100
2118 TSF:MSG:SEND,95-95-11-0,s=255,c=0,t=17,pt=0,l=5,sg=0,ft=0,st=OK:2.3.2
2126 TSF:MSG:SEND,95-95-11-0,s=255,c=3,t=6,pt=1,l=1,sg=0,ft=0,st=OK:11
2163 TSF:MSG:READ,0-11-95,s=255,c=3,t=6,pt=0,l=1,sg=0:M
2170 TSF:MSG:SEND,95-95-11-0,s=255,c=3,t=11,pt=0,l=16,sg=0,ft=0,st=OK:Light Lux Sensor
2181 TSF:MSG:SEND,95-95-11-0,s=255,c=3,t=12,pt=0,l=3,sg=0,ft=0,st=OK:1.0
2198 TSF:MSG:SEND,95-95-11-0,s=3,c=0,t=16,pt=0,l=0,sg=0,ft=0,st=OK:
2204 MCO:REG:REQ
2211 TSF:MSG:SEND,95-95-11-0,s=255,c=3,t=26,pt=1,l=1,sg=0,ft=0,st=OK:2
2225 TSF:MSG:READ,0-11-95,s=255,c=3,t=27,pt=1,l=1,sg=0:1
2230 MCO:PIM:NODE REG=1
2233 MCO:BGN:STP
2254 MCO:BGN:INIT OK,TSP=1
2257 TSF:MSG:READ,0-11-95,s=255,c=3,t=27,pt=1,l=1,sg=0:1
2263 MCO:PIM:NODE REG=1
Sending initial value
2271 TSF:MSG:SEND,95-95-11-0,s=3,c=1,t=37,pt=3,l=2,sg=0,ft=0,st=OK:0
Requesting initial value from controller
2279 TSF:MSG:SEND,95-95-11-0,s=3,c=2,t=37,pt=0,l=0,sg=0,ft=0,st=OK:
2318 TSF:MSG:READ,0-11-95,s=3,c=1,t=37,pt=0,l=1,sg=0:0
Receiving initial value from controller
Reading Light Level
Value is: 4
12344 TSF:MSG:SEND,95-95-11-0,s=3,c=1,t=37,pt=3,l=2,sg=0,ft=0,st=OK:4
12351 MCO:SLP:MS=10000,SMS=0,I1=255,M1=255,I2=255,M2=255
12356 TSF:TDI:TSL
12358 MCO:SLP:WUP=-1
12360 TSF:TRI:TSB
Reading Light Level
My controller is Homeassistant, and it get's the initial read from the sensor fine. If I remove the sleep command it works and the sensor updates in homeassistant when the level changes but clearly it loops without a sleep/delay and therefore sends the data way more frequently than I want/need!
My ultimate goal is to add the sensor to my 'multi sensor' but I've hit this stumbling block just creating a basic light level sensor. Any help/advice would be gratefully received as I am completely stuck at this point.
Thanks in advance!