Изградете своя собствена метеорологична станция Raspberry Pi

Build Your Own Raspberry Pi Weather Station



Raspberry Pi Sense Hat е допълнителна платка, която може да се използва с едноплатни компютри Raspberry Pi. Шапката Raspberry Pi Sense има 8 × 8 LED дисплей и джойстик с 5 бутона и се предлага със следните сензори:

  1. Жироскоп
  2. Акселерометър
  3. Магнитометър
  4. Температура
  5. Барометрично налягане
  6. Влажност

В тази статия ще ви покажа как да създадете уеб приложение за метеостанция, базирано на API на Python, като използвате температура , барометрично налягане , и влажност сензори на Raspberry Pi Sense Hat. За да следвате тази статия, ще ви трябва следното:







  1. Raspberry Pi 3 или Raspberry Pi 4 с мрежова свързаност.
  2. Модул Raspberry Pi Sense Hat.
  3. Захранващ адаптер micro-USB (Raspberry Pi 3) или USB Type-C (Raspberry Pi 4).
  4. 16 GB или 32 GB microSD карта с Raspberry Pi OS.
  5. Лаптоп или настолен компютър за достъп до VNC отдалечен работен плот или SSH достъп до Raspberry Pi.

ЗАБЕЛЕЖКА: В тази статия ще се свържем с Raspberry Pi дистанционно чрез VNC или SSH, като използваме безглавната настройка на Raspberry Pi. Ако не искате да имате достъп до вашия Raspberry Pi от разстояние чрез SSH или VNC, ще трябва да свържете монитор, клавиатура и мишка към вашия Raspberry Pi.



За да научите как да мигате изображението на Raspberry Pi OS на microSD карта, моля, направете справка Как да инсталирате и използвате Raspberry Pi Imager. Ако имате нужда от помощ при инсталирането на Raspberry Pi OS на вашия Raspberry Pi, прочетете Как да инсталирате Raspberry Pi OS на Raspberry Pi 4 . Ако имате нужда от помощ с безглавната настройка на Raspberry Pi, вижте Как да инсталирате и конфигурирате Raspberry Pi OS на Raspberry Pi 4 без външен монитор.



Свързване на Raspberry Pi Sense Hat към Raspberry Pi

Комплектът Raspberry Pi Sense Hat се доставя с добавената платка Raspberry Pi Sense Hat, 40-пинов хедър от мъжки към женски и някои винтове и дистанционни елементи.





Преди да можете да прикрепите дъската Sense Hat към Raspberry Pi, трябва да свържете 40-пиновата заглавка към Sense Hat. Свържете мъжките щифтове на 40-пиновия заглавие мъж-жена към Sense Hat, както е показано на изображенията по-долу.



Едноплатните компютри Raspberry Pi имат 4 отвора, които могат да се използват за закрепване на допълнителни платки или калъф. За да прикрепите допълнителната платка, поставете винтове от задната страна на Raspberry Pi, както е показано на изображенията по-долу.

След това свържете дистанционер към винта.

След като добавите и четирите винта и дистанционни елементи, вашият Raspberry Pi трябва да изглежда така, както е показано на изображението по -долу.

Свържете Raspberry Pi Sense Hat към 40-пиновия GPIO мъжки хедър на Raspberry Pi, както е показано на изображенията по-долу.

ЗАБЕЛЕЖКА: Бъдете внимателни, докато изключвате Raspberry Pi Sense Hat от 40-пиновия GPIO заглавие на Raspberry Pi, за да избегнете огъване на щифтовете на Raspberry Pi GPIO.

С четирите останали винта затегнете Raspberry Pi Sense Hat, както е показано на изображенията по -долу.

Захранване на Raspberry Pi

Сега, когато Raspberry Pi Sense Hat е свързан с Raspberry Pi, поставете microSD картата с Raspberry Pi OS в слота за microSD карта на Raspberry Pi, свържете захранващия кабел към Raspberry Pi и го включете.

Инсталиране на Raspberry Pi Sense Hat Python библиотека

За да използвате Raspberry Pi Sense Hat на Raspberry Pi, чувствена шапка Библиотеката на Python трябва да бъде инсталирана на Raspberry Pi OS. The чувствена шапка библиотека е достъпна в официалното хранилище на пакети на Raspberry Pi OS.

За да инсталирате Raspberry Pi чувствена шапка Библиотека Python на Raspberry Pi OS, първо актуализирайте кеша на хранилището на APT пакета със следната команда:

$ sudo apt актуализация

След това изпълнете следната команда:

$ sudo apt install sense -hat -y

Инсталиране на библиотеката Python на Flask Micro Web Framework

Ще използваме рамката на Flask Python, за да създадем нашето приложение за времето. Можете да инсталирате Flask от официалното хранилище на пакети на Raspberry Pi OS със следната команда:

$ sudo apt инсталирате python3 -flask -y

Създаване на директория на проекта

Добра идея е да създадете директория на проект, за да организирате вашите проектни файлове. За да създадете директория на проект ~/работа , използвайте следната команда:

$ mkdir ~/работа

След като се създаде директорията на проекта, отидете до директорията на проекта, както следва:

$ cd ~/работа

Тестване на Raspberry Pi Sense Hat

За да проверим дали Raspberry Pi Sense Hat работи, можем да напишем прост тестов скрипт на Python. Можете да създадете нов скрипт на Python, наречен test.py с нано текстов редактор, както следва:

$ nano test.py

Въведете следния код в test.py файл. Ред 1 внос SenseHat от sense_hat модул, ред 3 създава a SenseHat обект и съхранява препратка в смисъл променлива, а линии 5–6 задават цвета на всички 8 × 8 светодиоди в червено. След като приключите, натиснете + х следван от И и .

Можете да стартирате test.py Python скрипт със следната команда:

$ python3 test.py

LED матрицата 8 × 8 трябва да свети в червен цвят, както е показано на изображението по -долу.

За да изключите светодиодите на Sense Hat, стартирайте ясно () метод без стойност на цвета в test.py Python скрипт, както е показано на екрана по -долу, и стартирайте test.py Пак скрипт на Python.

Светодиодите на Sense Hat сега трябва да бъдат изключени, както е показано на изображението по -долу.

Ако Sense Hat работи правилно, преминете към следващия раздел.

Получаване на данни за времето от Sense Hat

Можете да получите сензорни данни от Sense Hat много лесно, като използвате чувствена шапка Библиотека на Python. За да извлечете сензорни данни от Sense Hat, можете да създадете нов скрипт на Python read_sensor_data.py както следва:

$ nano read_sensor_data.py

Въведете следния код в read_sensor_data.py Python файл.

отsense_hatвносSenseHat
от време вноссън
смисъл=SenseHat()
смисъл.ясно()
докато Вярно:
tempC=смисъл.get_temperature()
tempF=tempC *(9/5)+32
налягане=смисъл.get_pressure()
влажност=смисъл.get_humidity()

печат(„Температура: %.2f ° C/ %. 2f ° Fн'%(tempC,tempF))
печат(„Налягане: %.2f mbн'%(налягане))
печат('Влажност:%.2f %%нн'%(влажност))
сън(5)

След като приключите, натиснете + х следван от И и .

В горния код, редове 1 и 2 импортират всички необходими библиотеки, ред 4 създава a SenseHat обект, а ред 5 изключва всички светодиоди на Sense Hat с помощта на ясно () метод. Цикълът while в ред 7 е безкраен цикъл, който ще изпълнява кода в редове 8–16 завинаги.

В ред 8, get_temperature () метод се използва за четене на температурните данни (в градуси по Целзий) от сензора за влажност на сензорната шапка. В ред 9 данните за температурата се преобразуват от градуси по Целзий в градуси по Фаренхайт. В ред 10, get_pressure () метод се използва за четене на данните за налягането на въздуха (в милибари) от сензора за налягане на Sense Hat. В ред 11, get_humidity () метод се използва за четене на данните за влажността (в %) от сензора за влажност на Sense Hat.

Редове 13–15 се използват за отпечатване на сензорните данни в конзолата, а ред 16 се използва за изчакване на 5 секунди, преди да се прочете отново сензорните данни.

Можете да стартирате read_sensor_data.py Python скрипт, както следва:

$ python3 read_sensor_data.py

След като скриптът бъде стартиран, сензорните данни ще бъдат отпечатани в конзолата.

Сега, когато можем да прочетем сензорните данни от Sense Hat, натиснете + ° С за да спрете програмата.

Създаване на уеб приложение за метеорологична станция

В този раздел ще ви покажем как да използвате уеб рамката Python Flask за създаване на API за времето и приложение за времето. Приложението за времето ще получи достъп до API за метеорологични данни и ще покаже метеорологичните данни в реално време. Целият код, обсъден в този раздел, е достъпен в GitHub на адрес shovon8 / raspberry-pi-sense-hat-weather-app .

Първо създайте a server.py Python скрипт в директорията на проекта, както следва:

$ nano server.py

Въведете следния код в server.py Python файл.

отколбавносКолба
отколбавносjsonify
отколбавносrender_template
отколбавносurl_for
отsense_hatвносSenseHat
приложение=Колба(__ име__)
приложение.config[„SEND_FILE_MAX_AGE_DEFAULT“] = 0
смисъл=SenseHat()
смисъл.ясно()
сприложение.test_request_context():
url_for('статичен',име на файл='style.css')
url_for('статичен',име на файл='app.js')
@приложение.маршрут('/пожар')
defпожар():
tempC=смисъл.get_temperature()
tempF=tempC *(9/5)+32
налягане=смисъл.get_pressure()
наляганеPsi=налягане *0,0145038
наляганеP=налягане *100
влажност=смисъл.get_humidity()

връщанеjsonify({
'температура':{ '° С': tempC, 'F': tempF},
'налягане':{ 'mb': налягане, 'hPa': налягане,
'пси': pressurePsi, 'P': наляганеP},
'влажност': влажност
})
@приложение.маршрут('/')
defУ дома():
връщанеrender_template('./home.html')

След това натиснете + х следван от И и за да запазите server.py Python скрипт.

В кода по -горе редове 1–5 импортират всички необходими библиотеки, ред 7 създава приложение Flask, ред 11 създава обект SenseHat, а ред 12 изключва всички светодиоди на Sense Hat. Ред 8 деактивира уеб кеширането за приложението Flask. Тъй като това приложение е леко, няма нужда от кеширане. Ако искате да промените приложението, деактивирането на уеб кеширането ще направи тестването много по -лесно.

Редове 18–31 четат сензорните данни от Sense Hat и връщат API данните във формат JSON при HTTP GET заявка в /пожар крайна точка на уеб сървъра. Редове 37–39 връщат началната страница на уеб приложението за времето на / крайна точка на уеб сървъра. Началната страница се изобразява от home.html файл, който трябва да бъде в шаблони/ директория на директорията на проекта.

Редове 14–16 се използват за разрешаване на достъп до style.css и app.js статични файлове. Тези файлове трябва да са в статичен/ директория на директорията на проекта. The style.css файлът се използва за оформяне на home.html началната страница и app.js файл се използва за заявяване на API данни от /пожар крайна точка и актуализирайте метеорологичните данни на home.html страница на всеки 5 секунди.

Създайте статичен/ и шаблони/ директория в директорията на проекта, както следва:

$ mkdir -v {статично, шаблони}

Създавам home.html файл в шаблони/ директория, както следва:

$ nano шаблони/home.html

Въведете следния код в home.html файл.


< html >
< глава >
< мета име='изглед' съдържание='width = device-width, initial-scale = 1.0'>
< заглавие >Метеорологична станция Raspberry Pi</ заглавие >
< връзка отн='таблица със стилове' Тип='text/css'
href='{{url_for (' static ', filename =' style.css ')}}'/>
</ глава >
< тяло >
< div документ за самоличност=„съдържание“>
< h1 >Метеорологична станция Raspberry Pi</ h1 >

< div клас=„съдържание-данни“>
< h2 >Температура</ h2 >
< div клас='ред за данни'>
< div клас=„клетка с данни“ документ за самоличност='tempC'>
...
</ div >
< div клас=„клетка с данни“ документ за самоличност='tempF'>
...
</ div >
</ div >
</ div >

< div клас=„съдържание-данни“>
< h2 >Налягане</ h2 >
< div клас='ред за данни'>
< div клас=„клетка с данни“ документ за самоличност='pressureMb'>
...
</ div >
< div клас=„клетка с данни“ документ за самоличност='pressurePsi'>
...
</ div >
</ div >
< div клас='ред за данни'>
< div клас=„клетка с данни“ документ за самоличност='pressureHpa'>
...
</ div >
< div клас=„клетка с данни“ документ за самоличност='pressureP'>
...
</ div >
</ div >
</ div >

< div клас=„съдържание-данни“>
< h2 >Влажност</ h2 >
< div клас='ред за данни'>
< div клас=„клетка с данни“ документ за самоличност='влажност'>
...
</ div >
</ div >
</ div >
</ div >

< скрипт Тип='текст/javascript' src='{{url_for (' static ', filename =' app.js ')}}'></ скрипт >
</ тяло >
</ html >

След това натиснете + х следван от И и за да запазите home.html файл.

Създавам style.css файл в статичен/ директория, както следва:

$ nano static/style.css

Въведете следните кодове в style.css файл.

@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
подплънки: 0;
марж: 0;
шрифтово семейство: 'Робот', без засечки;
}
тяло{
заден план: # 737373;
}
h1{
дисплей: блок;
цвят: #79DC7B;
подравняване на текст: център;
тегло на шрифта: 400;
заден план: # 000;
подплънки: 0,5 дм 0;
}
h2{
дисплей: блок;
заден план: # 000;
цвят: #Ф ф ф;
подравняване на текст: център;
тегло на шрифта: 400;
размер на шрифта: 1em;
}
.data-content {
марж: 10 пиксела;
граница: 2 пиксела твърд черен;
граница-радиус: 5 пиксела;
Цвят на фона: #79DC7B;
}
.data-ред {
дисплей:огъване;
посока на огъване:ред;
}
.данни-клетка {
ширина: 100%;
височина: 80 пиксела;
дисплей:огъване;
align-items: център;
оправдавам-съдържание: център;
тегло на шрифта: удебелен;
размер на шрифта: 1,5 ем;
цвят: # 006902;
}
.данни-клетка:задръжте {
заден план: # FFE891;
цвят: # AA8600;
курсора: показалец;
}

След това натиснете + х следван от И и за да запазите style.css файл.

Създайте app.js файл в статичен/ директория, както следва:

$ nano static/app.js

Въведете следния код в app.js файл.

прозорец.addEventListener('зареждане',главен);
функцияглавен() {
функцияgetAPIData() {
къдетоhttp= новXMLHttpRequest();

http.onreadystatechange = функция() {
ако(това.readyState === 4 && това.състояние === 200) {
актуализация(JSON.разбор(това.responseText));
}
}

http.отворен('ВЗЕМИ', '/пожар', вярно);
http.изпращам();
}


функцияактуализация(apiData) {
къдетоtempC=документ.getElementById('tempC');
къдетоtempF=документ.getElementById('tempF');
къдетоналяганеMb=документ.getElementById('pressureMb');
къдетоналяганеPsi=документ.getElementById('pressurePsi');
къдетоналяганеHpa=документ.getElementById('pressureHpa');
къдетоналяганеP=документ.getElementById('pressureP');
къдетовлажност=документ.getElementById('влажност');

tempC.innerHTML =parseFloat(apiData.температура.° С).to Fixed(2) + '° C';
tempF.innerHTML =parseFloat(apiData.температура.F).to Fixed(2) + „° F“;

наляганеMb.innerHTML =parseFloat(apiData.налягане.mb).to Fixed(2) + 'mb';
наляганеPsi.innerHTML =parseFloat(apiData.налягане.пси).to Fixed(2) + 'пси';
наляганеHpa.innerHTML =parseFloat(apiData.налягане.hPa).to Fixed(2) + 'hPa';
наляганеP.innerHTML =parseFloat(apiData.налягане.P).to Fixed(2) + 'P';

влажност.innerHTML =parseFloat(apiData.влажност).to Fixed(2) + '%';
}


функцияприложение() {
прозорец.setInterval(функция() {
getAPIData();
}, 5000);
}

приложение();
}

След това натиснете + х следван от И и за да запазите app.js файл.

Тук ред 1 изпълнява main () функция, когато уеб страницата завърши зареждането. В main () функция, getAPIData () функцията извлича данните за метеорологичния API с помощта на AJAX и извиква update () функция (в ред 10), след като данните бъдат успешно извлечени. The update () функцията актуализира елемента на уеб страницата, използвайки данните от API.

В ред 20, document.getElementById () метод се използва за получаване на препратка към елемента на уеб страницата с идентификатора tempC . Ред 28 се използва за замяна на съдържанието на елемента на уеб страницата, който има идентификатор tempC с температурата (в Целзий) от API. По същия начин съдържанието на всички уеб елементи (редове 21–26) се заменя със съответните им API данни.

В приложение () функция, getAPIData () се извиква на всеки 5 секунди (5000 милисекунди), за да актуализира метеорологичните данни в приложението за времето. И накрая, в ред 46, приложение () функцията се изпълнява.

За да тествате уеб приложението, въведете следната команда:

$ FLASK_APP = server.py колба тичане --host = 0.0.0.0

Приложението за времето трябва да работи на порт 5000 (по подразбиране).

За да проверите дали Weather Weather работи, изпълнете следната команда:

$ curl -s http: // localhost: 5000/api | json_pp

Както можете да видите, данните за Weather API се отпечатват в конзолата. Следователно API работи.

За да тествате приложението Weather, посетете http: // localhost: 5000 от уеб браузър Chromium. Приложението Weather трябва да се зареди в уеб браузъра, но първо не трябва да се показват метеорологични данни.

След няколко секунди приложението за времето трябва да завърши извличането на метеорологичните данни от API и да ги покаже.

Във всеки момент можете да натиснете + ° С за да спрете уеб сървъра.

Създаване на услуга Systemd за метеорологичното уеб приложение

В този раздел ще ви покажем как да създадете системния сервизен файл за приложението за времето, така че да се стартира автоматично при зареждане.

Първо създайте a weather-station.service файл в директорията на вашия проект, както следва:

$ nano weather-station.service

Въведете следните редове код в weather-station.service файл.

[Мерна единица]
Описание = Уеб приложение за метеорологична станция Raspberry Pi с помощта на Raspberry Pi Sense Hat
След = network.target

[Обслужване]
WorkingDirectory =/home/pi/work
Среда = FLASK_APP = server.py
Околна среда = FLASK_ENV = производство
ExecStart =/usr/bin/flask run --host = 0.0.0.0
StandardOutput = наследяване
StandardError = наследяване
Рестартиране = винаги
Потребител = pi

[Инсталирай]
WantedBy = многопотребителска цел

След това натиснете + х следван от И и за да запазите weather-station.service файл.

Копирайте weather-station.service файл към /etc/systemd/system/ директория със следната команда:

$ sudo cp -v weather -station.service/etc/systemd/system/

Презаредете демоните на systemd, за да влязат в сила промените, както следва:

$ sudo systemctl демон-презареждане

The метеорологична станция услугата systemd трябва да е неактивна в момента, както е показано на екрана по -долу.

$ sudo systemctl статус weather-station.service

Стартирайте метеорологична станция услуга със следната команда:

$ sudo systemctl стартира weather-station.service

Както можете да видите, метеорологична станция услугата вече работи.

$ sudo systemctl статус weather-station.service

Сега, когато метеорологична станция услугата работи, можете да я добавите към стартирането на системата на Raspberry Pi OS със следната команда:

$ sudo systemctl активира weather-station.service

Рестартирайте Raspberry Pi със следната команда:

$ sudo рестартиране

След като обувките ви на Raspberry Pi, метеорологична станция услугата трябва да работи, както е показано на екрана по -долу.

$ sudo systemctl статус weather-station.service

Достъп до приложението Weather от други устройства

За да получите достъп до приложението за времето от други устройства във вашата домашна мрежа, трябва да знаете IP адреса на вашия Raspberry Pi. Можете да намерите IP адреса на вашия Raspberry Pi 4 от интерфейса за уеб управление на вашия домашен рутер. В нашия случай IP адресът е 192.168.0.103, но този адрес ще бъде различен за вас, така че не забравяйте да замените този адрес с вашия във всички следващи стъпки.

Ако имате достъп до конзолата Raspberry Pi, можете да изпълните следната команда, за да намерите и IP адреса.

$ hostname -I

След като знаете IP адреса на вашия Raspberry Pi, можете да получите достъп до него от всяко устройство във вашата домашна мрежа. Както е показано на екранната снимка по -долу, имаме достъп до приложението за времето от смартфон с Android.

Заключение

В тази статия ви показахме как да използвате Raspberry Pi Sense Hat за изграждане на метеорологична станция Raspberry Pi. Ние използвахме чувствена шапка Библиотека на Python за извличане на метеорологични данни от Raspberry Pi Sense Hat. След това използвахме микро уеб рамката на Flask Python, за да създадем API за времето и уеб приложение. Уеб приложението получава метеорологичните данни от API за времето на всеки 5 секунди, за да поддържа уеб приложението актуално с най -новите метеорологични данни.