Termometr tęczowy

Termometr tęczowy

Prezentowana konstrukcja to termometr, którego skala jest wykonana z 32 diod LED RGB. Termometr pozwala na ustawienie zakresu temperatur reprezentowanego przez diody. Całość konstrukcji dopełnia niewielki wyświetlacz OLED.

Podstawowe parametry:
  • 32 punktowa linijka LED WS2812 służąca do wskazywania temperatury,
  • odczyt temperatury z maksymalnie 5 czujników DS18B20 dołączonych do wspólnej magistrali,
  • ustawianie wartości temperatury reprezentowanej przez początek i koniec skali,
  • zasilanie 5 V co najmniej 1 A.

Urządzenie wyróżnia się nietypowym wyglądem. Wskazywanie temperatury na pasku wielobarwnych diod LED jest czytelne nawet z dużej odległości, a dodatkowo może być ciekawą ozdobą pomieszczenia. Nieskomplikowana konstrukcja pozwala na wykonanie termometru przez każdego kto ma możliwość lutowania elementów SMD, co w dzisiejszych czasach jest konieczne, ponieważ wiele elementów nie jest dostępnych w obudowach THT.

Budowa i działanie

Schemat termometru pokazano na rysunku 1. Urządzenie nie posiada zasilacza, tę rolę pełni dowolna ładowarka z wtykiem mini USB. Należy tylko zwrócić uwagę, aby jej wydajność prądowa była nie mniejsza niż 1 A. Optymalnym wyborem będzie ładowarka o wydajności 2 A ponieważ właśnie taki prąd mogą pobrać diody przy maksymalnej jasności świecenia kolorem białym. Napięcie 3,3 V służące do zasilania mikrokontrolera, wyświetlacza OLED i termometrów jest stabilizowane przez U3.

Rysunek 1. Schemat termometru

Pracą urządzenia steruje mikrokontroler STM32F072RBT6. Ma on cenną właściwość negowania sygnałów TX i RX interfejsu UART. Jest to istotna cecha dla tego projektu, ponieważ do transmisji danych do LED WS2812 wykorzystano właśnie interfejs UART, który w tym nietypowym zastosowaniu wymaga zanegowania wyjścia. Wydaje się, że UART nie może bezpośrednio wysterować WS2812. Gwarantowany poziom „H” dla WS2812 wynosi 0,7 Vdd co przy 5 V daje 3,5 V. Mikrokontrolerowi zasilanemu z 3,3 V brakuje 200 mV. Można by zasilić mikrokontroler napięciem 3,6 V ale takie stabilizatory nie są łato dostępne. Ponadto, przy zasilaniu 5,2 V (takie napięcie może dostarczyć ładowarka bo jest zgodne ze specyfikacją USB) poziom „H” będzie interpretowany przy 3,62 V. Jednak dzięki budowie peryferiów STM32F072 można bez dodatkowych układów sterować WS2812. Wyjście UART mikrokontrolera może pracować jako OD(OC) – otwarty dren (otwarty kolektor), w każdym możliwym trybie, nie tylko half-duplex jak w innych mikrokontrolerach. Ponadto, praktycznie wszystkie linie GPIO, w tym UART, akceptują napięcia 5 V. W innych mikrokontrolerach możemy nie znaleźć takich rozwiązań. Ustawiając wyjście TX w tryb OD (rysunek 2) oraz podciągając je rezystorem 1,5 kΩ do 5 V powodujemy, że poziom „H” ma wartość 5 V.

Rysunek 2. Konfiguracja wyjścia interfejsu UART

Ze względu na to, że połączenie pomiędzy sterownikiem a taśmą LED może mieć znaczną długość, na płytce przewidziano miejsce na układ U4 typu 74HC(T)2G00DP. Może on pełnić rolę konwertera 3,3 V na 5 V ale tylko w wersji HCT, gdzie poziom „H” odpowiada napięciu 2,4 V lub wyższemu. Gdy zastosuje się układ serii HC, to występują takie same problemy jak w przypadku sterowania LED przez mikrokontroler.

Do komunikacji 1-Wire używany jest interfejs UART3 w trybie 1-Wire master-slave. Rezystor R8 wymusza stan wysoki w czasie bezczynności na magistrali. Układ U2 typu DS9503 zabezpiecza GPIO przed skutkami przepięć, które mogą pojawić się, gdy przewód łączący czujnik z mikrokontrolerem będzie długi. Bezpiecznik F1 zabezpiecza przed skutkami zwarcia na magistrali.

Magistrala I2C jest używana do komunikacji z opcjonalnym wyświetlaczem (nie jest on niezbędny do pracy termometru). Elementy R4, R5 podciągają linie SCL, SDA do zasilania. Nastawniki szesnastkowe SW1, SW2 pozwalają ustawić dolną i górą temperaturę reprezentowaną przez początek i koniec skali termometru. Potencjometr P2 umożliwia regulację jasności świecenia LED.

Program sterujący

Program termometru nie jest tak prosty, jakby się wydawało. Po resecie mikrokontrolera, w czasie gdy wyświetlany jest test wyświetlacza, skanowana jest magistrala 1-Wire komendą SEARCH_ROM=0xF) w celu wyszukania termometrów DS18B20. Ich cechą charakterystyczną jest ID=0x28. Adresy odczytane przez funkcję skanującą są zapamiętane w tablicy. Liczbę termometrów ograniczono do pięciu. Naturalnie skanowanie 1-Wire, nie trwa kilka sekund, czas testu został wydłużony.

W pętli głównej programu, co 800 ms, wysyłana jest komenda konwersji temperatury do wszystkich termometrów przyłączonych do magistrali (komendy SKIPROM=0xCC i CONVERTTEMP=0x44). Po 750 ms, komendą READ_SCRATCHPAD=0xBE odczytywane są dane z każdego termometru, łącznie z CRC (Większość programów dostępnych w internecie odczytuje tylko dwa pierwsze bajty). Dzięki kontroli CRC, eliminowane są błędy odczytu, a także sytuacja, gdzie zwarcie magistrali powoduje odczyt temperatury 0°C. Poza CRC testowana jest obecność sygnału PRESENCE oraz to, czy po czasie wymaganym specyfikacją, magistrala przyjmie poziom wysoki. Dzięki temu zwarcie na magistrali nie jest interpretowane jako odpowiedź układu slave. Takich prostych zabezpieczeń często są pozbawione programy dostępne w siecie i w głównej mierze dotyczą programów dla Arduino.

Odczytana temperatura jest wyświetlana na pasku LED. Aby wysyłać dane z częstotliwością 800 kHz interfejs UART musi pracować z prędkością 2,4 Mb/s 7N1 z włączoną inwersją na linii TX (rysunek 3).

Rysunek 3. Konfiguracja interfejsu UART dla sterowania diodami WS2812

Nietypowa prędkość wynika z tego, że bit wysyłany do LED jest podzielony na trzy odcinki czasowe, każdy o czasie około 400 ns. Pierwszy odcinek zawsze przyjmuje poziom wysoki, drugi przyjmuje wartość wysyłanego bitu, trzeci zawsze przyjmuje poziom niski. Transmisja 7N1 składa się z dziewięciu bitów, na które składa się:

  • jeden bit startu = 0,
  • siedem bitów danych,
  • jeden bit stopu = 1.

Można to zapisać tak:

0ddddddd1

Na niebiesko wyróżniono bit startu, pomarańczowo stopu. Po zanegowaniu, sekwencja wygląda jak poniżej:

1ddddddd0

Wysłanie trzech bitów zero:

100100100

Na żółto wyróżniono transmitowane bity. Wysłanie trzech bitów jeden:

110110110

Można więc zauważyć stałą sekwencję:

1x01x01x0

Wystarczy w miejsca „x” wstawić kolejno transmitowane bity.

Wysyłaniem danych przez UART, zajmuje się mechanizm DMA. Dzięki czemu, CPU traci tylko około 2% mocy obliczeniowej, kiedy to DMA zatrzymuje CPU w czasie gdy oba układy chcą skorzystać z tego samego obszaru pamięci RAM. Dla porównania AVRmega/tiny jest w stanie sterować LED przez UART w przerwaniach (nie ma DMA) co powoduje obciążenie CPU na poziomie 80...90%. Przewaga ARM jest druzgocąca. Pętla główna programu wykonuje się typowo w ok 300 ns. Aby uzmysłowić sobie jak to krótki czas, warto wiedzieć, że czas dostępu do pamięci RAM, w komputerach z lat 80..90 opartych o Z-80, 6502, wynosił 120...150 ns natomiast AVR taktowany 16 MHz może w tym czasie wykonać od 3 do 6 rozkazów.

W czasie gdy dane są wysyłane do LED przez DMA, może być obsługiwany wyświetlacz OLED. Informacje które, mają być na nim wyświetlone, są odwzorowane w buforze zlokalizowanym w pamięci RAM, po czym z użyciem kolejnego kanału DMA, wysyłane do wyświetlacza.

W pętli głównej są jeszcze odczytywane nastawniki szesnastkowe, i przetwornik ADC. 64 wyniki przetwarzania ADC są uśredniane, a po konwersji z 12-bit na 8-bit, sterują jasnością LED. Stan przycisku zmieniającego numer wyświetlanego termometru jest badany w przerwaniu co 1 ms, gdzie programowy filtr RC uśrednia wyniki likwidując skutki drżenia styków.

Po zakończeniu pętli głównej CPU jest usypiane. Co 1 ms timer systemowy budzi CPU, który wykonuje kolejny obieg pętli resetując przy okazji timer Watchdoga. Co około 25 obiegów (25 ms) pętli głównej transmitowane są dane do LED, a co 100 ms do OLED. Rzadziej, bo co 500 ms, zmieniany jest stan diody LED D1 „RUN”, sygnalizującej pracę pętli głównej, dlatego nie jest ona obsługiwana w procedurze obsługi przerwania systemowego 1 ms. W końcu, co 30 sekund, skanowana jest magistrala 1-Wire. Pozwala to reagować na dołączenie/odłączenie kolejnych termometrów.

Montaż i uruchomienie

Schemat płytki PCB pokazuje rysunek 4. Montaż jest typowy i nie wymaga omawiania. Na początek warto wlutować stabilizator i sprawdzić poprawność jego działania. Najczęściej nie ma potrzeby montowania U4, jest potrzebny tylko wtedy, gdy przewód łączący diody z termometrem jest długi przez co ma znaczną pojemność.

Rysunek 4. Schemat płytki PCB wraz z rozmieszczeniem elementów

Potencjometr P1 można zamontować na warstwie bottom płytki, dzięki czemu, po wywierceniu otworu w obudowie, łatwo będzie można regulować jasność świecenia LED.

Płytkę zaprojektowano tak aby można umieścić ją w obudowie HAMMOND HM1591CFL. Obudowa jest za wysoka przez co wyświetlacz należałoby umieścić na długich goldpinach a przycisk przedłużyć. Jeśli wyświetlacz LCD będzie zamontowany w gnieździe trzeba będzie podłożyć pod niego gąbkę lub inny materiał, który utrzyma go w pozycji poziomej.

Fotografia 1. Działający termometr z dołączoną taśmą i czujnikiem

Program do mikrokontrolera wgrywamy za pośrednictwem złącza J5. Ostatnie czynności uruchomieniowe to podłączenie jednego lub kilku termometrów DS18B20, 32 diody WS2812 i dołączenie zasilania (fotografia 1) Nastawnikami SW1 i SW2 ustawia się temperaturę dolnego i górnego końca skali. SW1 wyraża temperaturę w stopniach Celsjusza pomnożonej przez dwa, co daje zakres regulacji 0...32°C. SW2 działa podobnie tyle, że z offsetem 20 stopni. Przykładowe nastawy SW1, SW2 oraz odpowiadające im temperatury zestawiono w tabeli 1. Zakres wyświetlanych temperatur najlepiej ustawić na 32 stopnie lub więcej. Gdy będzie mniejszy, np. 15 stopni, to zmiana o 1 stopień spowoduje zaświecenie dwóch LED.

Tabela 1. Przykładowe nastawy SW1 i SW2 oraz odpowiadające im temperatury
Nastawa SW1 Temperatura Nastawa SW2 Temperatura
0 0 0 20
1 2 1 22
2 4 2 24
3 6 3 26
15 31 15 51

Oprogramowanie wykrywa błędy i sygnalizuje je. W przypadku braku termometru DS18b20 lub błędów w komunikacji, na wyświetlaczu OLED pojawi się komunikat: „Error DS18B20”, a na taśme LED zaświecą na czerwono trzy diody w pobliżu środka skali.

Przycisk S2 umożliwia zmianę termometru, z którego temperatura jest wyświetlana. Każde kolejne naciśnięcie to kolejny termometr. Gdy wyświetlane są dane ostatniego termometru, kolejne naciśnięcie wyświetli dane pierwszego.

Zasilanie urządzenia

Według danych katalogowych diod WS2812B, maksymalny prąd jednej struktury wynosi 18 mA. Teoretycznie, diody mogą więc pobrać: 32 szt.·18 mA·3 (RGB) struktury =1,7 A. W praktyce, kolor raczej nie będzie biały, jeśli będzie to np. żółty to pobór prądu spada do 1,2 A. Jeśli intensywność świecenia (PWM) będzie ustawiona na 80% wszystkie świecące diody będą pobierały 921 mA. Trzeba pamiętać, że intensywność świecenia a wypełnienie PWM to dwie różne rzeczy. Początkowy wzrost wypełnienia daje duże zmiany jasności świecenia, później zmiany są coraz mniej widoczne. Zmiana PWM z 0 na 10% jest bardzo widoczna, a z 90 na 100% prawie niewidoczna.

W oprogramowaniu termometru zastosowano korektę programową przez co regulacja potencjometrem P1 wydaje się być liniowa. Pobór prądu przez mikrokontroler i inne elementy urządzenia można pominąć bo nie przekracza 50 mA.

SaS
sas@elportal.pl

Wykaz elementów:
Rezystory: (SMD 1206)
  • R4 R5 R8 R9: 1,5 kΩ
  • R11: 22 Ω
  • R7: 4,7 kΩ
  • R12: 470 Ω
  • P2: 10 kΩ potencjometr montażowy
Kondensatory: (SMD 1206)
  • C1, C6…C8, C10, C12: 100 nF
  • C2, C3: 10 μF
  • C9, C11: 10 μF
Półprzewodniki:
  • U1: STM32F072RBT6
  • U2: DS9503
  • U3: SPX1117M3-L-3-3
  • U4: 74HC(T)2G00DP (TSSOP8)
  • D1: Dioda LED zielona SMD1206
Inne:
  • J2: modOLED091 IIC (KAMAMI id 564691)
  • Q1: 8 MHz HC49-S
  • F1: PCT 100 mA – 0ZCH0010FF2E
  • J1: Gniazdo USB-B Mini
  • J5: Złącze T821-1-06-S1
  • J6, J9: Złącze NS25-W3K
  • J8: Złacze TB-5.0-PP-3P + TB-5.0-PIN24 (3 piny)
  • J10: Goldpin 3×1 + zwora
  • SW1, SW2: RTE1600G44
  • S2: Mswitch 5×7
  • moduł KamodWS2812-8 (KAMAMI id: 557918) × 4 szt.
Artykuł ukazał się w
Marzec 2020
Zobacz też
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik wrzesień 2020

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio wrzesień 2020

Świat Radio

Magazyn użytkowników eteru

Automatyka Podzespoły Aplikacje wrzesień 2020

Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna wrzesień 2020

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Praktyczny Kurs Elektroniki 2018

Praktyczny Kurs Elektroniki

24 pasjonujące projekty elektroniczne

Elektronika dla Wszystkich sierpień 2020

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów