#include <Arduino.h>
const int PIN_POTENTIOMETER = 12;
const int RELAY_PINS[] = {4, 5}; // Relay pins
const int NUM_RELAYS = sizeof(RELAY_PINS) / sizeof(RELAY_PINS[0]);
const int BUZZER_PIN = 25;
const int EMERGENCY_SHUTOFF_PIN = 26;
const int LevelMax = 20;
const int OverFillLevel = 35;
const int EmergencyShutOffLevel = 50;
TaskHandle_t controlTask;
TaskHandle_t emergencyTask;
void setupRelays() {
for (int i = 0; i < NUM_RELAYS; i++) {
pinMode(RELAY_PINS[i], OUTPUT);
}
}
void setup() {
Serial.begin(115200);
Serial.println("Relay Manager V1 Starting");
pinMode(PIN_POTENTIOMETER, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(EMERGENCY_SHUTOFF_PIN, INPUT_PULLUP);
setupRelays(); // Initialize relay pins
xTaskCreatePinnedToCore(controlRelaysAndBuzzer, "ControlTask", 10000, NULL, 1, &controlTask, 0);
xTaskCreatePinnedToCore(checkEmergencyShutoff, "EmergencyTask", 10000, NULL, 1, &emergencyTask, 1);
}
void controlRelays(const bool relayStates[]) {
for (int i = 0; i < NUM_RELAYS; i++) {
digitalWrite(RELAY_PINS[i], relayStates[i]);
}
}
void controlBuzzer(bool buzzerState) {
digitalWrite(BUZZER_PIN, buzzerState);
}
void emergencyShutOff() {
const bool relayStates[] = {LOW, LOW}; // Specify the relay states for emergency shut-off
controlRelays(relayStates);
controlBuzzer(LOW);
Serial.println("Emergency Shut-Off: Fill Level Exceeded Maximum");
// You can add more actions here, such as sending notifications or taking additional safety measures
}
void controlRelaysAndBuzzer(void* parameter) {
while (1) {
int levelInput = analogRead(PIN_POTENTIOMETER);
float level = levelInput / 100.0;
bool relayStates[NUM_RELAYS] = {LOW}; // Initialize all relay states to LOW
if (level < LevelMax) {
relayStates[0] = LOW; // Specify the relay state for the first relay
relayStates[1] = LOW; // Specify the relay state for the second relay
controlBuzzer(LOW);
Serial.println("Status: GOOD - Filling Current Level: " + String(level, 2));
} else if (level == LevelMax) {
relayStates[0] = HIGH; // Specify the relay state for the first relay
controlBuzzer(LOW);
Serial.println("Status: DONE - Max Level Reached Current Level: " + String(level, 2));
} else if (level > LevelMax && level <= OverFillLevel) {
relayStates[0] = HIGH; // Specify the relay state for the first relay
controlBuzzer(LOW);
Serial.println("Status: DONE - Fill Level within Safe Range Current Level: " + String(level, 2));
} else if (level > OverFillLevel && level <= EmergencyShutOffLevel) {
relayStates[0] = HIGH; // Specify the relay state for the first relay
relayStates[1] = HIGH; // Specify the relay state for the second relay
controlBuzzer(HIGH);
Serial.println("Status: WARNING - Fill Level Close to Emergency Shut-Off Current Level: " + String(level, 2));
} else if (level > EmergencyShutOffLevel) {
emergencyShutOff();
}
controlRelays(relayStates);
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
void checkEmergencyShutoff(void* parameter) {
while (1) {
if (digitalRead(EMERGENCY_SHUTOFF_PIN) == LOW) {
emergencyShutOff();
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
void loop() {
// The main loop can be left empty or used for overall system control
vTaskDelay(1000 / portTICK_PERIOD_MS);
}