const int LDR_AO = A0;
const int LED_OUT = 2;
const int BUTTON_IN = 11;
const float GAMMA = 0.7;
const float RL10 = 50;
// Hysteresis values
const float ON_LUX = 30;
const float OFF_LUX = 100;
bool lightState = false;
bool manualMode = false;
int lastButtonState = HIGH;
void setup() {
pinMode(LED_OUT, OUTPUT);
pinMode(BUTTON_IN, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
// Read LDR
int analogValue = analogRead(LDR_AO);
float voltage = analogValue / 1024.0 * 5.0;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(
RL10 * 1000 * pow(10, GAMMA) / resistance,
(1.0 / GAMMA)
);
// Read button
int currentButtonState = digitalRead(BUTTON_IN);
// Detect press event only once
if(lastButtonState == HIGH && currentButtonState == LOW) {
manualMode = !manualMode; // toggle manual mode
if(manualMode)
lightState = !lightState;
}
lastButtonState = currentButtonState;
// Automatic mode only when manual override inactive
if(!manualMode) {
if(lux < ON_LUX)
lightState = true;
else if(lux > OFF_LUX)
lightState = false;
}
digitalWrite(LED_OUT, lightState);
Serial.print("Lux: ");
Serial.print(lux);
Serial.print(" | Mode: ");
if(manualMode)
Serial.print("Manual");
else
Serial.print("Auto");
Serial.print(" | Light: ");
if(lightState)
Serial.println("ON");
else
Serial.println("OFF");
delay(100);
}