Compare commits
3 Commits
interrupts
...
photoresis
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
acc53eaa74 | ||
|
|
ccb12d2076 | ||
|
|
ee1dc7bbea |
@@ -11,6 +11,13 @@
|
||||
#include <DS1307.h>
|
||||
#include <SevSeg.h>
|
||||
|
||||
/* disable time compensation
|
||||
* as we borrow more accurate chrystal and solder it to rtc breakboard
|
||||
*/
|
||||
//#define TIMECOMP
|
||||
/* 0.5 second/day compensation flag */
|
||||
//#define OFIVECOMP
|
||||
|
||||
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
|
||||
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
|
||||
|
||||
@@ -29,16 +36,22 @@ unsigned long previousPushTimer = 0;
|
||||
/* dot blinking stuff */
|
||||
volatile bool dot = true;
|
||||
|
||||
#ifdef TIMECOMP
|
||||
/* time inaccuracy compensation flag */
|
||||
volatile bool compflag1 = true;
|
||||
volatile bool compflag2 = false;
|
||||
const uint8_t timeSkew = 8; // assume that clock runs faster than should
|
||||
const uint8_t timeSkew = 9; // assume that clock runs faster than should
|
||||
#ifdef OFIVECOMP
|
||||
volatile bool timeSkewEven = false; // comp. 1 additional second per 2 days
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* ambient light compensation aka night mode */
|
||||
const int photoPin = A2;
|
||||
volatile bool measureAmbLight = true;
|
||||
unsigned int ambLight = 0;
|
||||
unsigned int ambLight = 0; // actual value
|
||||
unsigned int ambLight2 = 0; // previous med. value
|
||||
unsigned int ambLight3 = 0; // pre-previous med. value
|
||||
unsigned long previousLightTimer = 0;
|
||||
const long refresh_interval = 40; // refresh rate 25Hz
|
||||
|
||||
@@ -132,38 +145,48 @@ ISR(TIMER1_OVF_vect)
|
||||
else
|
||||
dot = true;
|
||||
|
||||
#ifdef TIMECOMP
|
||||
/* time compensation magic */
|
||||
if ((myhour == 21) and (myminute == 21) and (mysecond == 21)
|
||||
and (compflag2)) {
|
||||
compflag1 = true;
|
||||
#ifdef OFIVECOMP
|
||||
(timeSkewEven) ? timeSkewEven = false : timeSkewEven;
|
||||
#endif
|
||||
}
|
||||
|
||||
if ((myhour == 21) and (myminute == 21) and (mysecond == 23)) {
|
||||
compflag1 = false;
|
||||
compflag2 = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
unsigned long currentMillis = millis();
|
||||
|
||||
#ifdef TIMECOMP
|
||||
/*
|
||||
* Let's implement time compenstion for individual rtc module time
|
||||
* charachteristics. In in my case quartz resonator as inaccurate as
|
||||
* about +8.5 seconds per 24 hours
|
||||
* about +9.5 seconds per 24 hours
|
||||
*/
|
||||
if (compflag1 && compflag2) {
|
||||
#ifdef OFIVECOMP
|
||||
if (timeSkewEven) {
|
||||
clock.fillByHMS(myhour, myminute, (mysecond - timeSkew - 1));
|
||||
} else {
|
||||
#endif
|
||||
clock.fillByHMS(myhour, myminute, (mysecond - timeSkew));
|
||||
#ifdef OFIVECOMP
|
||||
}
|
||||
#endif
|
||||
|
||||
clock.setTime();
|
||||
compflag2 = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (rtcsync) {
|
||||
clock.getTime();
|
||||
@@ -217,6 +240,7 @@ void loop()
|
||||
(previousLightTimer > currentMillis)) { // millis() reset every ~49 days
|
||||
previousLightTimer = currentMillis;
|
||||
ambLight = analogRead(photoPin);
|
||||
ambLight = (ambLight + ambLight2 + ambLight3) / 3;
|
||||
|
||||
/* Ambient light compensation
|
||||
* ambLight can be in range of 0..1023, if it 910+, it has point to use
|
||||
@@ -248,16 +272,19 @@ void loop()
|
||||
} else if ((ambLight < 350) and (ambLight >= 310)) {
|
||||
Display.setBrightness(-3);
|
||||
} else if ((ambLight < 300) and (ambLight >= 260)) {
|
||||
Display.setBrightness(-5);
|
||||
Display.setBrightness(-6);
|
||||
} else if ((ambLight < 250) and (ambLight >= 210)) {
|
||||
Display.setBrightness(-7);
|
||||
Display.setBrightness(-10);
|
||||
} else if ((ambLight < 200) and (ambLight >= 160)) {
|
||||
Display.setBrightness(-9);
|
||||
Display.setBrightness(-14);
|
||||
} else if ((ambLight < 150) and (ambLight >= 110)) {
|
||||
Display.setBrightness(-12);
|
||||
Display.setBrightness(-18);
|
||||
} else if (ambLight < 100) {
|
||||
Display.setBrightness(-15);
|
||||
Display.setBrightness(-22);
|
||||
}
|
||||
|
||||
ambLight3 = ambLight2;
|
||||
ambLight2 = ambLight;
|
||||
}
|
||||
|
||||
Display.refreshDisplay();
|
||||
@@ -265,27 +292,16 @@ void loop()
|
||||
|
||||
void updateTimeStr(uint8_t h, uint8_t m)
|
||||
{
|
||||
char str[4];
|
||||
float d;
|
||||
|
||||
// make blinking dot
|
||||
if (h > 0) {
|
||||
if (dot) {
|
||||
Display.setNumber((h * 100 + m), 2);
|
||||
} else {
|
||||
Display.setNumber((h * 100 + m));
|
||||
}
|
||||
if (dot) {
|
||||
char str[5];
|
||||
sprintf(str, "%2d.%02d", h, m);
|
||||
Display.setChars(str);
|
||||
} else {
|
||||
/* 0 o'clock is an exception, we don't want to see "00.00", we
|
||||
want see "0.00" or "0 00", so we have to use this "hack" */
|
||||
if (dot) {
|
||||
d = float(m) / 100;
|
||||
Display.setNumber(d, 2);
|
||||
} else {
|
||||
sprintf(str, "%2d%02d", h, m);
|
||||
Display.setChars(str);
|
||||
}
|
||||
char str[4];
|
||||
sprintf(str, "%2d%02d", h, m);
|
||||
Display.setChars(str);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* vim: set filetype=cpp: */
|
||||
|
||||
Reference in New Issue
Block a user