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

NodeMCU ESP8266-Based Smart Environmental Monitoring System with OLED Display

View and Edit Project In Cirkit DesignerImage of NodeMCU ESP8266-Based Smart Environmental Monitoring System with OLED Display

Circuit Documentation

Summary

This circuit integrates various sensors and modules with a NodeMCU V3 ESP8266 microcontroller to monitor environmental parameters such as gas levels, temperature, humidity, and heart rate. The data is displayed on an OLED screen and can be communicated via a GSM module. The circuit also includes a relay and a servo motor for additional control functionalities.

Component List

  1. MQ-2 Gas Sensor

    • Description: Detects gas levels in the environment.
    • Pins: GND, VCC, ANALOG, Digital
  2. NodeMCU V3 ESP8266

    • Description: Microcontroller with Wi-Fi capabilities.
    • Pins: A0, GND, VU, S3, S2, S1, SC, S0, SK, 3V3, EN, RST, Vin, D0, D1, D2, D3, D4, D5, D6, D7, D8, RX, TX
  3. OLED 1.3" Display

    • Description: Displays data visually.
    • Pins: GND, VCC, SCL, SDA
  4. MLX90614 Temperature Sensor

    • Description: Measures ambient and object temperatures.
    • Pins: SDA, SCL, GND, VIN
  5. DS3231 RTC

    • Description: Real-time clock module.
    • Pins: 32K, SQW, SCL, SDA, VCC, GND
  6. DHT11 Humidity and Temperature Sensor

    • Description: Measures humidity and temperature.
    • Pins: VDD, DATA, NULL, GND
  7. SIM800L GSM Module

    • Description: GSM module for communication.
    • Pins: 5V, GND, VDD, SIM_TXD, SIM_RXD, RST
  8. MAX30102 Heart Rate and Oxygen Sensor

    • Description: Measures heart rate and blood oxygen levels.
    • Pins: VIN, SCL, SDA, INT, IRQ, RD, GND
  9. 1 Channel Relay 5V

    • Description: Controls high voltage devices.
    • Pins: VCC, GND, IN, NC, COM, NO
  10. Servo (Wokwi Compatible)

    • Description: Servo motor for mechanical movement.
    • Pins: GND, V+, PWM

Wiring Details

MQ-2 Gas Sensor

NodeMCU V3 ESP8266

OLED 1.3" Display

MLX90614 Temperature Sensor

DS3231 RTC

DHT11 Humidity and Temperature Sensor

SIM800L GSM Module

MAX30102 Heart Rate and Oxygen Sensor

1 Channel Relay 5V

Servo (Wokwi Compatible)

Documented Code

#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_MLX90614.h>

// OLED Display Settings
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// MLX90614 Sensor
Adafruit_MLX90614 mlx = Adafruit_MLX90614();

// MQ-2 Sensor Pin
#define MQ2_PIN A0

// Thresholds for gas levels
#define GAS_SAFE_THRESHOLD 300
#define GAS_WARNING_THRESHOLD 700

void setup() {
  // Initialize Serial Communication
  Serial.begin(115200);

  // Initialize OLED Display
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Corrected initialization
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Loop forever if display initialization fails
  }
  display.clearDisplay();
  display.display();

  // Initialize MLX90614
  if (!mlx.begin()) {
    Serial.println("Error connecting to MLX90614 sensor!");
    while (1);
  }

  // Display Welcome Screen
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("MQ-2 & MLX90614");
  display.println("Initializing...");
  display.display();
  delay(2000);
  display.clearDisplay();
}

void loop() {
  // Read Analog Value from MQ-2
  int gasValue = analogRead(MQ2_PIN);

  // Read Temperature from MLX90614
  float ambientTemp = mlx.readAmbientTempC();
  float objectTemp = mlx.readObjectTempC();

  // Print Readings to Serial Monitor
  Serial.print("MQ-2 Gas Reading: ");
  Serial.println(gasValue);
  Serial.print("Ambient Temp: ");
  Serial.print(ambientTemp);
  Serial.println(" °C");
  Serial.print("Object Temp: ");
  Serial.print(objectTemp);
  Serial.println(" °C");

  // Update OLED Display
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Gas & Temp Readings:");

  // Display Gas Data
  display.setTextSize(1);
  display.setCursor(0, 10);
  display.print("Gas: ");
  display.print(gasValue);

  // Display Gas Status
  display.setCursor(0, 20);
  if (gasValue < GAS_SAFE_THRESHOLD) {
    display.println(" (Safe)");
  } else if (gasValue < GAS_WARNING_THRESHOLD) {
    display.println(" (Warning)");
  } else {
    display.println(" (Danger!)");
  }

  // Display Temperature Data
  display.setCursor(0, 35);
  display.print("Amb Temp: ");
  display.print(ambientTemp);
  display.println("C");

  display.setCursor(0, 45);
  display.print("Obj Temp: ");
  display.print(objectTemp);
  display.println("C");

  // Refresh Display
  display.display();

  // Delay before next reading
  delay(1000);
}