Community project

ESP8266 Sensor Display

ESP32
Photo of ESP8266 Sensor Display
Generated with AI

schematik

Published September 23, 2026

This project builds a connected display that shows the current time and weather information on a small OLED screen. The ESP8266 microcontroller fetches weather data from the internet and updates the display every few minutes, cycling between temperature and weather condition pages.

The guide includes a complete parts list, wiring diagram for connecting the OLED display to the microcontroller, and step-by-step assembly instructions. Builders will also receive the full Arduino firmware with WiFi configuration, weather API integration, and display rendering code ready to upload.

Wiring diagram

Assemble it in 3 steps

1. Leg de klokprint klaar

Leg de ESP-12F-print met het vaste OLED-scherm op een niet-geleidende ondergrond, bijvoorbeeld hout of karton. Raak de onderkant niet op metaal aan; daardoor kunnen aansluitingen elkaar per ongeluk raken.

  • Het kleine scherm hoort direct bij deze print; er zijn geen extra draadjes nodig voor de klok.
  • Sluit nog geen losse 5V- of 3,3V-voeding op willekeurige pinnen aan — een verkeerde aansluiting kan de print beschadigen.

2. Sluit de USB-kabel aan

Steek een gegevens-USB-kabel in de USB-aansluiting van de print en daarna in je computer. De USB-kabel geeft stroom aan de klok en wordt ook gebruikt om de software erop te zetten.

  • Gebruik een USB-kabel waarmee je normaal ook bestanden kunt overzetten; sommige dunne laadkabels geven alleen stroom.
  • Forceer de USB-stekker niet; als hij niet soepel past, draai je hem om.

3. Stel het wifi-netwerk van de klok in

Na het plaatsen van de software maakt de klok tijdelijk een wifi-netwerk met de naam Gorinchem-Klok-Setup. Verbind met dat netwerk met wachtwoord klokinstellen en volg de geopende instelpagina om je eigen wifi te kiezen. Daarna haalt de klok vanzelf tijd en weer voor Gorinchem op.

  • Na het instellen bewaart de print de wifi-gegevens en verbindt hij bij volgende keren vanzelf.
  • De onderste regel wisselt ongeveer elke zes seconden tussen de temperatuur en de weersbeschrijving.
  • De klok heeft wifi met internet nodig om de tijd en het weer bij te werken; zonder verbinding blijft het scherm wel aan, maar worden tijd en weer niet vernieuwd.

Deploy the firmware

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiManager.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <U8g2lib.h>
#include <time.h>


// Forward declarations
void fetchWeather();
void drawClockAndWeather();

constexpr uint8_t OLED_SDA_PIN = 14;
constexpr uint8_t OLED_SCL_PIN = 12;
constexpr unsigned long WEATHER_INTERVAL_MS = 15UL * 60UL * 1000UL;
constexpr unsigned long PAGE_INTERVAL_MS = 6000UL;

U8G2_SSD1306_128X64_NONAME_F_HW_I2C display(U8G2_R0, U8X8_PIN_NONE);

String temperatureText = "weer laden...";
String weatherText = "verbinden met wifi";
unsigned long lastWeatherFetch = 0;
unsigned long lastPageChange = 0;
bool showTemperaturePage = true;

const char *weatherDescription(int code) {
  switch (code) {
    case 0: return "helder";
    case 1: case 2: return "licht bewolkt";
    case 3: return "bewolkt";
    case 45: case 48: return "mist";
    case 51: case 53: case 55: return "motregen";
    case 56: case 57: return "ijzel";
    case 61: case 63: case 65: return "regen";
    case 66: case 67: return "ijzelregen";
    case 71: case 73: case 75: case 77: return "sneeuw";
    case 80: case 81: case 82: return "buien";
    case 85: case 86: return "sneeuwbuien";
    case 95: return "onweer";
    case 96: case 99: return "onweer met hagel";
    default: return "onbekend weer";
  }
}

void fetchWeather() {
  if (WiFi.status() != WL_CONNECTED) {
    weatherText = "geen wifi";
    return;
  }

  WiFiClient client;
  HTTPClient http;
  const char *url = "http://api.open-meteo.com/v1/forecast?latitude=51.8365&longitude=4.9740&current_weather=true&timezone=Europe%2FAmsterdam";
  if (!http.begin(client, url)) {
    weatherText = "weer niet bereikbaar";
    return;
  }

  int status = http.GET();
  if (status == HTTP_CODE_OK) {
    JsonDocument document;
    DeserializationError error = deserializeJson(document, http.getStream());
    if (!error) {
      float temperature = document["current_weather"]["temperature"] | NAN;
      int code = document["current_weather"]["weathercode"] | -1;
      if (!isnan(temperature) && code >= 0) {
        temperatureText = String(temperature, 1) + " C in Gorinchem";
        weatherText = weatherDescription(code);
        lastWeatherFetch = millis();
      } else {
        weatherText = "weerdata ontbreekt";
      }
    } else {
      weatherText = "weerdata fout";
    }
  } else {
    weatherText = "weer niet bereikbaar";
  }
  http.end();
}

void drawClockAndWeather() {
  struct tm timeInfo;
  bool clockReady = getLocalTime(&timeInfo, 10);

  char timeBuffer[6] = "--:--";
  char dateBuffer[18] = "tijd instellen";
  if (clockReady) {
    strftime(timeBuffer, sizeof(timeBuffer), "%H:%M", &timeInfo);
    strftime(dateBuffer, sizeof(dateBuffer), "%a %d-%m-%Y", &timeInfo);
  }

  display.clearBuffer();
  display.setFont(u8g2_font_logisoso24_tf);
  display.drawStr(1, 25, timeBuffer);
  display.setFont(u8g2_font_6x10_tf);
  display.drawStr(2, 37, dateBuffer);
  display.drawHLine(0, 40, 128);
  display.setFont(u8g2_font_7x14_tf);

  String line = showTemperaturePage ? temperatureText : weatherText;
  int width = display.getStrWidth(line.c_str());
  if (width <= 126) {
    display.drawStr((128 - width) / 2, 58, line.c_str());
  } else {
    display.setFont(u8g2_font_6x10_tf);
    display.drawStr(1, 56, line.substring(0, 20).c_str());
  }
  display.sendBuffer();
}

void setup() {
  Wire.begin(OLED_SDA_PIN, OLED_SCL_PIN);
  display.begin();
  display.setContrast(180);
  display.clearBuffer();
  display.setFont(u8g2_font_6x10_tf);
  display.drawStr(0, 18, "Gorinchem klok");
  display.drawStr(0, 34, "wifi instellen...");
  display.sendBuffer();

  WiFiManager wifiManager;
  wifiManager.setConfigPortalTimeout(180);
  bool connected = wifiManager.autoConnect("Gorinchem-Klok-Setup", "klokinstellen");
  if (!connected) {
    ESP.restart();
  }

  configTime("CET-1CEST,M3.5.0/2,M10.5.0/3", "nl.pool.ntp.org", "pool.ntp.org");
  fetchWeather();
  lastPageChange = millis();
}

void loop() {
  unsigned long now = millis();
  if (now - lastWeatherFetch >= WEATHER_INTERVAL_MS) {
    fetchWeather();
  }
  if (now - lastPageChange >= PAGE_INTERVAL_MS) {
    showTemperaturePage = !showTemperaturePage;
    lastPageChange = now;
  }
  drawClockAndWeather();
  delay(250);
}

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik