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

Wi-Fi Controlled Weather Station with Wemos D1 Mini and OLED Display

View and Edit Project In Cirkit DesignerImage of Wi-Fi Controlled Weather Station with Wemos D1 Mini and OLED Display

Circuit Documentation

Summary

This circuit is designed to monitor temperature and humidity using multiple DHT22 sensors and display the data on an Adafruit OLED Monochrome 128x32 SPI display. The data is also transmitted via WiFi to an MQTT server using a Wemos D1 Mini microcontroller. The circuit is powered by a 2000mAh battery, which is managed by a TP4056 charging module and an Mtiny Power module. Additionally, a SIM800c GSM module is included for potential GSM communication.

Component List

  1. Wemos D1 Mini

    • Description: A compact microcontroller based on the ESP8266, providing WiFi connectivity.
    • Pins: RST, A0, D0, D5, D6, D7, D8, 3V3, 5V, G, D4, D3, D2, D1, RX, TX
  2. Adafruit OLED Monochrome 128x32 SPI

    • Description: A small OLED display for visual output.
    • Pins: CS, RESET, DC, SCLK, MOSI, VIN, 3.3V, GND
  3. Mtiny Power

    • Description: A power management module providing 3.3V and 5V outputs.
    • Pins: 3V3, 5V, GND, VIN
  4. DHT22

    • Description: A digital temperature and humidity sensor.
    • Pins: +, Out, -
  5. 2000mAh Battery

    • Description: A rechargeable battery providing power to the circuit.
    • Pins: VCC, GND
  6. TP4056

    • Description: A lithium battery charging module.
    • Pins: OUT-, B-, B+, OUT+, IN-, IN+
  7. SIM800c GSM Module

    • Description: A GSM module for cellular communication.
    • Pins: SPK-, SPK+, MIC-, MIC+, DTR, RING, GND, TXD, RXD, LINK GND, ANT, VCC(3.7 - 4.2)

Wiring Details

Wemos D1 Mini

Adafruit OLED Monochrome 128x32 SPI

Mtiny Power

DHT22

2000mAh Battery

TP4056

SIM800c GSM Module

Code Documentation

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <WiFi.h>
#include <PubSubClient.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define DHTTYPE DHT22
#define DHTPIN1 D3
#define DHTPIN2 D4
#define DHTPIN3 D8
#define DHTPIN4 D7
DHT dht1(DHTPIN1, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);
DHT dht3(DHTPIN3, DHTTYPE);
DHT dht4(DHTPIN4, DHTTYPE);

const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* mqtt_server = "your_MQTT_SERVER";
WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  Serial.begin(115200);
  dht1.begin();
  dht2.begin();
  dht3.begin();
  dht4.begin();
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  display.clearDisplay();
  display.display();
  setup_wifi();
  client.setServer(mqtt_server, 1883);
}

void setup_wifi() {
  delay(10);
  WiFi.begin(ssid, password);
  int attempts = 0;
  while (WiFi.status() != WL_CONNECTED && attempts < 20) {
    delay(500);
    Serial.print(".");
    attempts++;
  }
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("WiFi connected");
  } else {
    Serial.println("WiFi connection failed");
  }
}

void reconnect() {
  while (!client.connected()) {
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
    } else {
      delay(5000);
    }
  }
}

void updateDisplay(const char* buffer) {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.print(buffer);
  display.display();
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  float h1 = dht1.readHumidity();
  float t1 = dht1.readTemperature();
  float h2 = dht2.readHumidity();
  float t2 = dht2.readTemperature();
  float h3 = dht3.readHumidity();
  float t3 = dht3.readTemperature();
  float h4 = dht4.readHumidity();
  float t4 = dht4.readTemperature();

  if (isnan(h1) || isnan(t1) || isnan(h2) || isnan(t2) || isnan(h3) || isnan(t3) || isnan(h4) || isnan(t4)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  char buffer[256];
  snprintf(buffer, sizeof(buffer), "DHT1: %.2fC %.2f%% DHT2: %.2fC %.2f%% DHT3: %.2fC %.2f%% DHT4: %.2fC %.2f%%", t1, h1, t2, h2, t3, h3, t4, h4);
  updateDisplay(buffer);

  char payload1[64];
  snprintf(payload1, sizeof(payload1), "{\"temp\": %.2f, \"hum\": %.2f}", t1, h1);
  client.publish("sensors/dht1", payload1);

  char payload2[