From 9d0d41e534a41059134aa9796b4eff1b551e4b59 Mon Sep 17 00:00:00 2001 From: Cowpoke006 Date: Mon, 17 Dec 2012 18:02:16 -0800 Subject: [PATCH] Create Light Mod1 Disable low setting, make blink a strobe, access strobe in any setting by holding button. --- Light Mod1 | 204 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 Light Mod1 diff --git a/Light Mod1 b/Light Mod1 new file mode 100644 index 0000000..434743f --- /dev/null +++ b/Light Mod1 @@ -0,0 +1,204 @@ +/* + +Factory firmware for HexBright FLEX +v2.4 Dec 6, 2012 +*/ + +#include +#include + +// Settings +#define OVERTEMP 340 +// Pin assignments +#define DPIN_RLED_SW 2 +#define DPIN_GLED 5 +#define DPIN_PWR 8 +#define DPIN_DRV_MODE 9 +#define DPIN_DRV_EN 10 +#define APIN_TEMP 0 +#define APIN_CHARGE 3 +// Modes +#define MODE_OFF 0 +#define MODE_LOW 1 +#define MODE_MED 2 +#define MODE_HIGH 3 +#define MODE_BLINKING 4 +#define MODE_BLINKING_PREVIEW 5 + +// State +byte mode = 0; +unsigned long btnTime = 0; +boolean btnDown = false; + + +void setup() +{ + // We just powered on! That means either we got plugged + // into USB, or the user is pressing the power button. + pinMode(DPIN_PWR, INPUT); + digitalWrite(DPIN_PWR, LOW); + + // Initialize GPIO + pinMode(DPIN_RLED_SW, INPUT); + pinMode(DPIN_GLED, OUTPUT); + pinMode(DPIN_DRV_MODE, OUTPUT); + pinMode(DPIN_DRV_EN, OUTPUT); + digitalWrite(DPIN_DRV_MODE, LOW); + digitalWrite(DPIN_DRV_EN, LOW); + + // Initialize serial busses + Serial.begin(9600); + Wire.begin(); + + btnTime = millis(); + btnDown = digitalRead(DPIN_RLED_SW); + mode = MODE_OFF; + + Serial.println("Powered up!"); +} + +void loop() +{ + static unsigned long lastTempTime; + unsigned long time = millis(); + + // Check the state of the charge controller + int chargeState = analogRead(APIN_CHARGE); + if (chargeState < 128) // Low - charging + { + digitalWrite(DPIN_GLED, (time&0x0100)?LOW:HIGH); + } + else if (chargeState > 768) // High - charged + { + digitalWrite(DPIN_GLED, HIGH); + } + else // Hi-Z - shutdown + { + digitalWrite(DPIN_GLED, LOW); + } + + // Check the temperature sensor + if (time-lastTempTime > 1000) + { + lastTempTime = time; + int temperature = analogRead(APIN_TEMP); + Serial.print("Temp: "); + Serial.println(temperature); + if (temperature > OVERTEMP && mode != MODE_OFF) + { + Serial.println("Overheating!"); + + for (int i = 0; i < 6; i++) + { + digitalWrite(DPIN_DRV_MODE, LOW); + delay(100); + digitalWrite(DPIN_DRV_MODE, HIGH); + delay(100); + } + digitalWrite(DPIN_DRV_MODE, LOW); + + mode = MODE_LOW; + } + } + + // Do whatever this mode does + switch (mode) + { + case MODE_BLINKING: + case MODE_BLINKING_PREVIEW: + digitalWrite(DPIN_DRV_EN, (time%30)<20); + break; + } + + // Periodically pull down the button's pin, since + // in certain hardware revisions it can float. + pinMode(DPIN_RLED_SW, OUTPUT); + pinMode(DPIN_RLED_SW, INPUT); + + // Check for mode changes + byte newMode = mode; + byte newBtnDown = digitalRead(DPIN_RLED_SW); + switch (mode) + { + case MODE_OFF: + if (btnDown && !newBtnDown && (time-btnTime)>20) + newMode = MODE_MED; + if (btnDown && newBtnDown && (time-btnTime)>500) + newMode = MODE_BLINKING_PREVIEW; + break; + case MODE_MED: + if (btnDown && !newBtnDown && (time-btnTime)>50) + newMode = MODE_HIGH; + if (btnDown && newBtnDown && (time-btnTime)>500) + newMode = MODE_BLINKING_PREVIEW; + break; + case MODE_HIGH: + if (btnDown && !newBtnDown && (time-btnTime)>50) + newMode = MODE_OFF; + if (btnDown && newBtnDown && (time-btnTime)>500) + newMode = MODE_BLINKING_PREVIEW; + break; + case MODE_BLINKING_PREVIEW: + // This mode exists just to ignore this button release. + if (btnDown && !newBtnDown) + newMode = MODE_BLINKING; + break; + case MODE_BLINKING: + if (btnDown && !newBtnDown && (time-btnTime)>50) + newMode = MODE_OFF; + break; + } + + // Do the mode transitions + if (newMode != mode) + { + switch (newMode) + { + case MODE_OFF: + Serial.println("Mode = off"); + pinMode(DPIN_PWR, OUTPUT); + digitalWrite(DPIN_PWR, LOW); + digitalWrite(DPIN_DRV_MODE, LOW); + digitalWrite(DPIN_DRV_EN, LOW); + break; + case MODE_LOW: + Serial.println("Mode = low"); + pinMode(DPIN_PWR, OUTPUT); + digitalWrite(DPIN_PWR, HIGH); + digitalWrite(DPIN_DRV_MODE, LOW); + analogWrite(DPIN_DRV_EN, 64); + break; + case MODE_MED: + Serial.println("Mode = medium"); + pinMode(DPIN_PWR, OUTPUT); + digitalWrite(DPIN_PWR, HIGH); + digitalWrite(DPIN_DRV_MODE, LOW); + analogWrite(DPIN_DRV_EN, 255); + break; + case MODE_HIGH: + Serial.println("Mode = high"); + pinMode(DPIN_PWR, OUTPUT); + digitalWrite(DPIN_PWR, HIGH); + digitalWrite(DPIN_DRV_MODE, HIGH); + analogWrite(DPIN_DRV_EN, 255); + break; + case MODE_BLINKING: + case MODE_BLINKING_PREVIEW: + Serial.println("Mode = blinking"); + pinMode(DPIN_PWR, OUTPUT); + digitalWrite(DPIN_PWR, HIGH); + digitalWrite(DPIN_DRV_MODE, HIGH); + break; + } + + mode = newMode; + } + + // Remember button state so we can detect transitions + if (newBtnDown != btnDown) + { + btnTime = time; + btnDown = newBtnDown; + delay(50); + } +}