Add light sensor to Wise Clock 4
This is long overdue.
As we know, the display brightness on Wise Clock 4 can be changed between 5 levels, by pressing the "Plus" button. To adjust the brightness automatically, based on the light conditions, we need to add a light-sensitive sensor of some sort, and the most common is the LDR (light-dependent resistor).
Any of the countless articles and tutorials on Arduino + LDR will teach how to connect the LDR to an analog pin, using a voltage divider. For Wise Clock 4, the LDR is connected between A0 (pin 40 of the processor) and ground, with a 10k resistor between A0 and Vcc, as shown below:
GND|----[ LDR ]---A0---[10k resistor]----+Vcc
The automatic brightness adjustment is enabled in software with this macro (in file UserConf.h):
// use an LDR (connected to A0) to automatically adjust
// (every 5 seconds) screen brightness to ambient light;
#define AUTO_BRIGHTNESS
but I did not follow through after I saw how effective (and so much cheaper) the LDR is.
As we know, the display brightness on Wise Clock 4 can be changed between 5 levels, by pressing the "Plus" button. To adjust the brightness automatically, based on the light conditions, we need to add a light-sensitive sensor of some sort, and the most common is the LDR (light-dependent resistor).
Any of the countless articles and tutorials on Arduino + LDR will teach how to connect the LDR to an analog pin, using a voltage divider. For Wise Clock 4, the LDR is connected between A0 (pin 40 of the processor) and ground, with a 10k resistor between A0 and Vcc, as shown below:
GND|----[ LDR ]---A0---[10k resistor]----+Vcc
// use an LDR (connected to A0) to automatically adjust
// (every 5 seconds) screen brightness to ambient light;
#define AUTO_BRIGHTNESS
and implemented in this new function:
void WiseClock::checkBrightness()
{
#ifdef AUTO_BRIGHTNESS
// adjust brightness every 5 seconds;
if (millis() - lastCheck > 5000)
{
int ldrValue = analogRead(0); // A0
byte brightLevel = map(ldrValue, 0, 1023, MAX_BRIGHTNESS, 0);
if (nBrightness != brightLevel)
{
nBrightness = brightLevel;
setBrightness(brightLevel);
}
lastCheck = millis();
}
#endif
}
called from the main loop (TheClock.ino):
void loop()
{
unsigned long ms = millis();
checkSound(ms);
wiseClock.checkSerial();
wiseClock.checkScroll(ms);
if ((long)(ms - wiseClock.nextRun) >= 0)
{
alarmClock.getTimeFromRTC();
alarmClock.checkAlarm();
wiseClock.checkMenuActive();
wiseClock.runCrtApp();
}
wiseClock.checkBrightness();
}
It really doesn't get much simpler than this.
I also considered other hardware solutions (and actually bought the parts):
- analog light sensor PT19
- I2C light sensor TSL2561but I did not follow through after I saw how effective (and so much cheaper) the LDR is.
Comments
Post a Comment