/*
Akvarium – ovladacie centrum (ESP32) | Wokwi simulacia
--------------------------------------------------------
Demo logiky:
- 3x DS18B20 (jedna 1-Wire zbernica, GPIO4)
- PIR pohyb (GPIO13) -> pohybove svetlo so stmievanim
- 2x PWM stmievatelne svetlo (GPIO25 hlavne, GPIO26 pohybove)
- 4x rele (GPIO16-19), v simulacii indikovane cervenymi LED
- 1x analogovy vstup (GPIO34) = simulacia pH/TDS cez potenciometer
POZOR: Wokwi simuluje hardver a logiku, NIE spojenie s Home Assistantom.
Na realne nasadenie s HA pouzi ESPHome YAML (viem dodat samostatne).
Kniznice (zalozka libraries.txt): OneWire, DallasTemperature
*/
#include <OneWire.h>
#include <DallasTemperature.h>
// --- Piny (cisla GPIO) ---
#define PIN_ONEWIRE 4 // 3x DS18B20 na jednej zbernici
#define PIN_PIR 13 // pohybovy senzor
#define PIN_LED_MAIN 25 // hlavne stmievatelne svetlo (PWM)
#define PIN_LED_MOTION 26 // pohybove svetlo (PWM)
#define PIN_WATER 34 // analogovy vstup - pH/TDS (iba ADC1 kvoli WiFi)
const int RELAYS[4] = { 16, 17, 18, 19 };
OneWire oneWire(PIN_ONEWIRE);
DallasTemperature sensors(&oneWire);
// --- Stav ---
unsigned long lastMotionMs = 0;
const unsigned long MOTION_HOLD = 5000; // svetlo svieti 5 s po poslednom pohybe
int mainBrightness = 40; // 0-255 ; v realnom svete riadi slider v HA
void setup() {
Serial.begin(115200);
delay(300);
Serial.println("\n=== Akvarium ovladacie centrum - start ===");
sensors.begin();
Serial.printf("Najdenych teplomerov: %d\n", sensors.getDeviceCount());
pinMode(PIN_PIR, INPUT);
for (int i = 0; i < 4; i++) {
pinMode(RELAYS[i], OUTPUT);
digitalWrite(RELAYS[i], LOW);
}
// PWM vystupy – analogWrite je na ESP32 core mapovany na LEDC (0-255)
analogWrite(PIN_LED_MAIN, 0);
analogWrite(PIN_LED_MOTION, 0);
}
void loop() {
// 1) Teploty
sensors.requestTemperatures();
float t1 = sensors.getTempCByIndex(0);
float t2 = sensors.getTempCByIndex(1);
float t3 = sensors.getTempCByIndex(2);
// 2) Hlavne svetlo – PWM (v realnom svete slider v Home Assistante)
analogWrite(PIN_LED_MAIN, mainBrightness);
// 3) Pohyb -> pohybove svetlo (tlmene, nie na plno)
if (digitalRead(PIN_PIR) == HIGH) {
lastMotionMs = millis();
}
bool motionActive = (millis() - lastMotionMs) < MOTION_HOLD;
analogWrite(PIN_LED_MOTION, motionActive ? 80 : 0);
// 4) Rele – demo logika
// rele 1 = chladiaci ventilator: zopne pri T1 > 26 C
digitalWrite(RELAYS[0], (t1 > 26.0) ? HIGH : LOW);
digitalWrite(RELAYS[1], LOW); // volne (napr. cerpadlo)
digitalWrite(RELAYS[2], LOW); // volne (napr. ohrievac)
digitalWrite(RELAYS[3], LOW); // volne (napr. krmenie)
// 5) Analogovy vstup vody (simulacia pH cez potenciometer)
int raw = analogRead(PIN_WATER); // 0..4095
float pseudoPh = raw * 14.0 / 4095.0; // len demo mapovanie 0..14
// 6) Vypis do serioveho monitora
Serial.printf("T1=%.1f T2=%.1f T3=%.1f C | pohyb=%s | pH~%.2f | rele1=%d\n",
t1, t2, t3, motionActive ? "ANO" : "nie",
pseudoPh, digitalRead(RELAYS[0]));
delay(1000);
}