#include <Arduino_FreeRTOS.h>
#include <LiquidCrystal_I2C.h>
// Ustawienia LED dla każdego czujnika
const int ledRedPins[] = {13, 10, 7, 4}; // Piny czerwonych LED
const int ledGreenPins[] = {12, 9, 6, 3}; // Piny zielonych LED
const int ledBluePins[] = {11, 8, 5, 2}; // Piny niebieskich LED
const char* sensorNames[] = {"Sensor 1", "Sensor 2", "Sensor 3", "Sensor 4"}; // Nazwy czujników
// Symulowane napięcia dla różnych stanów
const float normalState = 2.5; // Napięcie dla stanu normalnego (drzwi zamknięte)
const float alarmState = 3.5; // Napięcie dla alarmu (drzwi otwarte)
const float sabotageState = 4.8; // Napięcie dla sabotażu
const float noSignal = 0.5; // Napięcie dla braku sygnału
// Tablica aktualnych stanów czujników
int simulatedStates[] = {0, 1, 2, 3}; // 0: brak sygnału, 1: normalny, 2: alarm, 3: sabotaż
// Inicjalizacja wyświetlacza LCD
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
void setup() {
// Konfiguracja pinów LED jako wyjścia
for (int i = 0; i < 4; i++) {
pinMode(ledRedPins[i], OUTPUT);
pinMode(ledGreenPins[i], OUTPUT);
pinMode(ledBluePins[i], OUTPUT);
}
// Inicjalizacja LCD
lcd.init();
lcd.backlight();
}
void loop() {
lcd.clear(); // Czyszczenie LCD na początku pętli
// Odczyt i analiza stanu każdego czujnika i LED
for (int i = 0; i < 4; i++) {
float voltage = getSimulatedVoltage(simulatedStates[i]); // Pobierz napięcie dla aktualnego stanu
handleSensor(voltage, ledRedPins[i], ledGreenPins[i], ledBluePins[i], sensorNames[i], i);
}
delay(1000); // Odczekaj 1 sekundę
}
// Funkcja do ustawienia stanu diod LED
void setLEDState(int redPin, int greenPin, int bluePin, int redState, int greenState, int blueState) {
digitalWrite(redPin, redState);
digitalWrite(greenPin, greenState);
digitalWrite(bluePin, blueState);
}
// Funkcja do obsługi jednego czujnika
void handleSensor(float voltage, int redPin, int greenPin, int bluePin, const char* sensorName, int index) {
// Wyświetlanie napięcia na LCD
lcd.setCursor(0, index);
lcd.print(sensorName);
lcd.print(": ");
lcd.print(voltage, 2); // Wyświetlanie napięcia z dokładnością do 2 miejsc po przecinku
// Logika analizy stanu czujnika
if (voltage < 0.6) {
// Stan OK (zielony)
setLEDState(redPin, greenPin, bluePin, LOW, HIGH, LOW);
} else if (voltage > 2.0 && voltage < 3.0) {
// Alarm (czerwony)
setLEDState(redPin, greenPin, bluePin, HIGH, LOW, LOW);
} else if (voltage > 3.0 && voltage < 4.0) {
// Sabotaż (niebieski)
setLEDState(redPin, greenPin, bluePin, LOW, LOW, HIGH);
} else {
// Stan nieznany (wszystkie LED wyłączone)
setLEDState(redPin, greenPin, bluePin, LOW, LOW, LOW);
}
}
// Funkcja do pobrania napięcia na podstawie stanu
float getSimulatedVoltage(int state) {
switch (state) {
case 0: return noSignal; // Brak sygnału
case 1: return normalState; // Stan normalny
case 2: return alarmState; // Alarm
case 3: return sabotageState; // Sabotaż
default: return 0; // Domyślnie brak sygnału
}
}G1
G2
GP
IN
TMP
NC
TMP
TMP
TMP
NC
NC
NC
NO
NO
NO
NO
OK - green
ALARM: red
SABOTAGE: blue
ARMED STATE
all switches in the LEFT position