Klasyczny termometr – cyfrowy bądź analogowy – składa się z sensora temperatury i wyświetlacza. Sensorem może być element taki jak termistor czy dioda półprzewodnikowa lub też scalony sensor temperatury (często wyposażony w cyfrowy interfejs do komunikacji – na rynku dostępne są układy do pomiaru temperatury z interfejsami I2C czy 1-Wire). Wyświetlacz powinien podawać informację w sposób czytelny dla użytkownika. Może to być wyświetlacz siedmiosegmentowy LED czy ekran LCD.
Opisywane urządzenie prezentuj trochę inne podejście. Układ zamiast sensora temperatury korzysta z Internetu, aby połączyć się z portalem udostępniającym dane pogodowe dla wielu miejsc na świecie. Pobiera informacje o pogodzie, a następnie wyświetla na kolorowych diodach LED, które emulują słupek rtęci. Dodatkowo, na niewielkim ekranie OLED wyświetlana jest nazwa miasta i wartość temperatury. Układ może obsługiwać całą listę miast, przełączając się pomiędzy nimi po kolei. Można także ręcznie wybrać miasto do wyświetlenia za pomocą przycisków z boku. Diody LED i ekran OLED są wyłączane, gdy układ jest nieaktywny przez kilka minut i włączy się ponownie, jeśli wykryje znaczną zmianę w poziomie oświetlenia w otoczeniu.
Potrzebne elementy
Do budowy opisywanego urządzenia potrzebne będą:
- Moduł Raspberry Pi Zero W z kartą SD wraz z zainstalowanym systemem operacyjnym Raspbian,
- 1,5-calowy moduł OLED sterowany poprzez interfejs I2C,
- Zasilacz 5 V, 2,4 A dla Raspberry Pi,
- Taśma LED RGB z diodami WS2812B (30 diod LED/m) o długości 5 metrów,
- Sklejka o grubości 4 i 6 mm, klej do drewna i pleksi (do wykonania obudowy),
- Opcjonalnie: płytka drukowana, przyciskami, gniazdem fotorezystora itp. jednakże układ zmontować można również np. na płytce uniwersalnej bądź podłączając poszczególne elementy kablami.
Na fotografii 1 pokazano częściowo zmontowaną konstrukcję z widocznymi elementami obudowy.
Połączenie wszystkich elementów i sterowanie diodami LED
Wszystkie elementy sterowane są poprzez poszczególne porty komputera jednopłytkowego Raspberry Pi Zero. Do minikomputera podpięto trzy przyciski, czujnik natężenia oświetlenia (fotorezystor), adresowalne diody RGB oraz ekran OLED. Dodatkowo, do komputera podłączyć musimy zasilanie 5 V poprzez port microUSB na płytce drukowanej Raspberry Pi. Zasilanie pozostałych elementów pobierane jest z odpowiednich pinów samego komputera jednopłytkowego.
Wyświetlacz OLED dołączony jest do interfejsu I2C Raspberry Pi. Interfejs ten posiada dwie linie – danych (SCL) i zegarową (SDA). Dołączone są one do, odpowiednio, pinów GPIO3 oraz GPIO2, gdzie wystawiony jest interfejs I2C1 tego komputera jednopłytkowego. Dodatkowo oczywiście, do modułu z ekranem OLED dołączyć należy zasilanie i masę. 1,5-calowy moduł OLED, jaki wykorzystał autor konstrukcji, zasilany może być napięciem 5 V lub 3,3 V, które pobrać można z Raspberry Pi z 2 i 4 pinu lub z 1 pinu złącza GPIO.
Diody LEF RGB wykorzystane w tym projekcie to moduły WS2812B. Każda dioda posiada wejście i wyjście cyfrowe, zachowujące się jak rejestr przesuwny dzięki temu dane z wejścia są przenoszone na wyjście cyfrowe diody, przesunięte o 24 bity potrzebne do zaprogramowania koloru na danym elemencie. W taśmie LED-owej diody połączone są szeregowo, dzięki czemu komputer musi komunikować się jedynie z jedną diodą, co wymaga zaangażowania tylko jednego pinu Raspberry Pi. Tym pinem jest GPIO18 (pin 12 na 40-pinowym złączu Raspberry Pi).
Do modułu podłączone są trzy przyciski – następne (next), poprzednie (previous) i wyłącz (shutdown). Są one podłączone z jednej strony do pinów cyfrowych Raspberry Pi (odpowiedmoop GPIO23, GPIO24 oraz GPIO25), a z drugiej strony do masy. Piny wejściowe są wewnętrznie podciągane do zasilania, więc zwarcie ich z masą powoduje pojawienie się na wejściu stanu niskiego, który może być wykrywany przez skrypt.
Fotorezystor podłączony jest do wejścia cyfrowego (pin GPIO4 – siódmy pin złącza GPIO). Z uwagi na fakt, że Raspberry Pi nie posiada przetwornika analogowo-cyfrowego, konieczne było zastosowanie innej metody pomiaru wartości rezystancji. W tym celuć zestawiono prosty układ RC na wejściu GPIO4. Kondensator podpięty jest bezpośrednio pomiędzy wejście a masę, a fotoopornik podłączony jest pomiędzy wejście cyfrowe a linię zasilania. W kodzie skryptu zaszyto prosty algorytm pomiaru rezystancji z pomocą tego układu.
Najpierw linia GPIO konfigurowana jest jako wyjście i ustawiana w stan niski. Będąc na potencjale masy rozładowuje ona dołączony kondensator. Następnie układ ustawia pin cyfrowy jako wejście, a fotorezystor zaczyna ładowanie kondensatora. Skrypt mierzy czas, potrzebny do naładowania kondensatora do poziomu stanu wysokiego, a czas ten jest proporcjonalny do prądu ładowania, który jest odwrotnie proporcjonalny do rezystancji fotoopornika. Wartość rezystancji bazowej fotoopornika i pojemności w układzie RC należy dobrać tak, aby w typowych warunkach pracy układu czas ładowania kondensatora nie przekraczał kilkuset cykli pracy skryptu.
Instalacja potrzebnych bibliotek
Zanim rozpoczniemy uruchamianie oprogramowania sterującego systemem na Raspberry Pi musimy zainstalować wszystkie potrzebne biblioteki, które pozwolą obsłużyć podłączane peryferia. W pierwszej kolejności, po podłączeniu wyświetlacza OLED, musimy zainstalować bibliotekę, pozwalającą na sterowanie tym ekranem. Upewnijmy się, że Raspberry Pi podłączane jest do Internetu, gdyż biblioteki pobierać będziemy z sieci. Wykonujmy, krok po kroku, wszystkie opisane niżej polecenia.
1. Włączamy interfejsy I2C oraz SPI w raspi-config. Po uruchomieniu tych interfejsów musimy zapisać ustawienia i uruchomić ponownie komputer.
2. Zaktualizujemy system:
Firmware termometru
Skrypt sterujący termometrem korzysta z danych zdalnego serwisu pogodowego z danymi meteorologicznymi. Aby móc korzystać z jego API należy najpierw wykonać kilka prostych kroków.
API Pogodowe
Duża część kodu, jaka została użyta w poniższym skrypcie, została napisana przez StuffWithKirby. Dotyczy głownie kodu odpowiedzialnego za odczyt danych w formacie JSON z API serwisu pogodowego OpenWeatherMap.org.
Aby korzystać z danych gromadzonych przez OpenWeatherMap.org konieczne jest stworzenie darmowego konta na tym portalu. Po jego założeniu uzyskamy tzw. klucz API, który pozwoli nam zalogować się do API systemu (należy go zapisać). Oprócz konta musimy także znać numer identyfikacyjny miasta, jakie nas interesuje. W tym celu musimy pobrać ze strony projektu (link na końcu artykułu) plik city.list.json.gz. Należy go rozpakować, aby wyszukać interesujące nas dane. Na liście znajduje się wiele miast Polski. Przykładowe wpisy pokazano na listingu 1.
Listing 1. Fragment pliku z kodami identyfikacyjnymi miast
[
{
„id”: 798544,
„name”: „Republic of Poland”,
„country”: „PL”,
„coord”: {
„lon”: 20,
„lat”: 52
}
},
{
„id”: 3094325,
„name”: „Kuchary”,
„country”: „PL”,
„coord”: {
„lon”: 19.383329,
„lat”: 52.150002
}
},
{
„id”: 3082707,
„name”: „Walbrzych”,
„country”: „PL”,
„coord”: {
„lon”: 16.284321,
„lat”: 50.771412
}
},
{
„id”: 3091150,
„name”: „Naklo nad Notecia”,
„country”: „PL”,
„coord”: {
„lon”: 17.60181,
„lat”: 53.142139
}
},
{
„id”: 756135,
„name”: „Warsaw”,
„country”: „PL”,
„coord”: {
„lon”: 21.01178,
„lat”: 52.229771
}
},
{
„id”: 3094802,
„name”: „Krakow”,
„country”: „PL”,
„coord”: {
„lon”: 19.91667,
„lat”: 50.083328
}
},
{
„id”: 3093524,
„name”: „Leszno”,
„country”: „PL”,
„coord”: {
„lon”: 16.57494,
„lat”: 51.84034
}
},
{
„id”: 3083271,
„name”: „Torun”,
„country”: „PL”,
„coord”: {
„lon”: 18.598141,
„lat”: 53.013748
}
},
{
„id”: 3083267,
„name”: „Toruń Północny”,
„country”: „PL”,
„coord”: {
„lon”: 18.6,
„lat”: 53.033329
}
},
]
Wybieramy spośród wszystkich dostępnych miast te, które nas interesują i zapisujemy ich identyfikatory (ciąg cyfr zawarty w polu id). Będziemy musieli je wpisać w naszym skrypcie sterującym, aby pobrać dane pogodowe dla tych lokalizacji.
Skrypt sterujący
Skrypt sterujący pobraliśmy z repozytorium na GitHubie już wcześniej, wraz z bibliotekami. Aby go uruchomić, w pierwszej kolejności musimy otworzyć folder LED_Thermometer_Code_and_OLED_driver:
Nikodem Czechowski, EP
Źródło: http://bit.ly/30G4fFX