Obsah článku
title: "Firmvér pre Multifunkčný Izbový Senzor s Modbus TCP"
slug: "esp8266-room-sensor-modbus-pir-dht"
technologies: ["ESP8266", "Arduino", "Modbus TCP", "WiFiManager", "DS18B20", "DHT11", "PIR Sensor"]
tags: ["iot", "esp8266", "modbus", "home-automation", "sensor-hub", "room-sensor", "firmware", "pir", "dht11"]
date_solved: "2025-08-18"
Projekt/Téma: Vývoj firmvéru pre kompaktný a všestranný IoT modul, ktorý agreguje dáta z viacerých typov senzorov (teplota, vlhkosť, pohyb) a sprístupňuje ich spolu s ovládaním dvoch relé cez štandardný protokol Modbus TCP.
1. Cieľ / Problém na vyriešenie: Cieľom bolo vytvoriť univerzálny "senzorový hub" pre monitorovanie miestnosti, ktorý by bol jednoducho integrovateľný do nadradených systémov domácej automatizácie (napr. Home Assistant, Loxone) alebo malých priemyselných SCADA systémov. Kľúčovými požiadavkami bola jednoduchá inštalácia bez nutnosti meniť kód kvôli WiFi prihlasovacím údajom, spoľahlivá dlhodobá prevádzka a poskytovanie všetkých dát a ovládacích prvkov cez jediný, štandardizovaný komunikačný kanál (Modbus TCP).
2. Použité technológie a nástroje:
- Mikrokontrolér: ESP8266 (na doske Wemos D1 Mini).
- Vývojové prostredie: Arduino Framework.
- Senzory:
- 1x DS18B20: Presný digitálny teplotný senzor (One-Wire).
- 1x DHT11: Kombinovaný senzor teploty a vlhkosti.
- 2x PIR senzor: Pasívny infračervený senzor na detekciu pohybu.
- Aktuátory: 2x Relé modul (predpokladané ako aktívne pri nízkej úrovni - active-low).
- Protokoly a Služby:
- Modbus TCP: Primárne rozhranie pre komunikáciu.
- mDNS: Zariadenie je dostupné v sieti pod menom
room-wemos.local.
- Kľúčové knižnice:
WiFiManager: Pre grafické nastavenie WiFi pripojenia cez captive portál.ModbusIP_ESP8266: Implementácia Modbus TCP slave (servera).DallasTemperature&OneWire: Pre senzor DS18B20.DHT: Pre senzor DHT11.
3. Kľúčové postupy a konfiguračné kroky:
- Inicializácia hardvéru: V
setup()sa nastavia piny pre relé ako výstupy a sú uvedené do východiskového stavu (vypnuté). Piny pre PIR senzory sa nastavia ako vstupy. Inicializujú sa komunikačné zbernice pre senzory (One-Wire, DHT). - Konfigurácia a pripojenie k WiFi: Spustí sa
WiFiManager. Ak zariadenie nemá uložené prihlasovacie údaje, vytvorí vlastný Access Point s menomRoomSensor-XXXX. Užívateľ sa pripojí, v prehliadači zadá údaje k domácej WiFi sieti a zariadenie sa pripojí. - Definícia Modbus mapy: Všetky dostupné senzory a ovládacie prvky sú namapované na špecifické adresy v Modbus priestore. Relé sú mapované ako
Coils(pre zápis/čítanie), zatiaľ čo senzory a stavové informácie sú mapované akoInput Registers(iba na čítanie). - Hlavná slučka (Loop): Kód je navrhnutý pre nepretržitú a stabilnú prevádzku:
- Obsluha Modbus: Pravidelne sa volá
mbtcp.task(), čo je nevyhnutné pre spracovanie prichádzajúcich požiadaviek od Modbus mastera. - Periodické čítanie senzorov: V pravidelnom intervale (
sensorReadInterval) sa načíta aktuálna hodnota zo všetkých pripojených senzorov (DS18B20, DHT11, 2x PIR). - Aktualizácia Modbus registrov: Hodnoty prečítané zo senzorov, spolu so systémovými informáciami (uptime, RSSI), sa okamžite zapíšu do príslušných Input Registrov, aby boli k dispozícii pre Modbus mastera.
- Ovládanie relé: Stav fyzických relé sa neustále synchronizuje so stavom Modbus
Coils. Ak master zmení stavCOIL_RELE1natrue, firmvér nastaví príslušný GPIO pin naLOW(pre active-low relé), čím ho zopne. - Watchdog: Je aktivovaný hardvérový watchdog, ktorý je pravidelne "kŕmený". Ak by sa program zacyklil, watchdog automaticky reštartuje zariadenie.
- Obsluha Modbus: Pravidelne sa volá
4. Výsledné kódy a skripty:
-
Definícia Modbus mapy: Toto je najdôležitejšia časť pre integráciu. Definuje "API" zariadenia pre akýkoľvek Modbus-kompatibilný systém.
// Coils (for control) #define COIL_RELE1 15 // Coil: Relay 1 control #define COIL_RELE2 16 // Coil: Relay 2 control #define COIL_RESET_WIFI_SETTINGS 23 // NEW: For resetting WiFi settings // Input Registers (for reading states and sensors) #define IREG_UPTIME 18 // Input Register: Module uptime in minutes #define IREG_RSSI 19 // Input Register: WiFi signal strength (RSSI) #define IREG_OUT_TEMP_DS 22 // Input Register: Outdoor temperature from DS18B20 (in C * 100) #define IREG_PIR1_STATE 24 // Input Register: State of PIR sensor 1 (1 = motion, 0 = no motion) #define IREG_PIR2_STATE 25 // Input Register: State of PIR sensor 2 (1 = motion, 0 = no motion) #define IREG_DHT_TEMP 26 // Input Register: Temperature from DHT11 (C * 100) #define IREG_DHT_HUMIDITY 27 // Input Register: Humidity from DHT11 (RH * 100)
5. Zistené problémy a riešenia (Gotchas):
- Problém: Ako zmeniť WiFi sieť bez nutnosti pripojenia zariadenia k počítaču a preprogramovania?
- Riešenie: Implementácia funkcie vzdialeného resetu WiFi. Zápisom hodnoty
truedo ModbusCoil-uCOIL_RESET_WIFI_SETTINGSsa vymažú uložené prihlasovacie údaje a po automatickom reštarte sa opäť spustí konfiguračný portál WiFiManagera. Toto je kľúčová funkcia pre jednoduchú správu zariadenia v teréne.
- Riešenie: Implementácia funkcie vzdialeného resetu WiFi. Zápisom hodnoty
- Problém: Zariadenie používa dva rôzne teplotné senzory (DS18B20 a DHT11). Ako sa vyhnúť konfliktu?
- Riešenie: Hodnoty z každého senzora sú mapované na oddelené Modbus registre (
IREG_OUT_TEMP_DSaIREG_DHT_TEMP). Toto je správny návrhový vzor, ktorý umožňuje nadradenému systému vybrať si, ktorý zdroj teploty chce použiť (napr. presnejší DS18B20 pre kritické merania a DHT11 pre orientačnú izbovú teplotu).
- Riešenie: Hodnoty z každého senzora sú mapované na oddelené Modbus registre (
- Problém: Rôzne relé moduly majú odlišnú logiku spínania (active-low vs. active-high).
- Riešenie: Kód je explicitne napísaný a okomentovaný pre active-low relé. Logika
if (mbtcp.Coil(COIL_RELE1) == 1) { digitalWrite(RELE1_PIN, LOW); }správne prekladá logickú požiadavku "zapni" (true/1) na fyzický signálLOW, ktorý je potrebný na zopnutie tohto typu relé. Týmto sa abstrahuje hardvérová špecifickosť od logiky v nadradenom systéme.
- Riešenie: Kód je explicitne napísaný a okomentovaný pre active-low relé. Logika
6. Finálny výsledok / Záver: Firmvér predstavuje robustný a flexibilný základ pre vytvorenie univerzálneho senzorového a akčného uzla pre systémy domácej automatizácie. Kombinácia viacerých senzorov, štandardizovaného Modbus TCP rozhrania, užívateľsky prívetivého nastavenia WiFi cez WiFiManager a zabudovaných mechanizmov pre stabilitu (watchdog, remote reset) z neho robí spoľahlivé a ľahko nasaditeľné riešenie.