#include <WiFi.h>
#include <esp_now.h>
#include <DHTesp.h>
// ======================================================
// PIN CONFIGURATION
// ======================================================
#define DHTPIN 15
#define SOIL_MOISTURE_PIN 34
#define LED_PIN 21
DHTesp dht;
// ======================================================
// SOIL MOISTURE THRESHOLD
// ======================================================
int MOISTURE_THRESHOLD_LOW = 15;
int MOISTURE_THRESHOLD_HIGH = 85;
// ======================================================
// GATEWAY MAC ADDRESS
// GANTI DENGAN MAC ADDRESS ESP32 GATEWAY
// ======================================================
uint8_t gatewayAddress[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
// ======================================================
// STRUCT DATA
// ======================================================
typedef struct struct_message {
int node_id;
int soilMoisture;
float humidity;
float temperature;
} struct_message;
struct_message sensorData;
// ======================================================
// CALLBACK STATUS PENGIRIMAN
// ======================================================
void OnDataSent(const wifi_tx_info_t *info, esp_now_send_status_t status) {
Serial.print("Send Status: ");
if (status == ESP_NOW_SEND_SUCCESS) {
Serial.println("SUCCESS");
digitalWrite(LED_PIN, HIGH);
delay(200);
digitalWrite(LED_PIN, LOW);
} else {
Serial.println("FAILED");
}
}
// ======================================================
// SETUP
// ======================================================
void setup() {
Serial.begin(115200);
Serial.println();
// LED
pinMode(LED_PIN, OUTPUT);
// DHT22
dht.setup(DHTPIN, DHTesp::DHT22);
Serial.println("ESP32 SENSOR NODE STARTED");
// ======================================================
// WIFI STA MODE
// ======================================================
WiFi.mode(WIFI_STA);
Serial.print("Node MAC Address: ");
Serial.println(WiFi.macAddress());
// ======================================================
// INIT ESP NOW
// ======================================================
if (esp_now_init() != ESP_OK) {
Serial.println("ESP-NOW Init Failed");
return;
}
esp_now_register_send_cb(OnDataSent);
// ======================================================
// REGISTER GATEWAY
// ======================================================
esp_now_peer_info_t peerInfo = {};
memcpy(peerInfo.peer_addr, gatewayAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Failed to Add Peer");
return;
}
Serial.println("ESP-NOW READY");
}
// ======================================================
// LOOP
// ======================================================
void loop() {
delay(8000);
// ======================================================
// READ SOIL MOISTURE
// ======================================================
int soilMoisturePercentage =
map(analogRead(SOIL_MOISTURE_PIN), 0, 4095, 0, 100);
// ======================================================
// READ DHT22
// ======================================================
float humidity = dht.getHumidity();
float temperature = dht.getTemperature();
// ======================================================
// VALIDATION
// ======================================================
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// ======================================================
// STORE DATA
// ======================================================
sensorData.node_id = 1;
sensorData.soilMoisture = soilMoisturePercentage;
sensorData.humidity = humidity;
sensorData.temperature = temperature;
// ======================================================
// SERIAL MONITOR
// ======================================================
Serial.println("-------------");
Serial.print("Node ID : ");
Serial.println(sensorData.node_id);
Serial.print("Soil Moisture : ");
Serial.print(sensorData.soilMoisture);
Serial.println("%");
Serial.print("Humidity : ");
Serial.print(sensorData.humidity);
Serial.println("%");
Serial.print("Temperature : ");
Serial.print(sensorData.temperature);
Serial.println("°C");
// ======================================================
// SOIL STATUS
// ======================================================
if (soilMoisturePercentage <= MOISTURE_THRESHOLD_LOW) {
Serial.println("Soil Status : DRY");
} else if (soilMoisturePercentage >= MOISTURE_THRESHOLD_HIGH) {
Serial.println("Soil Status : WET");
} else {
Serial.println("Soil Status : NORMAL");
}
// ======================================================
// KIRIM DATA LEWAT ESP NOW
// ======================================================
esp_err_t result = esp_now_send(
gatewayAddress,
(uint8_t *) &sensorData,
sizeof(sensorData)
);
if (result == ESP_OK) {
Serial.println("Data Sent Successfully");
} else {
Serial.println("Error Sending Data");
}
Serial.println("-------------");
}