enum Mode {
AUTO_MODE,
MANUAL_MODE
};
const int TEMP_PIN = 26;
const int LIGHT_PIN = 27;
const int BUTTON_PIN = 15;
const int LED_PIN = 16;
const int BUZZER_PIN = 17;
Mode currentMode = AUTO_MODE;
int tempValue = 0;
int lightValue = 0;
int tempThreshold = 700;
int lightThreshold = 300;
int manualTempValue = 0;
int manualLightValue = 1023;
bool ledState = false;
bool buzzerState = false;
bool manualLed = false;
bool manualBuzzer = false;
bool logEnabled = true;
unsigned long lastMonitorTime = 0;
unsigned long lastBlinkTime = 0;
bool alarmBlinkState = false;
// антидребезг кнопки
bool lastButtonReading = HIGH;
bool stableButtonState = HIGH;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;
String modeName() {
return currentMode == AUTO_MODE ? "AUTO" : "MANUAL";
}
void setup() {
Serial1.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
delay(200);
Serial1.println("=== MINI SCADA SYSTEM ===");
Serial1.println("Button on GP15 switches AUTO/MANUAL");
Serial1.println("Commands:");
Serial1.println("HELP");
Serial1.println("STATUS");
Serial1.println("MODE AUTO");
Serial1.println("MODE MANUAL");
Serial1.println("TEMP 500");
Serial1.println("LIGHT 200");
Serial1.println("LED ON");
Serial1.println("LED OFF");
Serial1.println("BUZZER ON");
Serial1.println("BUZZER OFF");
Serial1.println("SET TEMP=700");
Serial1.println("SET LIGHT=300");
Serial1.println("LOG ON");
Serial1.println("LOG OFF");
Serial1.println();
}
void loop() {
readSensors();
handleButton();
handleSerial();
processLogic();
updateOutputs();
printMonitor();
}
void readSensors() {
if (currentMode == AUTO_MODE) {
tempValue = analogRead(TEMP_PIN);
lightValue = analogRead(LIGHT_PIN);
} else {
tempValue = manualTempValue;
lightValue = manualLightValue;
}
}
void handleButton() {
bool reading = digitalRead(BUTTON_PIN);
if (reading != lastButtonReading) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != stableButtonState) {
stableButtonState = reading;
if (stableButtonState == LOW) {
if (currentMode == AUTO_MODE) {
currentMode = MANUAL_MODE;
Serial1.println("[BUTTON] MODE=MANUAL");
} else {
currentMode = AUTO_MODE;
Serial1.println("[BUTTON] MODE=AUTO");
}
}
}
}
lastButtonReading = reading;
}
void handleSerial() {
if (!Serial1.available()) return;
String cmd = Serial1.readStringUntil('\n');
cmd.trim();
cmd.toUpperCase();
if (cmd == "HELP") {
Serial1.println("Commands:");
Serial1.println("STATUS");
Serial1.println("MODE AUTO");
Serial1.println("MODE MANUAL");
Serial1.println("TEMP 500");
Serial1.println("LIGHT 200");
Serial1.println("LED ON");
Serial1.println("LED OFF");
Serial1.println("BUZZER ON");
Serial1.println("BUZZER OFF");
Serial1.println("SET TEMP=700");
Serial1.println("SET LIGHT=300");
Serial1.println("LOG ON");
Serial1.println("LOG OFF");
return;
}
if (cmd == "STATUS") {
printStatusNow();
return;
}
if (cmd == "MODE AUTO") {
currentMode = AUTO_MODE;
Serial1.println("[OK] MODE=AUTO");
return;
}
if (cmd == "MODE MANUAL") {
currentMode = MANUAL_MODE;
Serial1.println("[OK] MODE=MANUAL");
return;
}
if (cmd.startsWith("TEMP ")) {
if (currentMode == MANUAL_MODE) {
int value = cmd.substring(5).toInt();
if (value >= 0 && value <= 1023) {
manualTempValue = value;
tempValue = manualTempValue;
Serial1.print("[OK] MANUAL TEMP=");
Serial1.println(manualTempValue);
} else {
Serial1.println("[ERROR] TEMP must be 0..1023");
}
} else {
Serial1.println("[ERROR] Switch to MANUAL first");
}
return;
}
if (cmd.startsWith("LIGHT ")) {
if (currentMode == MANUAL_MODE) {
int value = cmd.substring(6).toInt();
if (value >= 0 && value <= 1023) {
manualLightValue = value;
lightValue = manualLightValue;
Serial1.print("[OK] MANUAL LIGHT=");
Serial1.println(manualLightValue);
} else {
Serial1.println("[ERROR] LIGHT must be 0..1023");
}
} else {
Serial1.println("[ERROR] Switch to MANUAL first");
}
return;
}
if (cmd == "LED ON") {
if (currentMode == MANUAL_MODE) {
manualLed = true;
Serial1.println("[OK] LED=ON");
} else {
Serial1.println("[ERROR] Switch to MANUAL first");
}
return;
}
if (cmd == "LED OFF") {
if (currentMode == MANUAL_MODE) {
manualLed = false;
Serial1.println("[OK] LED=OFF");
} else {
Serial1.println("[ERROR] Switch to MANUAL first");
}
return;
}
if (cmd == "BUZZER ON") {
if (currentMode == MANUAL_MODE) {
manualBuzzer = true;
Serial1.println("[OK] BUZZER=ON");
} else {
Serial1.println("[ERROR] Switch to MANUAL first");
}
return;
}
if (cmd == "BUZZER OFF") {
if (currentMode == MANUAL_MODE) {
manualBuzzer = false;
Serial1.println("[OK] BUZZER=OFF");
} else {
Serial1.println("[ERROR] Switch to MANUAL first");
}
return;
}
if (cmd.startsWith("SET TEMP=")) {
int value = cmd.substring(9).toInt();
if (value >= 0 && value <= 1023) {
tempThreshold = value;
Serial1.print("[OK] TEMP THRESHOLD=");
Serial1.println(tempThreshold);
} else {
Serial1.println("[ERROR] TEMP must be 0..1023");
}
return;
}
if (cmd.startsWith("SET LIGHT=")) {
int value = cmd.substring(10).toInt();
if (value >= 0 && value <= 1023) {
lightThreshold = value;
Serial1.print("[OK] LIGHT THRESHOLD=");
Serial1.println(lightThreshold);
} else {
Serial1.println("[ERROR] LIGHT must be 0..1023");
}
return;
}
if (cmd == "LOG ON") {
logEnabled = true;
Serial1.println("[OK] LOG=ON");
return;
}
if (cmd == "LOG OFF") {
logEnabled = false;
Serial1.println("[OK] LOG=OFF");
return;
}
Serial1.println("[ERROR] Unknown command");
}
void processLogic() {
if (currentMode == AUTO_MODE) {
bool tempHigh = tempValue > tempThreshold;
bool lightLow = lightValue < lightThreshold;
ledState = tempHigh || lightLow;
if (tempHigh && lightLow) {
if (millis() - lastBlinkTime >= 250) {
lastBlinkTime = millis();
alarmBlinkState = !alarmBlinkState;
}
buzzerState = alarmBlinkState;
} else {
buzzerState = false;
}
} else {
bool tempHigh = tempValue > tempThreshold;
bool lightLow = lightValue < lightThreshold;
ledState = manualLed || tempHigh || lightLow;
buzzerState = manualBuzzer || (tempHigh && lightLow);
}
}
void updateOutputs() {
digitalWrite(LED_PIN, ledState ? HIGH : LOW);
digitalWrite(BUZZER_PIN, buzzerState ? HIGH : LOW);
}
void printMonitor() {
if (!logEnabled) return;
if (millis() - lastMonitorTime >= 1000) {
lastMonitorTime = millis();
Serial1.print("[MONITOR] MODE=");
Serial1.print(modeName());
Serial1.print(" TEMP=");
Serial1.print(tempValue);
Serial1.print(" LIGHT=");
Serial1.print(lightValue);
Serial1.print(" TEMP_LIMIT=");
Serial1.print(tempThreshold);
Serial1.print(" LIGHT_LIMIT=");
Serial1.print(lightThreshold);
Serial1.print(" LED=");
Serial1.print(ledState ? "ON" : "OFF");
Serial1.print(" BUZZER=");
Serial1.println(buzzerState ? "ON" : "OFF");
}
}
void printStatusNow() {
Serial1.print("[STATUS] MODE=");
Serial1.print(modeName());
Serial1.print(" TEMP=");
Serial1.print(tempValue);
Serial1.print(" LIGHT=");
Serial1.print(lightValue);
Serial1.print(" TEMP_LIMIT=");
Serial1.print(tempThreshold);
Serial1.print(" LIGHT_LIMIT=");
Serial1.print(lightThreshold);
Serial1.print(" LED=");
Serial1.print(ledState ? "ON" : "OFF");
Serial1.print(" BUZZER=");
Serial1.println(buzzerState ? "ON" : "OFF");
}