A wireless IoT system for monitoring environmental conditions (temperature, humidity, CO2) and water tank levels using ESP32 microcontrollers with ESP-NOW communication.
![]() |
![]() |
![]() |
-
Sensor Node (Transmitter)
- DHT11 temperature/humidity sensor
- HC-SR04 ultrasonic distance sensor (water level)
- MQ-135 air quality sensor (CO2 levels)
- RGB LED status indicator
- Buzzer alerts for warnings
- Button calibration system
-
Display Unit (Receiver)
- ILI9341 TFT display interface
- Real-time data visualization
- Warning system for critical conditions
- Auto-calibration prompts
- Connection status monitoring
- ESP32 microcontroller
- DHT11 sensor
- HC-SR04 ultrasonic sensor
- MQ-135 gas sensor
- Passive buzzer
- Tactile button
- Common cathode RGB LED
- Breadboard & jumper wires
- ESP32 microcontroller
- ILI9341 2.8" TFT display
- Breadboard & jumper wires
-
Arduino IDE Setup
- Install ESP32 board support
- Required libraries:
DHT sensor libraryESP32 ESP-NOWAdafruit SSD1306Adafruit GFX LibraryAdafruit ILI9341
-
Hardware Connections
Sensor Node
DHT11 -> GPIO17
HC-SR04: Trig -> GPIO15 Echo -> GPIO18
Buzzer -> GPIO19
Button -> GPIO13 (pull-up)
RGB LED: Red -> GPIO14 Green -> GPIO12 Blue -> GPIO27
MQ-135 -> GPIO35
Display Unit
TFT_CS -> GPIO5
TFT_RST -> GPIO4
TFT_DC -> GPIO16
TFT_MOSI -> GPIO23
TFT_CLK -> GPIO18
ESP-NOW Setup Update MAC addresses in both sketches:
// Transmitter code (replace with receiver MAC) uint8_t receiverMacAddress[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
// Receiver code (replace with transmitter MAC) uint8_t expectedMac[] = {0x80,0x7D,0x3A,0xF8,0x1A,0x24};
Initial calibration on first boot:
Hold button for 3 seconds
System measures empty tank distance
RGB LED confirms calibration
Sensor Node Automatically sends data every 500ms
Button press for recalibration
Visual alerts:
White: Normal operation
Blinking blue: Calibration needed
Blinking red: Warning condition
Display Unit
Shows real-time sensor data
Warning displays for:
Tank overflow/empty
Critical CO2 levels
Connection status monitoring
Adjust thresholds in waterTankStatus()
Modify update intervals:
const unsigned long updateInterval = 500; // Transmitter
const unsigned long displayTimeout = 5000; // Receiver
Enhance MQ-135 calibration (current implementation uses simple linear conversion)
Ensure MAC addresses match between devices
Check sensor wiring connections
Monitor serial output (115200 baud)
Reset both devices if connection drops
Note: This system requires line-of-sight between ESP32 devices for reliable ESP-NOW communication (range up to 200m in open space).
This project is licensed under the MIT License - see the LICENSE file for details.


