// ==================== MODUL 4 - SENZORJI VITRINE (BREZ YS01) ====================
// ESP32-S3 - Koda za MCN32R16V - YS01 IZKLJUČEN
#include <esp_now.h>
#include <esp_wifi.h>
#include <esp_mac.h>
#include <WiFi.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Preferences.h>
// ==================== DEFINICIJE PINOV ====================
// DHT22 (temperatura in vlaga zraka)
#define DHTPIN 14
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// DS18B20 (temperatura zemlje)
#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature soilTempSensor(&oneWire);
// LDR (svetloba)
#define LDR_PIN 4
// Senzor vlage tal (kapacitivni)
#define SOIL_MOISTURE_PIN 5
// ==================== GLOBALNE SPREMENLJIVKE ====================
float airTemperature = 0;
float airHumidity = 0;
int lightPercent = 0;
float soilTemperature = 0;
int soilMoisturePercent = 0;
bool dhtInitialized = false;
bool ds18b20Initialized = false;
// Kalibracijske vrednosti
int ldrMinADC = 500;
int ldrMaxADC = 3000;
int SOIL_DRY_VALUE = 4095;
int SOIL_WET_VALUE = 1500;
unsigned long lastSensorRead = 0;
#define SENSOR_READ_INTERVAL 2000
// ESP-NOW
uint8_t masterMAC[] = {0xB4, 0x3A, 0x45, 0xF3, 0xEB, 0xF0};
unsigned long lastSendTime = 0;
#define SEND_INTERVAL 10000
Preferences preferences;
// ==================== FUNKCIJE ZA BRANJE SENZORJEV ====================
void readDHT22() {
if (!dhtInitialized) return;
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(t) || isnan(h)) {
delay(100);
h = dht.readHumidity();
t = dht.readTemperature();
}
if (!isnan(t) && !isnan(h)) {
airTemperature = t;
airHumidity = h;
Serial.printf(" DHT22: T=%.1f°C, H=%.1f%%\n", airTemperature, airHumidity);
} else {
Serial.println(" DHT22: Napaka pri branju!");
}
}
void readDS18B20() {
if (!ds18b20Initialized) return;
soilTempSensor.requestTemperatures();
float temp = soilTempSensor.getTempCByIndex(0);
if (temp != -127.00 && !isnan(temp)) {
soilTemperature = temp;
Serial.printf(" DS18B20: SoilT=%.1f°C\n", soilTemperature);
} else {
Serial.println(" DS18B20: Napaka pri branju!");
}
}
void readLDR() {
int rawValue = analogRead(LDR_PIN);
rawValue = constrain(rawValue, 0, 4095);
if (ldrMaxADC > ldrMinADC) {
lightPercent = map(rawValue, ldrMinADC, ldrMaxADC, 100, 0);
} else {
lightPercent = map(rawValue, 500, 3000, 100, 0);
}
lightPercent = constrain(lightPercent, 0, 100);
Serial.printf(" LDR: ADC=%d, Light=%d%%\n", rawValue, lightPercent);
}
void readSoilMoisture() {
int rawValue = analogRead(SOIL_MOISTURE_PIN);
rawValue = constrain(rawValue, 0, 4095);
if (SOIL_DRY_VALUE > SOIL_WET_VALUE) {
soilMoisturePercent = map(rawValue, SOIL_DRY_VALUE, SOIL_WET_VALUE, 0, 100);
} else {
soilMoisturePercent = map(rawValue, 4095, 1500, 0, 100);
}
soilMoisturePercent = constrain(soilMoisturePercent, 0, 100);
Serial.printf(" Soil Moisture: ADC=%d, Percent=%d%%\n", rawValue, soilMoisturePercent);
}
void readAllSensors() {
Serial.println("\n📊 Branje senzorjev:");
readDHT22();
readLDR();
readSoilMoisture();
readDS18B20();
}
// ==================== POŠILJANJE PODATKOV ====================
void sendDataToMaster() {
if (!dhtInitialized && airTemperature == 0 && airHumidity == 0) {
return;
}
// Format: temp,hum,0,light,soilTemp,soilMoisture,TVOC=0,CO2=0,CH2O=0
char buffer[256];
snprintf(buffer, sizeof(buffer),
"%.1f,%.1f,0.0,%d,%.1f,%d,TVOC=0,CO2=0,CH2O=0",
airTemperature, airHumidity, lightPercent,
soilTemperature, soilMoisturePercent);
Serial.printf("\n📡 Pošiljam podatke: %s\n", buffer);
esp_err_t result = esp_now_send(masterMAC, (uint8_t*)buffer, strlen(buffer));
if (result == ESP_OK) {
Serial.println(" ✅ Podatki poslani!");
} else {
Serial.printf(" ❌ Napaka pri pošiljanju: %d\n", result);
}
}
// ==================== INICIALIZACIJA SENZORJEV ====================
void initSensors() {
Serial.println("\n🔧 INICIALIZACIJA SENZORJEV");
// DHT22
Serial.println("\n Inicializiram DHT22...");
dht.begin();
delay(1000);
float testH = dht.readHumidity();
float testT = dht.readTemperature();
if (!isnan(testT) && !isnan(testH)) {
dhtInitialized = true;
airTemperature = testT;
airHumidity = testH;
Serial.printf(" ✅ DHT22 inicializiran! T=%.1f°C, H=%.1f%%\n", testT, testH);
} else {
Serial.println(" ❌ DHT22 ni zaznan!");
dhtInitialized = false;
}
// DS18B20
Serial.println("\n Inicializiram DS18B20...");
pinMode(ONE_WIRE_BUS, INPUT_PULLUP);
soilTempSensor.begin();
int deviceCount = soilTempSensor.getDeviceCount();
if (deviceCount > 0) {
ds18b20Initialized = true;
Serial.printf(" ✅ DS18B20 inicializiran! (%d naprav)\n", deviceCount);
} else {
Serial.println(" ⚠️ DS18B20 ni najden");
ds18b20Initialized = false;
}
// LDR
Serial.println("\n Inicializiram LDR...");
pinMode(LDR_PIN, INPUT);
Serial.println(" ✅ LDR inicializiran!");
// Senzor vlage tal
Serial.println("\n Inicializiram senzor vlage tal...");
pinMode(SOIL_MOISTURE_PIN, INPUT);
Serial.println(" ✅ Senzor vlage tal inicializiran!");
}
// ==================== NALAGANJE KALIBRACIJSKIH VREDNOSTI ====================
void loadCalibration() {
Serial.println("\n🔧 Nalagam kalibracijske vrednosti...");
preferences.begin("module4-calib", true);
ldrMinADC = preferences.getInt("ldrMin", 500);
ldrMaxADC = preferences.getInt("ldrMax", 3000);
SOIL_DRY_VALUE = preferences.getInt("soilDry", 4095);
SOIL_WET_VALUE = preferences.getInt("soilWet", 1500);
preferences.end();
Serial.printf(" LDR kalibracija: Svetlo ADC=%d, Temno ADC=%d\n", ldrMinADC, ldrMaxADC);
Serial.printf(" Vlaga tal kalibracija: Suho ADC=%d, Mokro ADC=%d\n", SOIL_DRY_VALUE, SOIL_WET_VALUE);
}
// ==================== INICIALIZACIJA ESP-NOW ====================
void initESPNow() {
Serial.println("\n🔧 INICIALIZACIJA ESP-NOW");
WiFi.mode(WIFI_STA);
delay(100);
esp_wifi_set_promiscuous(true);
esp_wifi_set_channel(1, WIFI_SECOND_CHAN_NONE);
esp_wifi_set_promiscuous(false);
Serial.println(" 📡 Kanal nastavljen na 1");
if (esp_now_init() != ESP_OK) {
Serial.println(" ❌ Napaka pri inicializaciji ESP-NOW!");
return;
}
Serial.println(" ✅ ESP-NOW inicializiran!");
esp_now_peer_info_t peerInfo;
memset(&peerInfo, 0, sizeof(peerInfo));
memcpy(peerInfo.peer_addr, masterMAC, 6);
peerInfo.channel = 1;
peerInfo.encrypt = false;
peerInfo.ifidx = WIFI_IF_STA;
if (esp_now_add_peer(&peerInfo) == ESP_OK) {
Serial.println(" ✅ Peer (glavni sistem) dodan!");
Serial.print(" MAC naslov glavnega sistema: ");
for(int i = 0; i < 6; i++) {
Serial.printf("%02X", masterMAC[i]);
if(i < 5) Serial.print(":");
}
Serial.println();
} else {
Serial.println(" ❌ Napaka pri dodajanju peer-ja!");
}
}
// ==================== SETUP ====================
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\n\n╔════════════════════════════════════════════════════╗");
Serial.println("║ MODUL 4 - SENZORJI VITRINE (BREZ YS01) ║");
Serial.println("╚════════════════════════════════════════════════════╝\n");
WiFi.mode(WIFI_STA);
delay(100);
Serial.print("📡 MAC naslov Modula 4: ");
Serial.println(WiFi.macAddress());
initSensors();
loadCalibration();
initESPNow();
Serial.println("\n📊 Začetne meritve:");
delay(1000);
readAllSensors();
Serial.println("\n📊 STATUS INICIALIZACIJE:");
Serial.printf(" DHT22: %s\n", dhtInitialized ? "✅ OK" : "❌ NEDOSEGLJIV");
Serial.printf(" DS18B20: %s\n", ds18b20Initialized ? "✅ OK" : "⚠️ OPCIONALEN");
Serial.printf(" LDR: ✅ OK\n");
Serial.printf(" Soil Moisture: ✅ OK\n");
Serial.println("\n✅ Modul 4 pripravljen!");
Serial.println("📡 Pošiljanje podatkov vsakih 10 sekund...\n");
lastSendTime = millis();
lastSensorRead = millis();
}
// ==================== LOOP ====================
void loop() {
unsigned long now = millis();
if (now - lastSensorRead > SENSOR_READ_INTERVAL) {
readAllSensors();
lastSensorRead = now;
}
if (now - lastSendTime > SEND_INTERVAL) {
sendDataToMaster();
lastSendTime = now;
}
delay(100);
}Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1
GRETJE
HLAJENJE