Przepis na Word Clock po polsku

Biuro mojej poprzedniej firmy znajdowało się w Hamburgu. Od czasu do czasu wpadałem tam w delegację. Ponieważ siedziba mieściła się w dość ekskluzywnej dzielnicy HafenCity po drodze do biura mijałem różne galerie i sklepy. W jednym na witrynie postawiony był taki zegar. Od razu zwrócił moją uwagę (tym bardziej że wcześniej czytałem o tym na HackerNews). Pomyślałem a może by tak zrobić coś takiego w wersji polskiej. W tym wpisie przedstawię przepis na Word Clock po Polsku.

Idea

Pomysł który stoi za world clockiem jest dość prosty (i chroniony patentem DE202009017703U1): zamiast używać cyfr albo wskazówek jak na zwykłym zegarku analogowym czy cyfrowym używamy słów. Na przykład zamiast 10:45 pokażemy 

  • za kwadrans jedenasta
  • za piętnaście jedenasta
  • czterdzieści pięć po dziesiątej
  • trzy kwadranse po dziesiątej

Oczywiście można użyć zwykłego ekranu ale w word clock aby wyświetlić tekst podświetlany litery na cyferblacie aby tworzyły odpowiedni napis.

Co prawda na oficjalnej stronie qlock2 nie ma nic o polskiej wersji to w internecie można taką znaleźć. Tak jak niemiecki oryginał nie jest tania i niestety nie wygląda najlepiej. Niektóre litery są sklejone a słowa przeniesione aby zmieścić się w ramce 10 na 10. 

Składniki

List zakupów na Aliexpress

  • ESP8236 (NodeMCU)
  • Led Matrix 16×16 (adresowalne diody)
  • Plansza z literami
  • Plansza z otworami na diody
  • Kalka krawiecka
  • Kable dupont
  • Kabel USB
  • Fotorezystor
  • Moduł zegara (DS3102)
  • Podstawka pod telefon
  • Taśma klejąca montażowa
  • Wtyczki żeńskie dupont
  • Dystanse nylonowe
  • Wiertło do drewna 3.1mm
  • Klej do drewna

Cyferblat

Budowa cyferblatu jest niezwykle prosta. Składa się z dwóch kawałków sklejki połączonych klejem do drewna, pomiędzy którymi jest kalka krawiecka. W moim projekcie obie sklejki mają 5mm jednak w praktyce okazało się, że warstwa z literami powinna być możliwie najcieńsza inaczej dopadnie nas efekt paralaksy i pod kątem godzina będzie nieczytelna. 

Druga sklejka z otworami na diody może mieć w zasadzie dowolną grubość jednak należy pamiętać że obie muszą się zmieścić na podstawce dlatego zalecam 5-7mm dla diod (możliwe że wycięcie grubszej będzie dużo droższe) i 1-3mm dla literek. 

Kalka służy jako rozpraszacz do światła. Bez niej literki będą podświetlone nierównomiernie.

Wycięcie w sklejce jest ogólnie dostępną usługą i kosztuje około 60 PLN za komplet czyli dwie plansze jedna z literami a druga z kółkami. Do wycięcia potrzeby jest plik wektorowy najczęściej DXF. 

Pierwszy projekt cyferblatu zrobiłem w arkuszu kalkulacyjnym bo bardzo łatwo można tam edytować tekst oraz ustawić wybrany font i rozmiar tekstu i komórki. Ponieważ korzystałem z gotowej matrycy led to literki mogą mieć maksymalnie 1x1cm. Warto zaznaczyć, że nie każdy font nadaje się do wycinania. W tym przypadku wybór padł na Cyrulik Stencil głównie dlatego, że jesto to chyba jedyny dostępny font w wersji do wycięcia z polskimi znakami.

Podstawka

Na podstawce stawiamy nasz cyferblat z przymocowaną macierzą LED. Aby mikrokontroler się nie poruszał warto nawiercić 4 otwory montażowe i umieścić w nich dystanse nylonowe do których go przykręcimy. Dystanse mają w sobie gwint więc można budować prawdziwe wieże i to też wykorzystamy mocujące moduł zegara nad mikrokontrolerem. Oczywiście jeśli mamy wystarczająco dużo miejsca możemy zamontować go obok albo jeśli nasz cyferblat ma wystarczająco grube ramki to możemy też zamontować oba elementy na nim.

Wersja alfa

https://github.com/janisz/word-clock/blob/alfa/hello-world.ino

W podstawowej wersji wyświetlimy tylko godzinę. Do tego celu należy podłączyć ESP i macierz led do zasilania oraz podłączyć jedno z cyfrowych wyjść ESP do ledów. Tak jak na schemacie poniżej. Warto zaznaczyć że piny w NodeMCU są inaczej podpisane niż widzimy je z poziomu kodu dlatego warto sprawdzić jak się mają podłączenia do rzeczywistości

https://github.com/FastLED/FastLED/wiki/ESP8266-notes#pin-definitions
https://github.com/FastLED/FastLED/wiki/ESP8266-notes#pin-definitions
#define FASTLED_ESP8266_RAW_PIN_ORDER
#define FASTLED_ALLOW_INTERRUPTS 0
#include <FastLED.h>

Kolejnym etapem jest zaprogramowanie mikrokontrolera. Ponieważ ESP ma wbudowane WIFI najprostszym sposobem na ustawienie czasu będzie skorzystanie z NTP, konwersja do naszej strefy czasowej i wyświetlenie wyniku. 

Arduino IDE

Pomimo, że nie korzystamy z arduino to jego IDE również potrafi współpracować z ESP. Po uruchomieniu potrzebujemy kilku bibliotek. Więc zainstalujmy je korzystając z Tools →Manage Libraries

HSV

Zainstalowane LEDy są kolorowe, warto zrobić z tego użytek. Jednak skala RGB nie jest najłatwiejsza jeśli chodzi o płynne przejścia kolorów. Na szczęście jest inna droga mianowicie HSV (Hue, Saturation, Value czyli odcień, nasycenie, jasność). HSV jest cylindrycznym/stożkowym modelem koloru (dla przypomnienia RGB jest kubiczny) dlatego względnie łatwo zrobić łagodne przejścia kolorów gdyż wystarczy zmieniać wartość H pozostawiając S oraz V niezmienne.

Fotorezystor

Mamy już działający zegar. Jednak przez cały czas świeci ze stałą mocą a to oznacza, że w jasnym pokoju prawdopodobnie będzie zbyt ciemny, a w mroku zbyt jasny. Rozwiązaniem tego problemu jest skorzystanie z fotorezystora. Jest to mały komponent, który dysponując wyjściem analogowym potrafi powiedzieć nam jak jasno jest. Oczywiście najtańsze wersje nie mają żadnych opcji konfiguracji i po prostu otrzymujemy wynik od 0 do 1024 to na nasze potrzeby jest to wystarczające. Fotorezystor podłączamy do zasilania i do analogowego wejścia. Ponieważ i tak już korzystamy z modelu HSV więc wystarczy jasność pomieszczenia zamienić na jasność diod (V) i gotowe.

int getBrightness() {
  int b = (1024 - analogRead(A0)) / 4;
  b += 10;
  if (b > 256) {
    b = 255;
  }
  return b;
}

Tak działający kod ma jedną wadę. Fotorezystor może się wzbudzać światłem zegara (np odbitym od szafki czy ściany) i zacząć cyklicznie zmieniać jasność. Aby tego uniknąć warto zamiast pojedynczego odczytu skorzystać ze średniej z kilku poprzednich pomiarów. Uchroni nas to przed miganiem a dodatkowo doda efekt powolnego ściemniania/rozjaśniania zegara.

const int brightnessLen = 10;
int brightnessIndex = 0;
int brightnessValues[brightnessLen];

int getBrightness() {
  brightnessValues[brightnessIndex] = analogRead(A0);
  brightnessIndex = (brightnessIndex + 1) % brightnessLen;
  int avg = 0;
  for (int i = 0; i < brightnessLen; i++) {
    avg += brightnessValues[i];
  }
  avg /= brightnessLen;
  int b = (1024 - avg) / 4;
  b += 10;
  if (b > 256) {
    b = 255;
  }
  return b;
}

Moduł zegara

Nie oszukujmy się, w obecnych czasach podłączanie jakiegokolwiek urządzenia na stałe do Internetu to proszenie się o kłopoty. Po pierwsze co gdy tej sieci zabraknie, a po drugie jak wykrywamy czy nasz zegar właśnie nie atakuje jakiejś strony internetowej. Tutaj pojawia się moduł RTC (ang real time clock) którego zadaniem będzie odmierzanie czasu. Zegar ma wbudowaną baterię więc nawet w wyniku braku zasilania nie ma potrzeby ustawiania czasu. Do obsługi zegara potrzebujemy biblioteki https://github.com/Makuna/Rtc a podłączamy go jak na schemacie poniżej.

Teraz wystarczy tylko zamienić kod NTP na RTC i już gotowe.

Został jeszcze jeden element. Zegar trzeba ustawić. Do tego celu wykorzystamy hotspot z telefonu który udostępnia sieć dla zegara tak aby ten pobrał aktualny czas NTP i zapisał go w module RTC. Brzmi to skomplikowanie ale uważam że jest dużo prostsze w implementacji niż dodawanie przycisków.

https://github.com/janisz/word-clock/blob/main/word-clock.ino

Dalszy rozwój

Przedstawiony w tym wpisie zegar to prototyp i jak to w prototypie nie ustrzegł się kilku błędów (np. literówka w cyferblacie) i pola do poprawek. 

Fotorezystor

Po pierwsze fotorezystor został dodany za późno, kiedy cyferblat był już wycięty. W finalnej wersji dodałbym otwór na niego tak aby nie wystawał poza obudowy. Może warto by wybrać fotorezystor z regulacją a nie najtańszy na rynku tym bardziej, że różnice w cenie nie są olbrzymie.

DS1302

Wykorzystany moduł zegara jest najtańszy na rynku a co za tym idzie najmniej dokładny w skrajnych przypadkach może to być kilkadziesiąt minut na rok [sic!]. Z pewnością lepiej byłoby użyć zegara z korekcją a może nawet takiego z akumulatorem aby nie było konieczności wymiany baterii. 

Cyferblat

Cyferblat jest nieczytelny pod kątem. Optymalnym rozwiązaniem byłoby wycięcie go z blachy albo forniru czy laminatu aby uniknąć tego efektu. Ewentualnie, można pokusić się o zalanie literek żywicą epoksydową.

Dodatkowo sam zegar jest dość mały i odległości kilku metrów zupełnie nieczytelny. Docelowo powinien być dwa razy większy jednak to wymaga samodzielnego lutowania macierzy led co jest dość czasochłonne (16×16 diod – każda ma 3 wejścia i 3 wyjścia).

Płytka prototypowa

Zaczynając projekt nie byłem świadomy że dostępne są mikro płytki prototypowe. Rozwiązałoby to problem lutowania kabli zasilania i ułatwiło “cable management”.

Mikrokontroler

Z jednej strony ESP wydaje się idealne do tego projektu z drugiej może być zastąpione przez znacznie mniejsze i tańsze arduino. Jednak dzięki ESP można dodać interakcje z siecią np. w celu poinformowania innych domowników o spotkaniu online zmienić kolor gdy na komputerze jest włączona kamera. Jeśli dodać buzzer to można wtedy nawet odegrać jakiś dźwięk. Pozostało jeszcze kilka pinów wolnych co pozwala na dodanie kolejnych czujników i wyświetlania informacji o temperaturze. Być może wymagałoby to zmiany cyferblatu tak aby godzina była podawana poziomo a inne dane pionowo. 

DCF77

Konieczność ustawiania zegara po zaniku zasilania jest dość niefortunna. Skorzystanie z modułu RTC o niskiej dokładności może prowadzić do błędnych wskazań godziny. Z jednej strony można by na stałe podpiąć zegar do sieci tylko po co skoro można skorzystać z Zegara Frankfurckiego. Jest to sygnał nadawany z laboratorium czasu z Niemiec który pokrywa zasięgiem 2000km wokół Frankfurtu. Dzięki temu zegar mógłby synchronizować się raz na jakiś czas niwelując niedokładności RTC. Droższą alternatywą jest skorzystanie z czasu nadawanego przez satelity GPS.

Buzzer

W niektórych zegarkach elektronicznych co godzinę było słychać cichutkie “pik pik”. Moduł brzęczka jest bardzo prosty do podłączenia i łatwy do sterowania. 


Podsumowująć powyższy projekt jest świetyn wstępem do elektroniki z ESP. Można się wiele nauczyć w dość krótkim czasie a przy tym nie bać się o lutowanie komponentów bo ten krok można pominąć korzystając z płytki prototypowej. 


Leave a Reply