#include #define NUM_LEDS 3 #define DATA_PIN PB2 // BUTTON PINS #define AUTOMODEPIN PB1 #define MANUALMODEPIN PB0 // LED PIN #define LED_PIN PB5 // LED COLOR #define LED_COLOR_GREEN 0 #define LED_COLOR_ORANGE 1 #define LED_COLOR_RED 2 // LED STATE #define LEDSTATE_GREEN 0 #define LEDSTATE_ORANGE 1 #define LEDSTATE_RED 2 #define LEDSTATE_RED_ORANGE 3 // system state #define SYSTEMSTATE_MANUAL 0 #define SYSTEMSTATE_AUTO 1 // Define the array of leds CRGB leds[NUM_LEDS]; //colord per led uint32_t colorsIDX[] = {CRGB::Green, CRGB::Orange, CRGB::Red}; // led state byte ledState; // system state byte systemState; unsigned long lastLEDStateChange; int waitPeriod[4] = {7500,1000,5000,500}; void setup() { FastLED.addLeds(leds, NUM_LEDS); pinMode(AUTOMODEPIN, INPUT_PULLUP); pinMode(MANUALMODEPIN, INPUT_PULLUP); pinMode(LED_PIN, OUTPUT); // start led state systemState = SYSTEMSTATE_AUTO; setLEDState(0); } void loop() { if (!digitalRead(MANUALMODEPIN)) { setLEDState((ledState + 1) % 4); systemState = SYSTEMSTATE_MANUAL; // quick and dirty debounce delay(500); } //end if if (!digitalRead(AUTOMODEPIN)) { systemState = SYSTEMSTATE_AUTO; // quick and dirty debounce digitalWrite(LED_PIN, HIGH); delay(500); digitalWrite(LED_PIN, LOW); } //end if // if we are on auto if (systemState == SYSTEMSTATE_AUTO) { //check time pass ... we do it with int the other if - not to do the math all the time if (lastLEDStateChange + waitPeriod[ledState] < millis()) { setLEDState((ledState + 1) % 4); // move to nect led state } //end if }//end if } //end loop void setLEDState(byte newState) { switch (newState) { case LEDSTATE_GREEN: leds[LED_COLOR_RED] = CRGB::Black; leds[LED_COLOR_ORANGE] = CRGB::Black; leds[LED_COLOR_GREEN] = colorsIDX[LED_COLOR_GREEN]; break; case LEDSTATE_ORANGE: leds[LED_COLOR_RED] = CRGB::Black; leds[LED_COLOR_ORANGE] = colorsIDX[LED_COLOR_ORANGE]; leds[LED_COLOR_GREEN] = CRGB::Black; break; case LEDSTATE_RED: leds[LED_COLOR_RED] = colorsIDX[LED_COLOR_RED]; leds[LED_COLOR_ORANGE] = CRGB::Black; leds[LED_COLOR_GREEN] = CRGB::Black; break; case LEDSTATE_RED_ORANGE: leds[LED_COLOR_RED] = colorsIDX[LED_COLOR_RED]; leds[LED_COLOR_ORANGE] = colorsIDX[LED_COLOR_ORANGE]; leds[LED_COLOR_GREEN] = CRGB::Black; break; } //end switch // set to current ledState = newState; //set last millis chnage lastLEDStateChange = millis(); // show FastLED.show(); }