#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// ---------------- GPIO DEFINICE ----------------
// Drinking water
#define DW_A 10
#define DW_B 11
// Bypass
#define BY_A 12
#define BY_B 13
// Service water
#define SW_A 14
#define SW_B 15
// Tlačítka (HIGH při stisku)
#define BTN_UP 8
#define BTN_DOWN 9
#define BTN_ENTER 6
#define BTN_ESCAPE 7
// ---------------- FUNKCE VENTILŮ ----------------
// Drinking water
void openDrinking() {
digitalWrite(DW_A, HIGH);
digitalWrite(DW_B, HIGH);
}
void closeDrinking() {
digitalWrite(DW_A, LOW);
digitalWrite(DW_B, HIGH);
}
// Bypass
void openBypass() {
digitalWrite(BY_A, HIGH);
digitalWrite(BY_B, HIGH);
}
void closeBypass() {
digitalWrite(BY_A, LOW);
digitalWrite(BY_B, HIGH);
}
// Service water
void openService() {
digitalWrite(SW_A, HIGH);
digitalWrite(SW_B, HIGH);
}
void closeService() {
digitalWrite(SW_A, LOW);
digitalWrite(SW_B, HIGH);
}
// ---------------- BEZPEČNÉ UKONČENÍ ----------------
// Po každé akci se musí vypnout B vodič všech ventilů
void safeEnd() {
digitalWrite(DW_B, LOW); // Drinking GP11
digitalWrite(BY_B, LOW); // Bypass GP13
digitalWrite(SW_B, LOW); // Service GP15
}
// ---------------- OLED ANIMACE ----------------
void processValve(const char* name, bool opening,
void (*openFunc)(), void (*closeFunc)())
{
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
// Odpočet 20 → 0
for (int i = 20; i >= 0; i--) {
display.clearDisplay();
display.setCursor(0, 0);
display.println(name);
display.setCursor(0, 25);
if (opening)
display.println("OPENING");
else
display.println("CLOSING");
display.setCursor(0, 50);
display.print("T-");
display.print(i);
display.display();
delay(200); // DEMO rychlost (20×200ms = 4s)
}
// Provedení akce
if (opening)
openFunc();
else
closeFunc();
// Bezpečné ukončení
safeEnd();
// Výsledný stav
display.clearDisplay();
display.setCursor(0, 0);
display.println(name);
display.setCursor(0, 25);
if (opening)
display.println("OPEN");
else
display.println("CLOSED");
display.display();
delay(1500);
}
// ---------------- SETUP ----------------
void setup() {
// I2C
Wire.setSDA(4);
Wire.setSCL(5);
Wire.begin();
// OLED
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Valve System Ready");
display.display();
delay(1000);
// Tlačítka
pinMode(BTN_UP, INPUT_PULLDOWN);
pinMode(BTN_DOWN, INPUT_PULLDOWN);
pinMode(BTN_ENTER, INPUT_PULLDOWN);
pinMode(BTN_ESCAPE, INPUT_PULLDOWN);
// Výstupy ventilů
pinMode(DW_A, OUTPUT);
pinMode(DW_B, OUTPUT);
pinMode(BY_A, OUTPUT);
pinMode(BY_B, OUTPUT);
pinMode(SW_A, OUTPUT);
pinMode(SW_B, OUTPUT);
// Výchozí stav – vše CLOSED
closeDrinking();
closeBypass();
closeService();
safeEnd();
}
// ---------------- LOOP – DEMO ----------------
void loop() {
// Drinking water
processValve("DRINKING", true, openDrinking, closeDrinking);
processValve("DRINKING", false, openDrinking, closeDrinking);
// Bypass
processValve("BYPASS", true, openBypass, closeBypass);
processValve("BYPASS", false, openBypass, closeBypass);
// Service water
processValve("SERVICE", true, openService, closeService);
processValve("SERVICE", false, openService, closeService);
delay(2000);
}
Drinking water
Service water
Bypass
UP
DOWN
ENTER
ESCAPE