Wi-Fi Controlled Weather Station with Wemos D1 Mini and OLED Display
View and Edit Project In Cirkit Designer
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
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
Adafruit OLED Monochrome 128x32 SPI
- Description: A small OLED display for visual output.
- Pins: CS, RESET, DC, SCLK, MOSI, VIN, 3.3V, GND
Mtiny Power
- Description: A power management module providing 3.3V and 5V outputs.
- Pins: 3V3, 5V, GND, VIN
DHT22
- Description: A digital temperature and humidity sensor.
- Pins: +, Out, -
2000mAh Battery
- Description: A rechargeable battery providing power to the circuit.
- Pins: VCC, GND
TP4056
- Description: A lithium battery charging module.
- Pins: OUT-, B-, B+, OUT+, IN-, IN+
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
- D7 connected to DHT22 (Out)
- D8 connected to DHT22 (Out)
- 5V connected to DHT22 (+), Mtiny Power (5V), Adafruit OLED Monochrome 128x32 SPI (VIN)
- G connected to DHT22 (-), SIM800c GSM Module (GND), Mtiny Power (GND), Adafruit OLED Monochrome 128x32 SPI (GND)
- D4 connected to DHT22 (Out)
- D3 connected to DHT22 (Out)
- D2 connected to Adafruit OLED Monochrome 128x32 SPI (MOSI)
- D1 connected to Adafruit OLED Monochrome 128x32 SPI (SCLK)
- RX connected to SIM800c GSM Module (RXD)
- TX connected to SIM800c GSM Module (TXD)
Adafruit OLED Monochrome 128x32 SPI
- VIN connected to Wemos D1 Mini (5V)
- GND connected to Wemos D1 Mini (G)
- MOSI connected to Wemos D1 Mini (D2)
- SCLK connected to Wemos D1 Mini (D1)
Mtiny Power
- 5V connected to Wemos D1 Mini (5V)
- GND connected to Wemos D1 Mini (G)
- 3V3 connected to SIM800c GSM Module (VCC(3.7 - 4.2))
- VIN connected to TP4056 (OUT+)
DHT22
- Out connected to Wemos D1 Mini (D7)
- Out connected to Wemos D1 Mini (D8)
- Out connected to Wemos D1 Mini (D4)
- Out connected to Wemos D1 Mini (D3)
- + connected to Wemos D1 Mini (5V)
- - connected to Wemos D1 Mini (G)
2000mAh Battery
- VCC connected to TP4056 (B+)
- GND connected to TP4056 (B-)
TP4056
- OUT+ connected to Mtiny Power (VIN)
- OUT- connected to Mtiny Power (GND)
- B+ connected to 2000mAh Battery (VCC)
- B- connected to 2000mAh Battery (GND)
SIM800c GSM Module
- GND connected to Wemos D1 Mini (G)
- RXD connected to Wemos D1 Mini (RX)
- TXD connected to Wemos D1 Mini (TX)
- VCC(3.7 - 4.2) connected to Mtiny Power (3V3)
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[