Budujemy zegarek z budzikiem i pomiarem temperatury z pomocą Arduino

Wstęp

W tym artykule dowiemy się jak zbudować z pomocą płytki Arduino cyfrowy zegarek, który będzie spełniał następujące założenia:

  • odmierzanie czasu po odłączeniu zasilania (zegar RTC z baterią)
  • sygnał dźwiękowy co godzinę
  • wyświetlanie daty
  • funkcjonalność budzika
  • mierzenie temperatury otoczenia
  • różne ekrany do wyświetlania (data + czas + temperatura, duży zegar itp.)
  • zapisywanie ustawień w pamięci (w tym wypadku wolne miejsce w zegarze RTC)
  • możliwość ręcznego ustawienia zegarka
  • możliwość wybrania melodyjki alarmu / budzika
  • wyświetlacz alfanumeryczny
  • funkcjonalne menu do wyboru wszystkich ustawień

Wydaje się sporo, ale projekt taki jest idealną okazją do poćwiczenia platformy Arduino, czujników cyfrowych, optymalizacji oprogramowania, obsługi wyświetlaczy LCD.

Co będzie potrzebne?

Z powodu oszczędności czasu jak i poziomu nadmiernej kabelkologii zdecydowałem się w większości na gotowe moduły.

  • Arduino Uno – oryginał lub klon, ważne żeby miał wyjścia / wejścia w tych samym miejscu co oryginał, wraz kablem USB do wgrania software’u i ewentualnym zasilaczem.
  • LCD Keypad Shield – widziałem kilka odmian, większość jest niemalże identyczna, najpopularniejsza jest wersja od DFROBOT – do kupienia oficjalnie TUTAJ, ja używam chińskiego zamiennika znalezionego na Allegro (pod hasłem „lcd keypad”). Jest to bardzo fajny shield do Arduino posiadający dokładnie takie rzeczy, które są potrzebne do projektu – wyświetlacz 2×16 znaków, zestaw przycisków to nawigacji po menu, zajmuje niewiele we / wy  w Arduino i co najważniejsze udostępnia wolne piny na zewnątrz shielda
  • Obudowa – nie jest niezbędna, ale dzięki temu można zegarek postawić pionowo, chroni przed upadkami i służy jako miejsce zaczepu czujników. Jedyna rzecz, która nie pasowała w obudowie do mojej wersji shielda to dolna jej część (prostokątna wkładka), która nie pasowała ze względu na wystające elementy. Nie jest ona potrzebna, całość trzyma się bez problemu na pozostałych bokach. Obudowa dla Arduino z tym shieldem dostępna jest TUTAJ
  • Przyciski (tact switch) analogowe, stożkowe, sztuk 6. W swoim shieldzie podmieniłem wszystkie fabryczne przyciski na dłuższe odpowiedniki. Fabryczne są za krótkie żeby je wcisnąć palcem, przeszkadza obudowa. Ewentualnie 6 sztuk cienkich nasadek, które będą pasować (6×6 mm). Oczywiście do wymiany potrzebna będzie lutownica i spoiwo.
  • Moduł RTC z zasilaniem bateryjnym – będzie podtrzymywać godzinę nawet po odłączeniu od zasilania, a gdy podłączyć cały projekt pod zasilanie bateryjne, będzie służył nawet w wypadku braku prądu. Postanowiłem również użyć go jako miejsce przechowywania ustawień (jest trochę miejsca dostępnego w układzie na własne dane). Ja użyłem gotowego modułu z układem DS1307 , dostępnego TUTAJ
  • Zestaw kabelków połączeniowych, żeńsko – żeńskich (lub jakichkolwiek innych, można lutować bezpośrednio do pinów), 9 sztuk
  • Czujnik temperatury i wilgotności DHT22. Do połączenia go z Arduino będzie potrzebny dodatkowo jeden rezystor w przedziale 4.7K – 10KΩ
  • Buzzer – najzwyklejszy „brzęczyk” 2 pinowy

FAQ

Przed przystąpieniem do właściwego projektu parę odpowiedzi:

Czemu gotowe rozwiązania, a nie na przykład podłączanie LCD bezpośrednio do Arduino?

  • oszczędność czasu

Czemu kabelki są nie wierzchu i nie są polutowane do płytek?

  • ze względu na eksperymenty chciałem mieć możliwość szybkiego demontażu obudowy, wyjęcia ich w razie potrzeby, podmiany

Krok 1. LCD.

Wsadzamy shielda do Arduino i testujemy czy wyświetlacz oraz przyciski działają bez problemu. Po wsadzeniu shielda, wgrywamy prosty program żeby się upewnić czy droga wolna:

lcd_keypad_test

Jeżeli wszystkie przyciski oraz wyświetlacz działają prawidłowo, możemy wstępnie zamontować obudowę (nie dokręcając wszystkie do końca. Można również dostosować kontrast wyświetlacza do naszych wymagań. Służy do tego potencjometr w lewym górnym rogu płytki (płaski i cienki śrubokręt powinie sobie poradzić).

Krok 2. RTC.

Swój zegar czasu rzeczywistego podłączyłem według schematu:

Pin LCD Shield / ArduinoPin RTC
A5 (SCL)3 (SCL)
A4 (SDA)2 (SDA)
GND1 (GND)
5V5 (5V)

Po zamontowaniu układu, testujemy czy wszystko działa poprzez kod:

Do poprawnego działania modułu RTC potrzebna jest zewnętrzna biblioteka opisana w kroku 5.

Uruchamiamy szeregowy monitor i powinniśmy zobaczyć:

rtc_arduino_studio

Przykładowe zamontowanie:

dht22_montaz

Z całą pewnością można to zrobić lepiej, czujnik DHT22 jest przyczepiony za pomocą śróbki do wycietego otwóru na dolną część obudowy.

Krok 3. Temperatura.

Moduł DHT22 podłączamy jak na schemacie:

Pin Shield / ArduinoPin DHT22
5V (którykolwiek pin w górnym rzędzie, w prawej dolnej części shielda)1 (VCC)
D2 (górny rząd pinów na shieldzie, 5 od prawej)2 (Data)
GND (którykolwiek pin w środkowym rzędzie, w prawej dolnej części shielda)4 (GND)

UWAGA: Pomiędzy pinem zasilającym i pinem od przesyłu danych należy zamontować rezystor z przedziału 4.7K – 10KΩ

Testujemy kodem:

Do poprawnego działania czujnika potrzebna jest zewnętrzna biblioteka opisana w kroku 5.

Jeżeli wszystko podłączyliśmy dobrze to w monitorze szeregowym w Arduino Studio powinniśmy otrzymać:

dht22_arduino_studio

Przykład montażu (zdjęcie od góry):

rtc_montaz

Krok 4. Buzzer.

Nóżkę oznaczoną minusem na buzzerze podłączamy do jakiegolwiek pinu GND na shieldzie (prawy dolny róg shielda – środkowy rząd), natomiast tą z plusem do pinu D13 (górny rząd pinów, 9 od prawej, przy przerwie między rzędami pinów)

Przy każdym włączeniu / resecie arduino, przy poprawnym podłączeniu, buzzer powinien wydać krótki dźwięk.

Krok 5. Właściwe oprogramowanie.

Kod przez wszystkie funkcjonalności jest dość długi, ale starałem się komentować wszystkie ważniejsze rzeczy. Nie będę przez to opisywać poszczególnych składowych, zapraszam do eksperymentowania. Do poprawnego działania skryptu potrzebne są biblioteki:

  • DHT-sensor-library (wrzucamy katalog „DHT” do „sketchfolder/libraries/” w miejscu gdzie Arduino Studio przechowuje dane lub bezpośrednio poprzez IDE – Sketch -> Include library -> Add .zip library)
  • RTClib (wrzucamy katalog „RTClib-master” do „sketchfolder/libraries/” w miejscu gdzie Arduino Studio przechowuje dane lub bezpośrednio poprzez IDE – Sketch -> Include library -> Add .zip library)

Biblioteki „LiquidCrystal” i „Wire” są dostępne domyślnie.

Starałem się zoptymalizować kod jak tylko się da (funkcja „F()” w outputach stringowych itp.), ale na Arduino UNO jest już dość blisko limitu 32 KB.

Główny szkic:

Dodatkowo w katalogu z powyższym szkicem należy utworzyć plik „bigfont.h” z zawartością:

Jak można się zorientować – są to definicje „dużych” cyfr do wyświetlania zegarka.

6. Prezentacja

clock_final_front

Zegarek w akcji:

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *