#include <Arduino.h>
#define POWER_LIMIT_NORMAL 1000
#define POWER_LIMIT_CRITICAL 1200
#define MAX_POWER 2000
#define MIN_POWER 500
#define HIGH_LOAD_PIN PA5
#define MEDIUM_LOAD_PIN PA6
#define LOW_LOAD_PIN PB3
#define PWM_MAX 255
#define PWM_MIN 60
struct Load {
uint8_t pin;
bool state;
uint8_t pwmDuty;
};
Load highLoad = {HIGH_LOAD_PIN, true, PWM_MAX};
Load mediumLoad = {MEDIUM_LOAD_PIN, true, PWM_MAX};
Load lowLoad = {LOW_LOAD_PIN, true, PWM_MAX};
float currentPower = 800;
bool emergencyFlag = false;
unsigned long powerTimer = 0;
unsigned long statusTimer = 0;
void PowerMonitorTask() {
static float simulatedPower = 800;
simulatedPower += random(-40, 120);
if (!mediumLoad.state) simulatedPower -= 300;
if (!lowLoad.state) simulatedPower -= 250;
if (simulatedPower > MAX_POWER) simulatedPower = MAX_POWER;
if (simulatedPower < MIN_POWER) simulatedPower = MIN_POWER;
currentPower = simulatedPower;
}
void LoadControlTask() {
if (emergencyFlag) {
mediumLoad.state = false;
lowLoad.state = false;
lowLoad.pwmDuty = 0;
return;
}
if (currentPower <= POWER_LIMIT_NORMAL) {
mediumLoad.state = true;
lowLoad.state = true;
lowLoad.pwmDuty = PWM_MAX;
}
else if (currentPower <= POWER_LIMIT_CRITICAL) {
mediumLoad.state = false;
lowLoad.state = false;
lowLoad.pwmDuty -= 20;
if (lowLoad.pwmDuty < PWM_MIN)
lowLoad.pwmDuty = PWM_MIN;
}
else {
mediumLoad.state = false;
lowLoad.state = false;
lowLoad.pwmDuty = 0;
}
}
void UARTTask() {
if (Serial.available()) {
if (Serial.read() == 'E') {
emergencyFlag = true;
Serial.println("🚨 EMERGENCY MODE ACTIVATED");
}
}
}
void StatusTask() {
Serial.println("------ STATUS ------");
Serial.print("Power: ");
Serial.print(currentPower);
Serial.println(" W");
Serial.print("HIGH Load: ");
Serial.println(highLoad.state ? "ON" : "OFF");
Serial.print("MEDIUM Load: ");
Serial.println(mediumLoad.state ? "ON" : "OFF");
Serial.print("LOW Load: ");
Serial.println(lowLoad.state ? "ON" : "OFF");
Serial.print("LOW PWM: ");
Serial.println(lowLoad.pwmDuty);
Serial.println("--------------------");
}
void setup() {
Serial.begin(115200);
pinMode(HIGH_LOAD_PIN, OUTPUT);
pinMode(MEDIUM_LOAD_PIN, OUTPUT);
pinMode(LOW_LOAD_PIN, OUTPUT);
analogWriteResolution(8);
}
void loop() {
if (millis() - powerTimer >= 1000) {
powerTimer = millis();
PowerMonitorTask();
LoadControlTask();
}
UARTTask();
if (millis() - statusTimer >= 2000) {
statusTimer = millis();
StatusTask();
}
digitalWrite(highLoad.pin, highLoad.state);
digitalWrite(mediumLoad.pin, mediumLoad.state);
if (lowLoad.state)
analogWrite(lowLoad.pin, lowLoad.pwmDuty);
else
analogWrite(lowLoad.pin, 0);
}