Nadal jest lato, każdy ma trochę więcej wolnego czasu niż zazwyczaj. Czas ten spożytkować można na wiele sposobów - granie w gry komputerowe, oglądanie filmów na youtubie czy uprawianie sportów to tylko niektóre z możliwości. Ale oczywiście elektronicy i programiści - hobbyści i zawodowcy - mają teraz więcej czasu niż zazwyczaj na zrealizowanie jakiegoś pobocznego projektu, zanim nadejdzie jesień i wszelkie terminy powrócą ze swoją nieubłaganością.
W poprzednim artykule przedstawialiśmy HoloCam, który wykorzystuje aż 24 Raspberry Pi z dedykowanymi kamerami, do rekonstrukcji obrazów 3D i dodawania efektów udających hologramy. W tym artykule zaprezentujemy sprytny system monitoringu, wykorzystujący te same dedykowane dla 'Maliny' kamery co HoloCam. Do realizacji opisywanego projektu wystarczą dwa moduły Raspberry Pi - jeden do monitorowania otoczenia i przekazywania strumienia wideo, a drugi do prezentacji zbieranych przez moduł monitorujący danych.
Wprowadzenie
Korzystając z adafrut.io możliwe jest zapisywanie i odczytywanie obrazów. Oznacza to, że mając moduł Raspberry Pi z kamerą można korzystając z tej usługi zapisywać obrazy wraz z innymi danymi np. z sensorów, a następnie odczytywać z wykorzystaniem drugiego modułu RPi podpiętego do sieci i adafrut.io gdziekolwiek na świecie.
Opisywany poniżej projekt wykorzystuje dwa moduły Raspberry Pi - nadajnik i odbiornik; nadajnik wyposażony jest w kamerę i termometr MCP9808. Odbiornik wyposażono w ekran PiTFT, który pozwala na wyświetlanie obrazów (odświeżanych co 5 minut), aktualnej temperatury i jej historii z ostatnich 24h.
Odbiornik wykorzystuje metodę io-client-python do odbioru danych i matplotliba, aby utworzyć wykres z danymi z ostatnich 24h.
Do skonstruowania układu potrzebować będziemy:
2 x Raspberry Pi - wykorzystać można dowolną wersję, ale wersje 2 lub 3 sprawdzają się najlepiej.
1 x PiTFT 2.8", 3.2" lub moduł HAT - zależnie jaki pasuje do naszej 'Maliny'.
1 x termometr z układem MCP9808.
1 x Kamera PiCam.
2 x Karta WiFi na USB lub kabel ethernet - zależnie jak podłączamy komputer do sieci.
4 x Zworki do podłączenia płytki z termometrem do modułu.
Plastikowy pojemnik na nadajnik, jeśli chcemy zabezpieczyć go przed wpływami środowiska.
Taśma klejąca.
Nadajnik
Do izolacji nadajnika od otoczenia wykorzystano plastikowy pojemnik spożywczy z wyciętymi otworami na kamerę i okablowanie. Jako, że nadajnik działać ma na zewnątrz domu, to liczba otworów, jakie w nim robimy, powinna być minimalna. Poza obudową umieścić musimy termometr, aby mierzył on temperaturę powietrza, a nie wnętrza obudowy, gdzie RPi produkować będzie pewną ilość ciepła.
Moduł RPi, kamerę i okablowanie przymocowano w obudowie taśmą klejącą. Termometr MCP9808 na osobnym PCB podłączony jest do RPi z pomocą czterech przewodów. Opis podłączania tego modułu do 'Maliny' znaleźć można m.in. tutaj.
Aby móc wysyłać i odbierać obrazy musimy w pierwszej kolejności założyć konto na stronie adafruit.io. Następnie skorzystać należy z tego poradnika, ale bez wprowadzania zmian do pliku motion.conf. W tym projekcie wprowadzić musimy odrobinę inne zmiany, co zostanie opisane szczegółowo poniżej. Aby Motion uruchamiał się zaraz po zabootowaniu systemu musimy postępować zgodnie z tym fragmentem poradnika. Następnie instalujemy kod uploadera do tego projektu, rozpoczynamy od zainstalowania wymaganych pakietów:
Dalej musimy skopiować kod programu. Znaleźć możemy go w projekcie adaiot, więc musimy sklonować repo z Githuba:
Na tym etapie powinniśmy uzyskać nasz sekretny klucz AIO i nazwę użytkownika Adafruit.io - dane te wprowadzamy w skrypcue adaiot-uploader, gdzie słowo SECRET, zastepujemy naszym sekretnym kluczem AIO:
Skrypt jest relatywnie nieskomplikowany. Loguje się on poprzez RESTowego klienta do usług adafruit.io. Nie potrzebujemy tutaj MQTT, ponieważ po prostu wysyłamy wartość do feeda. Następnie szukamy pliku lastsnap.jpg i wykorzystując bibliotekę PIL tworzymi miniaturkę lastsmall.jpg. Miniaturka tworzona jest ponieważ ekran, na którym wyświetlany jest finalnie obraz ma 320x240 px. Po konwersji obraz jest zapisywany, konwertowany do base64 i wysyłany poprzez adafruit.io.
Teraz skonfigurować musimy Motion, aby obraz taki wysyłany był co 5 minut. Zedytujmy zatem plik konfiguracyjny /etc/motion/motion.conf:
I wpiszmy tam:
Po wprowadzeniu zmian w pliku konfiguracyjnym zresetujmy usługę Motion:
Następnie tworzymi tzw. "dashboard" na adafruit, logując się do systemu, klikając na "Your Dashboards" i następnie na "Create Dashboard". Musimy teraz nadać dashboardowi nazwę, utworzyć go i naciskając znak plusa dodać blok do niego - obraz z feedu "pic".
Na tym etapie w dashboardzie powinniśmi widzieś obraz, aktualizowany co około 5 minut. Podczas odświeżania obrazu system może chwilowo pokazywać wszystkie obrazy, jakie odebrane zostały przez adafruit.io w danej sesji nasze przeglądarki - nie ma co być zaalarmowany tą kwestią. Teraz, do systemu dodać można, oprócz obrazu, odczyt temperatury.
W tym poradniku, opisana jest biblioteka służąca do obsługi sensora MCP9808, aby ją zainstalować musimy po kolei:
Następnie edytować musimy plik ~/adaiot/adaiot-temp.py i wpisać weń nasz sekretny klucz AIO zamiast hasła SECRET.
Plik ten wygląda następująco:
Skrypt ten ponownie wykorzystuje RESTowego klienta adafrut.io. W nieskończonej pętli program odczytuje temperaturę poprzez MCP9808, formatuję ją do 3 miejsc po przecinku i wysyła do feedu. Można w skrypcie zmienić nazwę,pod jaką jest wysyłana temperatura. Następnie dodać możemy ją do dashboarda.
Aby skrypt ten uruchamiał się automatycznie po reboocie RPi musimy przeedytować plik /etc/rc.local:
W pliku powinniśmy wpisać:
W dashboardzie dodajemy odpowiednią kontrolkę, która wyświetli nam aktualną temperaturę. Zakres temperatur dobrać musimy do zakresu w jakich ma ona być mierzona:
Po naciśnięciu "Create" powinno dać się zobaczyć kontrolkę pokazującą temperaturę obok naszego obrazu:
Odbiornik
Odbiornik prezentować będzie obrazy z kamery i odczyt temperatury na ekranie PiTFT. Cały system oparty jest na Pygame, jak je skonfigurować i uruchomić przeczytać możemy tutaj. Doinstalować musimy tylko kilka dodatkowych bibliotek oraz pobrać kod programu:
Kod odbiornika nie jest taki prosty, jak nadajnika, więc przyjrzyjmy mu się dokładniej. W skrypcie możemy chcieć zmienić wartość kilku zmiennych:
ADAFRUIT_IO_KEY oraz ADAFRUIT_IO_USERNAME, to zmienne które pozwalają na zalogowanie się do adafruit.io.
PIC_FEED i TEMP_FEED to zmienne z nazwami feedów z obrazami i temperaturą.
LCD_WIDTH i LCD_HEIGHT konfigurują wielkość ekranu LCD, na jakim wyświetlamy aplikację.
LUM_SAMPLE_POS to piksel, jaki jest próbkowany, aby określić luminancje - wyjaśnione dokładniej jest to później.
W dalszej kolejności musimy skonfigurować obsługę wydarzeń dla sesji MQTT. Podczas tej sesji szereg funkcji wywoływanych jest w różnych momentach:
connected jest wywoływane, gdy podłączmy się do serwera Adafruit. W tej funkcji łączymy się do dwóch feedów, a serwer Adafruit odpowiada nam wysyłając ostatnie wpisy z feedu, a następnie każde nowododane, wraz z odświeżaniem feedu przez nadajnik.
disconnected jest wywoływane gdy utracimy lub zakończymy połączenie. Biblioteka MQTT próbować będzie ponownie się połączyć, więc w naszym programie w takiej sytuacji drukujemy jedynie komunikat na standadowe wyjście.
message jest wywoływane za każdym razem, gdy w feedzie pojawi się nowy wpis.
Po odebraniu nowego obrazu jest on dekodowany z base64 do pliku jpeg i wysyłany do pygame. Następnie na podstawie koloru piksela (określonego w skrypcie) determinujemy jaki kolor ma mieć tekst naniesiony na obraz, tak aby był czytelny - jasny na ciemnym tle lub ciemny na jasnym tle. W ten sposób wyświetlana jest aktualna temperatura odczytana z termometru.
Funkcja show_dash jest główną funkcją realizującą wyświetlanie danych na LCD. Jeśi jesteśmy na stronie 0 to wyświetlane jest to co zapisano w image_surface, jeśli takowe skonfigurowaliśmy. Następnie w dolnej, lewej części pozycjonowna jest zawartość text_surface. Na stronie 1 wyświetlany jest wykres z temperaturami - o nim więcej poniżej.
W dalszej części zobaczymy jak wykorzystano ekran dotykowy do przełączania pomiędzy stronami, funkcja switch_page służy do przełączania pomiędzy stroną 0 i 1:
W ostatniej sekcji kodu zająć musimy się połączeniem z adafruit.op poprzez MQTT oraz zarządzaniem wątkami w programie, tak aby po jego wyłączeniu nie zostawić po sobie bałaganu.
W głównej pętli programu czekamy na wydarzenie MOUSEBUTTONUP, które wywołuje switch_page w momencie dotknięcia ekranu Następnie wykorzystując licznik sterujemy drugim wątkiem, aby uruchomić jego działanie co około 5 minut. Zadaniem tego wątku jest tworzenie wykresu z temperaturami, jak opisano dalej w tekście.
Skrypt feed.py definiuje osobny wątek, który jest okresowo uruchamiany. Jego zadaniem jest tworzenie wykresu z historią temperatur. Dzięki wykorzystaniu osobnego wątku nie ma problemu z regularnym odczytem danych z ekrany dotykowego. Jak łatwo zobaczyć na poniższych skryptach zbieranie danych o temperaturze i generowanie wykresu nie jest takim łatwym zadaniem jak może się wydawać.
Korzystając z RESTowego klienta do Adafruit odbierane są historyczne dane dotyczące temperatury. W tym celu wykorzystano Data Retrieval API, aby odczytać nie tylko najnowszą, ale wszyetkie temperatury z ostatnich 24 godzin. Ka,żdy obiekt, pobierany przez API ma swój format, wyglądający w następujący sposób:
Korzystając z created_epoch jesteśmy w stanie ocenić czy wartość została zebrana w okresie ostatnicj 24h i precyzyjnie umieścić ją na osi czasu. Dane zebrane w postaci dwóch list - jednej z czasami, a drugiej z wartościami temperatury - przekazywane są do matplotliba. Biblioteka ta odpowiedzialna jest za wygenerowanie wykresu i zapisanie go w pliku.
I gotowe. Pamiętajmy, aby program do wyświetlania dashboarda uruchamiać z uprawnieniami roota:
Źródła:
http://www.eetimes.com/document.asp?doc_id=1329968&page_number=2
https://learn.adafruit.com/monitor-picam-and-temperature-on-a-pitft-via-adafruit-dot-io?view=all
W poprzednim artykule przedstawialiśmy HoloCam, który wykorzystuje aż 24 Raspberry Pi z dedykowanymi kamerami, do rekonstrukcji obrazów 3D i dodawania efektów udających hologramy. W tym artykule zaprezentujemy sprytny system monitoringu, wykorzystujący te same dedykowane dla 'Maliny' kamery co HoloCam. Do realizacji opisywanego projektu wystarczą dwa moduły Raspberry Pi - jeden do monitorowania otoczenia i przekazywania strumienia wideo, a drugi do prezentacji zbieranych przez moduł monitorujący danych.
Wprowadzenie
Korzystając z adafrut.io możliwe jest zapisywanie i odczytywanie obrazów. Oznacza to, że mając moduł Raspberry Pi z kamerą można korzystając z tej usługi zapisywać obrazy wraz z innymi danymi np. z sensorów, a następnie odczytywać z wykorzystaniem drugiego modułu RPi podpiętego do sieci i adafrut.io gdziekolwiek na świecie.
Opisywany poniżej projekt wykorzystuje dwa moduły Raspberry Pi - nadajnik i odbiornik; nadajnik wyposażony jest w kamerę i termometr MCP9808. Odbiornik wyposażono w ekran PiTFT, który pozwala na wyświetlanie obrazów (odświeżanych co 5 minut), aktualnej temperatury i jej historii z ostatnich 24h.
Odbiornik wykorzystuje metodę io-client-python do odbioru danych i matplotliba, aby utworzyć wykres z danymi z ostatnich 24h.
Do skonstruowania układu potrzebować będziemy:
2 x Raspberry Pi - wykorzystać można dowolną wersję, ale wersje 2 lub 3 sprawdzają się najlepiej.
1 x PiTFT 2.8", 3.2" lub moduł HAT - zależnie jaki pasuje do naszej 'Maliny'.
1 x termometr z układem MCP9808.
1 x Kamera PiCam.
2 x Karta WiFi na USB lub kabel ethernet - zależnie jak podłączamy komputer do sieci.
4 x Zworki do podłączenia płytki z termometrem do modułu.
Plastikowy pojemnik na nadajnik, jeśli chcemy zabezpieczyć go przed wpływami środowiska.
Taśma klejąca.
Nadajnik
Do izolacji nadajnika od otoczenia wykorzystano plastikowy pojemnik spożywczy z wyciętymi otworami na kamerę i okablowanie. Jako, że nadajnik działać ma na zewnątrz domu, to liczba otworów, jakie w nim robimy, powinna być minimalna. Poza obudową umieścić musimy termometr, aby mierzył on temperaturę powietrza, a nie wnętrza obudowy, gdzie RPi produkować będzie pewną ilość ciepła.
Moduł RPi, kamerę i okablowanie przymocowano w obudowie taśmą klejącą. Termometr MCP9808 na osobnym PCB podłączony jest do RPi z pomocą czterech przewodów. Opis podłączania tego modułu do 'Maliny' znaleźć można m.in. tutaj.
Aby móc wysyłać i odbierać obrazy musimy w pierwszej kolejności założyć konto na stronie adafruit.io. Następnie skorzystać należy z tego poradnika, ale bez wprowadzania zmian do pliku motion.conf. W tym projekcie wprowadzić musimy odrobinę inne zmiany, co zostanie opisane szczegółowo poniżej. Aby Motion uruchamiał się zaraz po zabootowaniu systemu musimy postępować zgodnie z tym fragmentem poradnika. Następnie instalujemy kod uploadera do tego projektu, rozpoczynamy od zainstalowania wymaganych pakietów:
Kod: Bash
Dalej musimy skopiować kod programu. Znaleźć możemy go w projekcie adaiot, więc musimy sklonować repo z Githuba:
Kod: Bash
Na tym etapie powinniśmy uzyskać nasz sekretny klucz AIO i nazwę użytkownika Adafruit.io - dane te wprowadzamy w skrypcue adaiot-uploader, gdzie słowo SECRET, zastepujemy naszym sekretnym kluczem AIO:
Kod: Python
Skrypt jest relatywnie nieskomplikowany. Loguje się on poprzez RESTowego klienta do usług adafruit.io. Nie potrzebujemy tutaj MQTT, ponieważ po prostu wysyłamy wartość do feeda. Następnie szukamy pliku lastsnap.jpg i wykorzystując bibliotekę PIL tworzymi miniaturkę lastsmall.jpg. Miniaturka tworzona jest ponieważ ekran, na którym wyświetlany jest finalnie obraz ma 320x240 px. Po konwersji obraz jest zapisywany, konwertowany do base64 i wysyłany poprzez adafruit.io.
Teraz skonfigurować musimy Motion, aby obraz taki wysyłany był co 5 minut. Zedytujmy zatem plik konfiguracyjny /etc/motion/motion.conf:
Kod: Bash
I wpiszmy tam:
width 1024
height 768
output_pictures off
snapshot_interval 300
snapshot_filename lastsnap
on_picture_save /home/pi/adaiot/adaiot-uploader.pyPo wprowadzeniu zmian w pliku konfiguracyjnym zresetujmy usługę Motion:
Kod: Bash
Następnie tworzymi tzw. "dashboard" na adafruit, logując się do systemu, klikając na "Your Dashboards" i następnie na "Create Dashboard". Musimy teraz nadać dashboardowi nazwę, utworzyć go i naciskając znak plusa dodać blok do niego - obraz z feedu "pic".
Na tym etapie w dashboardzie powinniśmi widzieś obraz, aktualizowany co około 5 minut. Podczas odświeżania obrazu system może chwilowo pokazywać wszystkie obrazy, jakie odebrane zostały przez adafruit.io w danej sesji nasze przeglądarki - nie ma co być zaalarmowany tą kwestią. Teraz, do systemu dodać można, oprócz obrazu, odczyt temperatury.
W tym poradniku, opisana jest biblioteka służąca do obsługi sensora MCP9808, aby ją zainstalować musimy po kolei:
Kod: Bash
Następnie edytować musimy plik ~/adaiot/adaiot-temp.py i wpisać weń nasz sekretny klucz AIO zamiast hasła SECRET.
Plik ten wygląda następująco:
Kod: Python
Skrypt ten ponownie wykorzystuje RESTowego klienta adafrut.io. W nieskończonej pętli program odczytuje temperaturę poprzez MCP9808, formatuję ją do 3 miejsc po przecinku i wysyła do feedu. Można w skrypcie zmienić nazwę,pod jaką jest wysyłana temperatura. Następnie dodać możemy ją do dashboarda.
Aby skrypt ten uruchamiał się automatycznie po reboocie RPi musimy przeedytować plik /etc/rc.local:
Kod: Bash
W pliku powinniśmy wpisać:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
python /home/pi/adaiot/adaiot-temp.py &
exit 0W dashboardzie dodajemy odpowiednią kontrolkę, która wyświetli nam aktualną temperaturę. Zakres temperatur dobrać musimy do zakresu w jakich ma ona być mierzona:
Po naciśnięciu "Create" powinno dać się zobaczyć kontrolkę pokazującą temperaturę obok naszego obrazu:
Odbiornik
Odbiornik prezentować będzie obrazy z kamery i odczyt temperatury na ekranie PiTFT. Cały system oparty jest na Pygame, jak je skonfigurować i uruchomić przeczytać możemy tutaj. Doinstalować musimy tylko kilka dodatkowych bibliotek oraz pobrać kod programu:
Kod: Bash
Kod odbiornika nie jest taki prosty, jak nadajnika, więc przyjrzyjmy mu się dokładniej. W skrypcie możemy chcieć zmienić wartość kilku zmiennych:
ADAFRUIT_IO_KEY oraz ADAFRUIT_IO_USERNAME, to zmienne które pozwalają na zalogowanie się do adafruit.io.
PIC_FEED i TEMP_FEED to zmienne z nazwami feedów z obrazami i temperaturą.
LCD_WIDTH i LCD_HEIGHT konfigurują wielkość ekranu LCD, na jakim wyświetlamy aplikację.
LUM_SAMPLE_POS to piksel, jaki jest próbkowany, aby określić luminancje - wyjaśnione dokładniej jest to później.
Kod: Python
W dalszej kolejności musimy skonfigurować obsługę wydarzeń dla sesji MQTT. Podczas tej sesji szereg funkcji wywoływanych jest w różnych momentach:
connected jest wywoływane, gdy podłączmy się do serwera Adafruit. W tej funkcji łączymy się do dwóch feedów, a serwer Adafruit odpowiada nam wysyłając ostatnie wpisy z feedu, a następnie każde nowododane, wraz z odświeżaniem feedu przez nadajnik.
disconnected jest wywoływane gdy utracimy lub zakończymy połączenie. Biblioteka MQTT próbować będzie ponownie się połączyć, więc w naszym programie w takiej sytuacji drukujemy jedynie komunikat na standadowe wyjście.
message jest wywoływane za każdym razem, gdy w feedzie pojawi się nowy wpis.
Po odebraniu nowego obrazu jest on dekodowany z base64 do pliku jpeg i wysyłany do pygame. Następnie na podstawie koloru piksela (określonego w skrypcie) determinujemy jaki kolor ma mieć tekst naniesiony na obraz, tak aby był czytelny - jasny na ciemnym tle lub ciemny na jasnym tle. W ten sposób wyświetlana jest aktualna temperatura odczytana z termometru.
Kod: Python
Funkcja show_dash jest główną funkcją realizującą wyświetlanie danych na LCD. Jeśi jesteśmy na stronie 0 to wyświetlane jest to co zapisano w image_surface, jeśli takowe skonfigurowaliśmy. Następnie w dolnej, lewej części pozycjonowna jest zawartość text_surface. Na stronie 1 wyświetlany jest wykres z temperaturami - o nim więcej poniżej.
W dalszej części zobaczymy jak wykorzystano ekran dotykowy do przełączania pomiędzy stronami, funkcja switch_page służy do przełączania pomiędzy stroną 0 i 1:
Kod: Python
W ostatniej sekcji kodu zająć musimy się połączeniem z adafruit.op poprzez MQTT oraz zarządzaniem wątkami w programie, tak aby po jego wyłączeniu nie zostawić po sobie bałaganu.
W głównej pętli programu czekamy na wydarzenie MOUSEBUTTONUP, które wywołuje switch_page w momencie dotknięcia ekranu Następnie wykorzystując licznik sterujemy drugim wątkiem, aby uruchomić jego działanie co około 5 minut. Zadaniem tego wątku jest tworzenie wykresu z temperaturami, jak opisano dalej w tekście.
Kod: Python
Skrypt feed.py definiuje osobny wątek, który jest okresowo uruchamiany. Jego zadaniem jest tworzenie wykresu z historią temperatur. Dzięki wykorzystaniu osobnego wątku nie ma problemu z regularnym odczytem danych z ekrany dotykowego. Jak łatwo zobaczyć na poniższych skryptach zbieranie danych o temperaturze i generowanie wykresu nie jest takim łatwym zadaniem jak może się wydawać.
Korzystając z RESTowego klienta do Adafruit odbierane są historyczne dane dotyczące temperatury. W tym celu wykorzystano Data Retrieval API, aby odczytać nie tylko najnowszą, ale wszyetkie temperatury z ostatnich 24 godzin. Ka,żdy obiekt, pobierany przez API ma swój format, wyglądający w następujący sposób:
Data(created_epoch=1459912484.47247, created_at=u'2016-04-06T03:14:44.472Z', updated_at=u'2016-04-06T03:14:44.472Z', value=u'-0.875', completed_at=None, feed_id=514989, expiration=None, position=None, id=348921349)Korzystając z created_epoch jesteśmy w stanie ocenić czy wartość została zebrana w okresie ostatnicj 24h i precyzyjnie umieścić ją na osi czasu. Dane zebrane w postaci dwóch list - jednej z czasami, a drugiej z wartościami temperatury - przekazywane są do matplotliba. Biblioteka ta odpowiedzialna jest za wygenerowanie wykresu i zapisanie go w pliku.
Kod: Python
I gotowe. Pamiętajmy, aby program do wyświetlania dashboarda uruchamiać z uprawnieniami roota:
Kod: Bash
Źródła:
http://www.eetimes.com/document.asp?doc_id=1329968&page_number=2
https://learn.adafruit.com/monitor-picam-and-temperature-on-a-pitft-via-adafruit-dot-io?view=all
Kod: text
Fajne? Ranking DIY
