summaryrefslogtreecommitdiffstats
path: root/lock/util.c
diff options
context:
space:
mode:
authorSadeep Madurange <sadeep@asciimx.com>2025-05-01 14:18:31 +0800
committerSadeep Madurange <sadeep@asciimx.com>2025-05-01 14:18:31 +0800
commita1de6ebc054c84e1f27b21998cb017ae38151a2e (patch)
treee59592281e8f81fe4e5e6aa4586fe1e796b14176 /lock/util.c
parent57e9d1a5c00dc7dc5cf3149c35a8004b5f7aab7f (diff)
downloadsmart-home-a1de6ebc054c84e1f27b21998cb017ae38151a2e.tar.gz
Check vcc and add LEDs for lock/unlock.
Diffstat (limited to 'lock/util.c')
-rw-r--r--lock/util.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/lock/util.c b/lock/util.c
index 4f63625..ebcf9fe 100644
--- a/lock/util.c
+++ b/lock/util.c
@@ -21,3 +21,26 @@ void xor(const char *k, const char *s, char *d, uint8_t n)
d[i] = s[i] ^ k[i];
}
+/* Measure vcc by measuring known internal 1.1v bandgap
+ * reference voltage against AVCC.
+ * Place a 100nF bypass capacitor on AREF.
+ */
+uint16_t getvcc(void)
+{
+ uint16_t vcc;
+
+ ADMUX |= (1 << REFS0);
+ ADMUX |= (1 << MUX3) | (1 << MUX2) | (1 << MUX1);
+ ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS0);
+
+ // https://www.sciencetronics.com/greenphotons/?p=1521
+ _delay_us(500);
+
+ ADCSRA |= (1 << ADSC);
+ while (ADCSRA & (1 << ADSC))
+ ;
+ vcc = (1100UL * 1023 / ADC);
+
+ ADCSRA &= ~(1 << ADEN);
+ return vcc;
+}