DIY: Chytré hodiny & budík (WeMos D1 mini + DS3231 + OLED) se „svítáním“ na WS2812 a tlačítkem Snooze

Postavíme si univerzální hodiny/budík s přesným časem (RTC DS3231 + volitelná NTP synchronizace), OLED displejem 0,96″ pro přehledné zobrazení a piezo bzučákem pro alarm. Navíc přidáme volitelný „sunrise“ efekt pomocí WS2812 LED kruhu, který se před budíkem postupně rozsvěcí teplými odstíny. Vše beží na 5 V z USB, žádná síťová 230 V část – ideální pro začátečníky.

Co budete potřebovat (materiál)

Jak to funguje

RTC modul DS3231 drží přesný čas i bez Wi-Fi (má krystal a baterii). WeMos D1 mini může volitelně čas pravidelně synchronizovat z internetu (NTP), aby byl RTC vždy přesný. OLED přes I2C zobrazuje čas (HH:MM), datum, případně den v týdnu. Piezo bzučák slouží k alarmu a WS2812 LED kruh umí 15–30 min před alarmem simulovat svítání – plynulé rozednívání teplou barvou.

Schéma zapojení (blokově)

  • I2C sběrnice (SDA/SCL): DS3231 + OLED → na D1 mini: SDA = D2, SCL = D1
  • Piezo 5 V: +5 V a GND; signál (PWM) z pinu D5 (doporučení), případně přes tranzistor pro vyšší hlasitost
  • WS2812 kruh: DIN na pin D4 (GPIO2), napájení +5 V a GND (sdílená zem s D1 mini)
  • Tlačítko: Jeden kontakt na pin D3 (GPIO0) s interním PULLUP, druhý na GND (stisk = 0)

Software – dvě cesty

Varianta A) ESPHome (bez psaní kódu)

Nejsnazší pro začátečníky. Konfiguraci uložíte do YAML a nahrajete přes ESPHome:

esphome:
  name: chytre-hodiny
esp8266:
  board: d1_mini

wifi:
  ssid: "NAZEV_WIFI"
  password: "TAJNE_HESLO"

logger:
ota:
web_server:

i2c:
  sda: D2
  scl: D1
  scan: true

time:
  - platform: sntp
    id: ntp_time
    timezone: Europe/Prague
    on_time:
      # v 7:00 spuštění alarmu (ukázka)
      - seconds: 0
        minutes: 0
        hours: 7
        then:
          - script.execute: alarm_start

sensor:
  - platform: ds3231
    update_interval: 60s
    temperature:
      name: "RTC teplota"
    time_id: rtc_time

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    address: 0x3C
    lambda: |-
      it.printf(0, 0, id(font1), " %02d:%02d", id(ntp_time).now().hour, id(ntp_time).now().minute);

font:
  - file: "fonts/Roboto-Regular.ttf"
    id: font1
    size: 20

script:
  - id: alarm_start
    then:
      - light.turn_on: svitani
      - delay: 15min
      - output.turn_on: bzuco

output:
  - platform: gpio
    pin: D5
    id: bzuco

light:
  - platform: neopixelbus
    type: GRB
    variant: WS2812
    pin: D4
    num_leds: 16
    name: "Svítání"
    id: svitani

Pozn.: DS3231 v ESPHome může sloužit jako „časový zdroj“ při výpadku internetu; běžně ale stačí SNTP. Pro „svítání“ nastavte automatizaci s postupným zvyšováním jasu (transition) 10–30 min před alarmem.

Varianta B) Arduino IDE (s krátkými ukázkami)

Tahle varianta dává plnou kontrolu. Potřebné knihovny: RTClib (DS3231), U8g2 nebo Adafruit_SSD1306 (OLED), Adafruit NeoPixel (WS2812), NTPClient (SNTP), a ESP8266 core knihovny.

Inicializace (zjednodušený výtah)

#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_NeoPixel.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
// OLED: použij U8g2/Adafruit_SSD1306 dle displeje

RTC_DS3231 rtc;
Adafruit_NeoPixel ring(16, D4, NEO_GRB + NEO_KHZ800);
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 3600, 60*60*12); // CET, sync 12h

void setup() {
  Wire.begin(D2, D1);          // I2C na D1 mini
  rtc.begin();                 // DS3231
  ring.begin(); ring.show();   // WS2812 inicializace
  pinMode(D5, OUTPUT);         // piezo (PWM pin doporučen)
  pinMode(D3, INPUT_PULLUP);   // tlačítko (SNOOZE)

  WiFi.begin("NAZEV_WIFI", "TAJNE_HESLO");
  // počkat na připojení, poté timeClient.begin(); timeClient.update();
  // pokud je rozdíl > X s, zapiš NTP čas do RTC (rtc.adjust(DateTime(...)))
}

Zobrazení času na OLED (přibližně)

// Pseudokód: každých 250 ms obnov displej
DateTime now = rtc.now();
char buf[6]; snprintf(buf, sizeof(buf), "%02d:%02d", now.hour(), now.minute());
// u8g2/ssd1306: vypsat buf velkým fontem na střed

Budík + „svítání“

int alarmHour = 7, alarmMin = 0;
unsigned long sunriseStartMs = 15UL * 60UL * 1000UL; // 15 min

void sunriseProgress(unsigned long elapsed) {
  float p = min(1.0f, elapsed / (float)sunriseStartMs);
  // teplá barva: pozvolna 0→255
  uint8_t r = (uint8_t)(255 * p), g = (uint8_t)(120 * p), b = (uint8_t)(20 * p);
  for (int i=0;i<ring.numPixels();i++){ ring.setPixelColor(i, ring.Color(r,g,b)); }
  ring.show();
}

void loop() {
  DateTime now = rtc.now();
  static bool sunrise = false;
  static unsigned long sunriseStart = 0;

  // 15 minut před alarmem začni svítání
  if (!sunrise && now.hour()==alarmHour && now.minute()==(alarmMin-15+60)%60) {
    sunrise = true; sunriseStart = millis();
  }
  if (sunrise) {
    unsigned long elapsed = millis() - sunriseStart;
    sunriseProgress(elapsed);
    if (elapsed >= sunriseStartMs) sunrise = false; // hotovo, čekáme na alarm
  }

  // Alarm
  if (now.hour()==alarmHour && now.minute()==alarmMin && now.second()<5) {
    tone(D5, 1800, 800); // pípni každou sekundu
  }

  // Snooze (tlačítko D3)
  if (digitalRead(D3)==LOW) {
    // odlož o 5 min
    alarmMin = (alarmMin + 5) % 60;
    delay(300); // debounce
  }
}

Pozn.: Pro hlasitější zvuk dej piezo přes tranzistor a samostatný PWM pin; pro plynulejší „svítání“ můžeš přidat gamma korekci nebo více kroků barev.

Postup krok za krokem

  1. Hardware: propojte I2C (D2/D1) k DS3231 a OLED; WS2812 DIN na D4; piezo na D5; tlačítko D3↔GND (PULLUP).
  2. ESPHome / Arduino:
    • ESPHome: vytvoř YAML, nainstaluj prvně přes USB, pak OTA. Nastav čas, font a automace.
    • Arduino: nainstaluj knihovny, doplň Wi-Fi, NTP sync → zapiš do RTC, OLED výpis, alarm logiku.
  3. Kalibrace času: Po prvním NTP syncu ulož přesný čas do RTC, ať běží i offline bez driftu.
  4. Test budíku: nastav budík na nejbližších pár minut, ověř „svítání“, pípání, Snooze tlačítko.
  5. Doladění: uprav hlasitost piezo (duty), délku svítání (10–30 min), jas WS2812 (max 30–50 % pro noční použití).

Tipy a řešení potíží

  • OLED nic nezobrazuje: zkontroluj I2C adresu (0x3C), SDA/SCL (D2/D1) a knihovnu (U8g2/SSD1306).
  • RTC hlásí špatný čas: jednorázově synchronizuj NTP a ulož do RTC (Arduino: rtc.adjust), zkontroluj knoflíkovou baterii DS3231.
  • WS2812 bliká náhodně: sdílej GND s D1 mini, používej datový pin s 3V3 logikou a krátký vodič; omez jas.
  • Tlačítko „kmitá“: přidej softwarový debounce (200–300 ms), případně RC filtr.

Bezpečnost

Celé řešení je slaboproudé (5 V). Nepřipojujte nic na 230 V. Pokud bys později přidával relé pro lampu, silovou část musí provést kvalifikovaný elektrikář.

Rychlé odkazy na součástky


Výsledek: kompaktní chytré hodiny/budík s krásným displejem, přesným časem a příjemným „svítáním“. Snadno rozšíříš o další funkce (více alarmů, Wi-Fi nastavení přes captive portal, zobrazení předpovědi počasí apod.).

Související produkty

Tento web slouží k prezentaci a propagaci produktů našich partnerů a nelze zde objednávat.
Kliknutím na vybrat velikost přejdete do e-shopu prodejce, kde si můžete výrobky objednat. - Podmínky užití webu

REKLAMA

Pneuservis a opravy pneu Praha Nehvizdy