#define STATE_OFF 0
#define STATE_DIM 1
#define STATE_NORMAL 2
#define STATE_ALERT 3
int LED = 9;
int BUTTON = 2;
int PHOTO = A0;
int currentState = STATE_OFF;
long lastPress = 0;
bool buttonPressed = false;
void setup() {
pinMode(LED, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
pinMode(PHOTO, INPUT);
}
void loop() {
checkTransitions();
executeState();
delay(50);
}
void changeState(int newState) {
currentState = newState;
}
void executeState() {
switch (currentState) {
case STATE_OFF:
analogWrite(LED, 0);
break;
case STATE_DIM:
analogWrite(LED, 64);
break;
case STATE_NORMAL:
analogWrite(LED, 255);
break;
case STATE_ALERT:
if (millis() % 400 < 200) {
analogWrite(LED, 255);
}
else {
analogWrite(LED, 0);
}
break;
}
}
void checkTransitions() {
if (!digitalRead(BUTTON)) {
if (!buttonPressed && millis() - lastPress > 300) {
changeState((currentState + 1) % 4);
buttonPressed = true;
lastPress = millis();
}
}
else {
buttonPressed = false;
}
int light = analogRead(PHOTO);
if (light > 500 && currentState != STATE_DIM) {
changeState(STATE_DIM);
}
}