Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

ESP32-Based Environmental Monitoring System with Wi-Fi Connectivity

View and Edit Project In Cirkit DesignerImage of ESP32-Based Environmental Monitoring System with Wi-Fi Connectivity

Circuit Documentation

Summary

This document provides a detailed overview of a multi-sensor environmental monitoring system based on the ESP32 microcontroller. The system integrates various sensors to measure parameters such as temperature, humidity, air quality, pH, and TDS. The collected data is displayed on an OLED screen and sent to ThingSpeak for remote monitoring. Additionally, the system can send email alerts if any critical environmental parameters are detected.

Component List

  1. TDS Sensor

    • Description: Measures the Total Dissolved Solids (TDS) in water.
    • Pins: P1, P2, +, -, A
  2. RTD PT100

    • Description: Measures temperature using a resistance temperature detector.
    • Pins: 1, 2
  3. MQ-7 Breakout

    • Description: Measures carbon monoxide (CO) levels in the air.
    • Pins: VCC, GND, DO, AO
  4. PM2.5 Air Quality Sensor and Breadboard Adapter Kit - PMS5003

    • Description: Measures particulate matter (PM2.5 and PM10) in the air.
    • Pins: VCC, GND, SET, RX, TX, RST
  5. DHT11 Humidity and Temperature Sensor

    • Description: Measures humidity and temperature.
    • Pins: VDD, DATA, NULL, GND
  6. DS18B20 1-Wire Temperature Sensor Probe Cable

    • Description: Measures temperature using a 1-Wire interface.
    • Pins: shield, GND, DQ, VDD
  7. 0.96" OLED

    • Description: Displays sensor data.
    • Pins: GND, VDD, SCK, SDA
  8. ESP32 (30 pin)

    • Description: Microcontroller that integrates WiFi and Bluetooth capabilities.
    • Pins: EN, VP, VN, D34, D35, D32, D33, D25, D26, D27, D14, D12, D13, GND, Vin, D23, D22, TX0, RX0, D21, D19, D18, D5, TX2, RX2, D4, D2, D15, 3V3
  9. Resistor

    • Description: Provides resistance in the circuit.
    • Pins: pin1, pin2
    • Properties: Resistance: 4700 Ohms
  10. PH Meter

    • Description: Measures the pH level of a solution.
    • Pins: Signal, VCC, GND

Wiring Details

TDS Sensor

RTD PT100

MQ-7 Breakout

PM2.5 Air Quality Sensor and Breadboard Adapter Kit - PMS5003

DHT11 Humidity and Temperature Sensor

DS18B20 1-Wire Temperature Sensor Probe Cable

0.96" OLED

ESP32 (30 pin)

Resistor

PH Meter

Documented Code

#include <WiFi.h>
#include <HTTPClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DHT.h>
#include <SoftwareSerial.h>
#include <ESP32_MailClient.h> // Include the ESP32 Mail Client library
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>

// WiFi Credentials
const char* ssid = "Hi";
const char* password = "Nitish$1";

// ThingSpeak Settings
const char* server = "https://api.thingspeak.com/update";
const char* apiKey = "SA5WC1ARSF8DR3X0";

// SMTP Credentials
#define SMTP_HOST "smtp.gmail.com"
#define SMTP_PORT 465
#define EMAIL_SENDER "environmentalmonitoring25@gmail.com"
#define EMAIL_PASSWORD "avca vhui momg xecl"
#define EMAIL_RECIPIENT "nitishksn24@gmail.com"

// Pin Definitions
#define PH_SENSOR_PIN 34
#define TDS_SENSOR_PIN 35
#define DS18B20_PIN 4
#define DHT_PIN 5
#define DHT_TYPE DHT11
#define MQ7_SENSOR_PIN 32
#define PMS5003_RX_PIN 16
#define PMS5003_TX_PIN 17

#define NUM_SAMPLES 15

// Calibration Parameters
float pH_slope = -0.0123;
float pH_offset = 31.2000;
#define RL_VALUE 10.0
#define R0 10.0

// OLED Display Configuration
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

DHT dht(DHT_PIN, DHT_TYPE);
OneWire oneWire(DS18B20_PIN);
DallasTemperature sensors(&oneWire);
SoftwareSerial pmsSerial(PMS5003_RX_PIN, PMS5003_TX_PIN);

SMTPData smtpData;

void sendEmailAlert(String subject, String message) {
  smtpData.setLogin(SMTP_HOST, SMTP_PORT, EMAIL_SENDER, EMAIL_PASSWORD);
  smtpData.setSender("Smart Env Monitor", EMAIL_SENDER);
  smtpData.addRecipient(EMAIL_RECIPIENT);
  smtpData.setSubject(subject);
  smtpData.setMessage(message, false);

  if (!MailClient.sendMail(smtpData)) {
    Serial.println("Error sending Email, " + MailClient.smtpErrorReason());
  }
  smtpData.empty(); // Clear all data after sending
}

void setup() {
  Serial.begin(115200);
  pmsSerial.begin(9600);

  dht.begin();
  sensors.begin();
  analogReadResolution(12);

  // Initialize OLED Display
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println("SSD1306 allocation failed");
    for (;;); // Don't proceed, loop forever
  }
  display.clearDisplay();

  // WiFi Setup
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nConnected to WiFi!");
}

float calculateCOppm(float voltage) {
  float Rs = (3.3 - voltage) * RL_VALUE / voltage;
  float ratio = Rs / R0;
  if (ratio > 1) {
    return pow(10, (log10(ratio) - 0.08) / -0.67);
  } else {
    return pow(10, (log10(ratio) - 0.38) / -0.