-
Notifications
You must be signed in to change notification settings - Fork 30
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add optional support for WS2812 RGB LED, fixes #106
specific indexes in the LED color time sequence are used for: - dark separator indicates "start of sequence" (also used for LED init and re-init) - color according to indications (3bits encoded via RGB color) (can be extended to show up to 32 indication bits) - white separator indicates "start of radiation display" - color according to radiation (repeated, displayed most of the time) dark (unusually low / 0) green (normal) yellow (more than normal) red (much more than normal)
- Loading branch information
1 parent
0599416
commit 100b1f9
Showing
4 changed files
with
132 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
// show status indication via WS2812 RGB LED | ||
|
||
#include "userdefines.h" | ||
|
||
#if STATUS_LED==1 // we have a WS2812 RGB LED! | ||
|
||
#include <NeoPixelBus.h> | ||
|
||
#include "status_led.h" | ||
|
||
#define PIXEL_COUNT 1 | ||
#define PIXEL_PIN 25 | ||
|
||
RgbColor red(255, 0, 0); | ||
RgbColor green(0, 255, 0); | ||
RgbColor blue(0, 0, 255); | ||
RgbColor yellow(255, 255, 0); | ||
RgbColor white(255, 255, 255); | ||
RgbColor black(0, 0, 0); | ||
|
||
NeoPixelBus<NeoRgbFeature, Neo800KbpsMethod> LEDs(PIXEL_COUNT, PIXEL_PIN); | ||
|
||
static RgbColor last_col = black; | ||
|
||
void set_LED(RgbColor col) | ||
{ | ||
if(col == last_col) | ||
return; // nothing to change | ||
|
||
LEDs.SetPixelColor(0, col); // only 1 LED at index 0 | ||
LEDs.Show(); | ||
last_col = col; | ||
} | ||
|
||
void init_LED(void) { | ||
LEDs.Begin(); // all LEDs off | ||
LEDs.Show(); | ||
last_col = black; // consistency sw state == hw state | ||
} | ||
|
||
#define IDX_W 2 | ||
#define CSL 30 | ||
|
||
void indicate(float radiation, unsigned int indication) | ||
{ | ||
// radiation [uSv/h] given to set the primary color R that is shown most of the time | ||
// indication: 32 bit flags to indicate additional stuff, see status_led.h. | ||
// | ||
// this code will generate a time sequence of LED colors: | ||
// index color | ||
// ------------------------------------------------------ | ||
// 0 dark (LED init) | ||
// 1 indication color 1 | ||
// ... reserved for more indications | ||
// IDX_W white (LED test) | ||
// ...+1 radiation color | ||
// ... radiation color | ||
// CSL-1 radiation color | ||
|
||
RgbColor col; | ||
int r, g, b; | ||
static int index = 0; // index counting modulo COLOR_SEQUENCE_LENGTH | ||
|
||
switch(index) { | ||
case 0: // show a fixed dark separator after LED init | ||
init_LED(); // (re-)init the LED | ||
col = black; | ||
break; | ||
case 1: | ||
r = indication & I_CONN_ERROR; | ||
g = indication & I_TEST; | ||
b = indication & I_HV_ERROR; | ||
col = RgbColor(r ? 255 : 0, g ? 255 : 0, b ? 255 : 0); | ||
break; | ||
case IDX_W: // show a fixed white separator and LED test | ||
col = white; | ||
break; | ||
default: // show radiation color | ||
if(radiation > 1.0) { | ||
col = red; | ||
} else | ||
if(radiation > 0.2) { | ||
col = yellow; | ||
} else | ||
if(radiation > 0.01) { | ||
col = green; | ||
} else { | ||
col = black; | ||
} | ||
} | ||
|
||
set_LED(col); | ||
|
||
if(++index == CSL) | ||
index = 0; | ||
} | ||
|
||
#else // no STATUS_LED | ||
|
||
void indicate(float radiation, unsigned int indication) { | ||
// do nothing | ||
} | ||
|
||
#endif // STATUS_LED | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
// show status indication via WS2812 RGB LED | ||
|
||
// indication value used to reset indications to "all off" | ||
#define I_RESET 0 | ||
|
||
// indications, values are 32bit bit masks, valid values are 2^N | ||
#define I_TEST 1 // reserved to test the indication code | ||
#define I_HV_ERROR 2 // there is a problem with high voltage generation | ||
#define I_CONN_ERROR 4 // there is a problem with the network connection | ||
|
||
// indicate radiation and special indications via a color time sequence. | ||
// you should call this once from setup() like this: | ||
// indicate(0.0, I_RESET) | ||
// you should call this in regular time intervals [e.g. 1s] from loop() like this: | ||
// indicate(radiation_uSvh, indication) | ||
void indicate(float radiation, unsigned int indication); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters