]> www.fi.muni.cz Git - bike-lights.git/commitdiff
ambient light sensor: configurable # of readings
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Thu, 28 Mar 2013 21:13:58 +0000 (22:13 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Thu, 28 Mar 2013 22:05:33 +0000 (23:05 +0100)
Set the # of readings to 1, and decrease the shift value
for running average in order to get faster reaction.

firmware/adc.c
firmware/ambient.c
firmware/lights.h

index f55a42792570670e464c1e66d035b809b6ecc298..70c2aa1adca1a95958fc02e992354b2345aeaaff 100644 (file)
@@ -19,7 +19,7 @@ struct {
        { 0, 1, PWMLED_ADC_SHIFT },     // pwmled 1
        { 0, 1, PWMLED_ADC_SHIFT },     // pwmled 2
        { 0, 1, PWMLED_ADC_SHIFT },     // pwmled 3
-       { 0, 1, 3 },                    // ambient
+       { 0, 1, AMBIENT_ADC_SHIFT },    // ambient
        { 0, 1, 0 },                    // battery
        { 0, 1, 0 },                    // gain20
        { 0, 1, 0 },                    // buttons
index 143ffc49e1bf98d8ad5c5ae42566aac38c907e52..f62620862df49538a5a5ab282fb01d1168ec6f9e 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "lights.h"
 
+#define AMBIENT_VAL_SHIFT 3
 static uint16_t ambient_val;
 volatile unsigned char ambient_zone;
 
@@ -15,10 +16,10 @@ typedef struct {
  * and having small overlaps in order to provide a bit of hysteresis.
  */
 static ambient_zone_t ambient_zones[] = {
-       { 0x0000, 0xa400 }, // dark
-       { 0xa000, 0xc000 },
-       { 0xbe00, 0xc800 },
-       { 0xc600, 0xffff }
+       { 0x0000                   , 0x0290<<AMBIENT_VAL_SHIFT }, // dark
+       { 0x0280<<AMBIENT_VAL_SHIFT, 0x0300<<AMBIENT_VAL_SHIFT }, // evening
+       { 0x02f8<<AMBIENT_VAL_SHIFT, 0x0320<<AMBIENT_VAL_SHIFT }, // dawn
+       { 0x0318<<AMBIENT_VAL_SHIFT, 0xffff                    }, // day
 };
 #define N_AMBIENT_ZONES (sizeof(ambient_zones)/sizeof(ambient_zones[0]))
 
@@ -46,7 +47,8 @@ void ambient_adc(uint16_t adcval)
 {
        unsigned char old_zone = ambient_zone;
 
-       ambient_val += adcval - (ambient_val >> 3);
+       ambient_val += adcval - (ambient_val
+               >> (AMBIENT_VAL_SHIFT - AMBIENT_ADC_SHIFT));
 
        while (ambient_zones[ambient_zone].lo > ambient_val)
                ambient_zone--;
index 2eb1f09f41464c4e02ae2f6ef29b5dd5eae4dcc3..e9d48aadaddd3494c0a4365d5d7c06d8e99830ee 100644 (file)
@@ -59,6 +59,7 @@ void susp_gpio();
 void gpio_set(unsigned char n, unsigned char on);
 
 /* ambient.c */
+#define AMBIENT_ADC_SHIFT 0    /* 1 measurement per callback */
 void init_ambient();
 extern volatile unsigned char ambient_zone;
 void ambient_adc(uint16_t adc_val);