// ==================== MODUL 4 - VITRINA (vsi senzorji) ====================
// ESP32-S3 mini ali ESP32-C3
#include <esp_now.h>
#include <esp_wifi.h>
#include <WiFi.h>
#include <Wire.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <HardwareSerial.h>
// ==================== DEFINICIJE PINOV ====================
// Napajanje senzorjev preko MOSFET-a za varčevanje z energijo
#define POWER_PIN 15 // GPIO za vklop senzorjev (opcijsko)
// DHT22 (temperatura in vlaga zraka)
#define DHTPIN 4
#define DHTTYPE DHT22
// LDR (notranja svetloba)
#define LDR_PIN 5
// DS18B20 (temperatura zemlje)
#define ONE_WIRE_BUS 6
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature soilTempSensor(&oneWire);
// Senzor vlage tal (kapacitivni)
#define SOIL_MOISTURE_PIN 7
// YS-Y01 V2 (kakovost zraka)
#define YS01_RX_PIN 17
#define YS01_TX_PIN 18
HardwareSerial YS01(2);
// ==================== ESP-NOW ====================
// ⚠️ VSTAVITE MAC NASLOV VAŠEGA GLAVNEGA SISTEMA!
uint8_t masterMAC[] = {0x3A, 0x2E, 0xCB, 0x3F, 0x34, 0x2E}; // SPREMENITE!
#define MODULE_ID 4
#define SEND_INTERVAL 10000 // Pošlji vsakih 10 sekund
// ==================== SENZORJI ====================
DHT dht(DHTPIN, DHTTYPE);
// Kalibracija za senzor vlage tal (prilagodite!)
int SOIL_DRY_VALUE = 3500;
int SOIL_WET_VALUE = 1800;
// Spremenljivke za meritve
float airTemperature = 0;
float airHumidity = 0;
int internalLightPercent = 0;
float soilTemperature = 0;
int soilMoisturePercent = 0;
float tvoc_ppb = 0;
float eco2_ppm = 0;
float ech2o_ppb = 0;
float batteryVoltage = 3.3;
unsigned long lastSensorRead = 0;
unsigned long lastSendTime = 0;
#define SENSOR_READ_INTERVAL 5000
// ==================== INICIALIZACIJA ====================
void initSensors() {
Serial.println("Inicializacija senzorjev...");
// Vklopi napajanje senzorjev (če uporabljate MOSFET)
pinMode(POWER_PIN, OUTPUT);
digitalWrite(POWER_PIN, HIGH);
delay(500);
// DHT22
dht.begin();
// DS18B20
soilTempSensor.begin();
// YS-Y01 V2
YS01.begin(9600, SERIAL_8N1, YS01_RX_PIN, YS01_TX_PIN);
// LDR
pinMode(LDR_PIN, INPUT);
// Senzor vlage tal
pinMode(SOIL_MOISTURE_PIN, INPUT);
Serial.println("✅ Vsi senzorji inicializirani!");
}
// ==================== BRANJE SENZORJEV ====================
void readAllSensors() {
// 1. DHT22 (temperatura in vlaga zraka)
float t = dht.readTemperature();
float h = dht.readHumidity();
if (!isnan(t)) airTemperature = t;
if (!isnan(h)) airHumidity = h;
// 2. LDR (svetloba) – 0-100%
int ldrValue = analogRead(LDR_PIN);
internalLightPercent = map(ldrValue, 0, 4095, 100, 0);
internalLightPercent = constrain(internalLightPercent, 0, 100);
// 3. DS18B20 (temperatura zemlje)
soilTempSensor.requestTemperatures();
soilTemperature = soilTempSensor.getTempCByIndex(0);
if (soilTemperature == -127) soilTemperature = 0;
// 4. Senzor vlage tal
int soilValue = analogRead(SOIL_MOISTURE_PIN);
soilMoisturePercent = map(soilValue, SOIL_DRY_VALUE, SOIL_WET_VALUE, 0, 100);
soilMoisturePercent = constrain(soilMoisturePercent, 0, 100);
// 5. YS-Y01 V2 (kakovost zraka)
readYS01();
// 6. Napetost baterije (če je na baterije)
readBattery();
// Debug izpis
Serial.printf("📊 T=%.1f°C, H=%.1f%%, Light=%d%%, SoilT=%.1f°C, SoilM=%d%%, TVOC=%d\n",
airTemperature, airHumidity, internalLightPercent,
soilTemperature, soilMoisturePercent, (int)tvoc_ppb);
}
void readYS01() {
while (YS01.available() >= 9) {
uint8_t buffer[9];
YS01.readBytes(buffer, 9);
if (buffer[0] == 0x42 && buffer[1] == 0x4D) {
tvoc_ppb = (buffer[2] << 8) | buffer[3];
eco2_ppm = (buffer[4] << 8) | buffer[5];
ech2o_ppb = (buffer[6] << 8) | buffer[7];
}
}
}
void readBattery() {
// Če merimo preko delilnika napetosti (npr. 100k/100k)
int adc = analogRead(11); // GPIO11 za merjenje baterije
batteryVoltage = (adc / 4095.0) * 3.3 * 2.0;
}
// ==================== ESP-NOW ====================
void initESPNow() {
Serial.println("Inicializacija ESP-NOW...");
WiFi.mode(WIFI_STA);
// Nastavi kanal na 10 (enako kot glavni sistem)
esp_wifi_set_promiscuous(true);
esp_wifi_set_channel(10, WIFI_SECOND_CHAN_NONE);
esp_wifi_set_promiscuous(false);
esp_now_init();
// Dodaj master kot peer
esp_now_peer_info_t peerInfo;
memset(&peerInfo, 0, sizeof(peerInfo));
memcpy(peerInfo.peer_addr, masterMAC, 6);
peerInfo.channel = 10;
peerInfo.encrypt = false;
esp_now_add_peer(&peerInfo);
Serial.println("✅ ESP-NOW inicializiran!");
}
void sendDataToMaster() {
// Pripravi podatke kot en niz (enostavno parsiranje na masterju)
char buffer[256];
snprintf(buffer, sizeof(buffer),
"M4:T=%.1f,H=%.1f,L=%d,ST=%.1f,SM=%d,TVOC=%.0f,CO2=%.0f,CH2O=%.0f,BAT=%.2f",
airTemperature, airHumidity, internalLightPercent,
soilTemperature, soilMoisturePercent,
tvoc_ppb, eco2_ppm, ech2o_ppb, batteryVoltage);
esp_now_send(masterMAC, (uint8_t*)buffer, strlen(buffer));
Serial.printf("📡 Poslano: %s\n", buffer);
}
// ==================== SETUP ====================
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("\n╔════════════════════════════════════════════╗");
Serial.println("║ MODUL 4 - VITRINA (vsi senzorji) ║");
Serial.println("╚════════════════════════════════════════════╝\n");
initSensors();
initESPNow();
Serial.println("✅ Modul 4 pripravljen!");
}
// ==================== LOOP ====================
void loop() {
unsigned long now = millis();
// Beri senzorje vsakih 5 sekund
if (now - lastSensorRead > SENSOR_READ_INTERVAL) {
readAllSensors();
lastSensorRead = now;
}
// Pošlji podatke vsakih 10 sekund
if (now - lastSendTime > SEND_INTERVAL) {
sendDataToMaster();
lastSendTime = now;
}
delay(100);
}GRETJE
HLAJENJE