We sell the kit HERE, or you can use your own parts...
Parts:
If you have an 128x64 OLED display the same code is already setup to display information.
3D Model for the enclosure can be downloaded HERE.
Arduino Code:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // No reset pin
#define SCREEN_ADDRESS 0x3C // I2C address for the display
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define DHTPIN D4 // Pin where the DHT11 is connected
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// Network credentials. Add the EXACT name for your network SSID and the EXACT password...
const char* ssid = "********";
const char* password = "********";
ESP8266WebServer server(80); // Create a webserver object that listens for HTTP requests on port 80
const float tempOffset = 0.0; // Offset in degrees Celsius for calibration
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password); // Connect to your Wi-Fi network
while (WiFi.status() != WL_CONNECTED) { // Wait until connected
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
dht.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println("SSD1306 allocation failed. Continuing without display.");
} else {
display.clearDisplay();
}
server.on("/", handleRoot); // Call handleRoot when we access the web server's root URL
server.begin(); // Actually start the server
Serial.println("HTTP server started.");
}
void loop() {
server.handleClient(); // Handle client requests
displaySensorData();
delay(2000); // Wait a bit before reading the sensors again
}
int calculateSignalQuality() {
int rssi = WiFi.RSSI();
return rssi == 31 ? 0 : map(rssi, -100, -50, 0, 100);
}
void displaySensorData() {
int h = dht.readHumidity();
float tC = dht.readTemperature() + tempOffset; // Apply offset to Celsius reading
float tF = tC * 9.0 / 5.0 + 32.0; // Convert adjusted Celsius to Fahrenheit
if (isnan(h) || isnan(tC) || isnan(tF)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
String quality = getSignalQuality(WiFi.RSSI());
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Temp: " + String(tF) + " F/" + String(tC) + " C");
display.println("");
display.println("Humidity: " + String(h) + "%");
display.println("");
display.println("Connection: " + quality);
display.println("");
display.println("IP address: ");
display.println(WiFi.localIP());
display.display();
Serial.print("Humidity: ");
Serial.print(h);
Serial.print("% Temperature: ");
Serial.print(tF);
Serial.print(" F / ");
Serial.print(tC);
Serial.println(" C");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("");
}
String getSignalQuality(long rssi) {
if (rssi > -50) return "Excellent";
else if (rssi > -60) return "Good";
else if (rssi > -70) return "Poor";
else return "Disconnected";
}
void handleRoot() {
int h = dht.readHumidity();
float tC = dht.readTemperature() + tempOffset; // Apply offset to Celsius reading
float tF = tC * 9.0 / 5.0 + 32.0; // Convert adjusted Celsius to Fahrenheit
String quality = getSignalQuality(WiFi.RSSI());
String webpage = "<!DOCTYPE html><html><head><title>ESP8266 Weather Station</title><meta http-equiv='refresh' content='2'><meta charset='UTF-8'><style>body { display: flex; justify-content: center; align-items: flex-start; height: 100vh; padding-top: 20px; margin: 0; font-family: Arial, sans-serif; background-color: #f0f0f0; } .info { width: 80%; min-width: 300px; background-color: #2196F3; color: white; border-radius: 10px; padding: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); text-align: center; font-size: 36px; }</style><script>var lastUpdate = new Date().getTime();function updateContent(temp, humidity, quality) { document.getElementById('data-content').innerHTML = '<p>Temperature: ' + temp + ' °F / ' + ((temp-32)*5/9).toFixed(2) + ' °C</p><p>Humidity: ' + humidity + '%</p><p>Connection: ' + quality + '</p>'; lastUpdate = new Date().getTime(); } function checkSensor() { var currentTime = new Date().getTime(); if (currentTime - lastUpdate > 6000) { document.getElementById('data-content').innerHTML = '<p>Connection: Disconnected</p>'; } else { document.getElementById('data-content').parentNode.className = 'info'; } } setInterval(checkSensor, 2000); window.onload = checkSensor;</script></head><body><div class='info'><h1>Weather Station</h1><div id='data-content'><p>Temperature: " + String(tF) + " °F / " + String(tC) + " °C</p><p>Humidity: " + String(h) + "%</p><p>Connection: " + quality + "</p></div></div></body></html>";
server.send(200, "text/html", webpage);
}