#include "led.h"
#include "taste.h"
#include <LiquidCrystal_I2C.h>
#define PIN_RED 10
#define PIN_YELLOW 11
#define PIN_GREEN 9
#define PIN_TASTE 3
enum light_state {red, redyellow, green, yellow};
int interval_complete = 600;
int interval_redyellow = 10 * interval_complete;
int interval_green = 10 * interval_complete;
unsigned long timer = 0;
light_state state = light_state::red;
bool entry = true;
bool button_pressed = false;
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2 rows
cLed redLED(PIN_RED); //true?
cLed yellowLED(PIN_YELLOW);
cLed greenLED(PIN_GREEN);
cTaste button(PIN_TASTE,true,200);
void setup() {
redLED.begin();
yellowLED.begin();
greenLED.begin();
button.begin();
lcd.init(); // initialize the lcd
lcd.backlight();
}
void loop() {
//lcd.clear(); // clear display
//lcd.setCursor(0, 0);
unsigned long current_time = millis();
button.run(current_time);
switch (state){
case red:
if(entry)
{
redLED.on();
entry = false;
break;
}
if(button.pressed)
{
button_pressed = true;
lcd.clear(); // clear display
lcd.setCursor(0, 0);
lcd.print("Green is coming ");
timer = current_time;
}
if((current_time - timer) > 5000 && !entry)
{
state = light_state::redyellow;
timer = current_time;
redLED.off();
entry = true;
button_pressed = false;
}
break;
case redyellow:
if(entry)
{
yellowLED.on();
redLED.on();
entry = false;
lcd.clear(); // clear display
lcd.setCursor(0, 0);
lcd.print("Green in : ");
lcd.setCursor(0, 1);
lcd.print("seconds ");
}
lcd.setCursor(10,0);
lcd.print(int(((interval_redyellow) - (current_time - timer))/1000));
if ((current_time - timer) > interval_redyellow && !entry)
{
redLED.off();
yellowLED.off();
state = light_state::green;
timer = current_time;
entry = true;
lcd.clear(); // clear display
lcd.setCursor(0, 0);
}
break;
case green:
if (entry)
{
greenLED.on();
entry = false;
lcd.print("Green for : ");
lcd.setCursor(0, 1);
lcd.print("seconds ");
}
lcd.setCursor(11,0);
lcd.print(int(((interval_green) - (current_time - timer))/1000));
if ((current_time - timer) > interval_green && !entry)
{
greenLED.off();
state = light_state::yellow;
timer = current_time;
entry = true;
lcd.clear(); // clear display
lcd.setCursor(0, 0);
}
break;
case yellow:
if(entry){
yellowLED.on();
entry = false;
}
if ((current_time - timer) > interval_redyellow && !entry)
{
yellowLED.off();
state = light_state::red;
entry = true;
}
break;
}
}