Создайте свою собственную метеостанцию ​​Raspberry Pi

Build Your Own Raspberry Pi Weather Station

Raspberry Pi Sense Hat - это дополнительная плата, которую можно использовать с одноплатными компьютерами Raspberry Pi. Raspberry Pi Sense Hat имеет светодиодный дисплей 8 × 8 и 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. Карта microSD на 16 или 32 ГБ с ОС Raspberry Pi.
  5. Ноутбук или настольный компьютер для доступа к удаленному рабочему столу VNC или доступа SSH к Raspberry Pi.

ЗАМЕТКА: В этой статье мы подключимся к Raspberry Pi удаленно через VNC или SSH, используя безголовую настройку Raspberry Pi. Если вы не хотите получать доступ к Raspberry Pi удаленно через SSH или VNC, вам необходимо подключить к Raspberry Pi монитор, клавиатуру и мышь.



Чтобы узнать, как записать образ ОС Raspberry Pi на карту microSD, см. Раздел «Как установить и использовать Raspberry Pi Imager». Если вам нужна помощь в установке ОС Raspberry Pi на Raspberry Pi, прочтите Как установить ОС Raspberry Pi на Raspberry Pi 4 . Если вам нужна помощь в настройке Raspberry Pi без подключения к голове, ознакомьтесь с разделом «Как установить и настроить ОС Raspberry Pi на 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 в слот для карты microSD Raspberry Pi, подключите кабель питания к Raspberry Pi и включите его.

Установка библиотеки Python Raspberry Pi Sense Hat

Чтобы использовать Raspberry Pi Sense Hat на Raspberry Pi, разумная шляпа Библиотека Python должна быть установлена ​​в ОС Raspberry Pi. В разумная шляпа библиотека доступна в официальном репозитории пакетов Raspberry Pi OS.

Чтобы установить Raspberry Pi разумная шляпа Библиотека Python в ОС Raspberry Pi, сначала обновите кеш репозитория пакетов APT с помощью следующей команды:

$ sudo подходящее обновление

Затем выполните следующую команду:

$ 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 создает SenseHat объект и сохраняет ссылку в смысл переменная, а в строках 5–6 устанавливается красный цвет всех светодиодов 8 × 8. Когда вы закончите, нажмите + Икс с последующим А ТАКЖЕ а также .

Вы можете запустить test.py Скрипт Python с помощью следующей команды:

$ python3 test.py

Светодиодная матрица 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 мбар п'%(давление))
Распечатать('Влажность:% .2f %% п п'%(влажность))
спать(5)

Когда вы закончите, нажмите + Икс с последующим А ТАКЖЕ а также .

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

В строке 8 get_tempera () используется для считывания данных о температуре (в градусах Цельсия) с датчика влажности Sense Hat. В строке 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, нажмите + C чтобы остановить программу.

Создание веб-приложения метеостанции

В этом разделе мы покажем вам, как использовать веб-фреймворк Python Flask для создания погодного API и погодного приложения. Приложение погоды получит доступ к API данных о погоде и покажет данные о погоде в режиме реального времени. Весь код, обсуждаемый в этом разделе, доступен на GitHub по адресу приложение shovon8 / raspberry-pi-sense-hat-weather .

Сначала создайте 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({
'температура':{ 'C': tempC, 'F': tempF},
'давление':{ 'mb': давление, 'гПа': давление,
'psi': pressurePsi, 'П': давление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 статические файлы. Эти файлы должны быть в папке статический / каталог каталога проекта. В style.css файл используется для стилизации home.html домашняя страница, а app.js файл используется для запроса данных API из /Огонь конечной точке и обновите данные о погоде на home.html страницу каждые 5 секунд.

Создать статический / а также шаблоны / каталог в каталоге проекта следующим образом:

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

Создать home.html файл в шаблоны / каталог следующим образом:

$ nano templates / home.html

Введите следующий код в home.html файл.


< html >
< голова >
< мета имязнак равно'область просмотра' содержаниезнак равно'ширина = ширина устройства, начальный масштаб = 1.0'>
< заглавие >Метеостанция Raspberry Pi</ заглавие >
< ссылка relзнак равно'таблица стилей' типзнак равно'текст / CSS'
hrefзнак равно'{{url_for (' static ', filename =' style.css ')}}'/>
</ голова >
< тело >
< div я бызнак равно'содержание'>
< h1 >Метеостанция Raspberry Pi</ h1 >

< div классзнак равно'data-content'>
< h2 >Температура</ h2 >
< div классзнак равно'строка данных'>
< div классзнак равно'ячейка данных' я бызнак равно'tempC'>
...
</ div >
< div классзнак равно'ячейка данных' я бызнак равно'tempF'>
...
</ div >
</ div >
</ div >

< div классзнак равно'data-content'>
< h2 >Давление</ h2 >
< div классзнак равно'строка данных'>
< div классзнак равно'ячейка данных' я бызнак равно'давлениеMb'>
...
</ div >
< div классзнак равно'ячейка данных' я бызнак равно'давлениеПси'>
...
</ div >
</ div >
< div классзнак равно'строка данных'>
< div классзнак равно'ячейка данных' я бызнак равно'давлениеHpa'>
...
</ div >
< div классзнак равно'ячейка данных' я бызнак равно'давлениеP'>
...
</ div >
</ div >
</ div >

< div классзнак равно'data-content'>
< 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 файл.

@Импортировать url(https://fonts.googleapis.com/css2?family=Roboto&display=swap.);
* {
набивка: 0;
прибыль: 0;
семейство шрифтов: 'Робот', без засечек;
}
тело{
фон: # 737373;
}
h1{
отображать: блокировать;
цвет: # 79DC7B;
выравнивание текста: центр;
font-weight: 400;
фон: # 000;
набивка: 0,5 эм 0;
}
h2{
отображать: блокировать;
фон: # 000;
цвет: #fff;
выравнивание текста: центр;
font-weight: 400;
размер шрифта: 1em;
}
.data-content {
прибыль: 10 пикселей;
граница: 2 пикселя твердый чернить;
border-radius: 5 пикселей;
фоновый цвет: # 79DC7B;
}
.data-row {
отображать:сгибать;
гибкое направление:ряд;
}
.data-cell {
ширина: 100%;
рост: 80 пикселей;
отображать:сгибать;
выровнять элементы: центр;
обосновать содержание: центр;
font-weight: жирный;
размер шрифта: 1.5em;
цвет: # 006902;
}
.data-cell:парить {
фон: # 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('давлениеMb');
кудадавлениеPsiзнак равнодокумент.getElementById('давлениеПси');
кудадавлениеHpaзнак равнодокумент.getElementById('давлениеHpa');
кудадавление Pзнак равнодокумент.getElementById('давлениеP');
кудавлажностьзнак равнодокумент.getElementById('влажность');

tempC.innerHTML знак равноparseFloat(apiData.температура.C).toFixed(2) + '° C';
tempF.innerHTML знак равноparseFloat(apiData.температура.F).toFixed(2) + '° F';

давлениеМб.innerHTML знак равноparseFloat(apiData.давление.мб).toFixed(2) + 'mb';
давлениеPsi.innerHTML знак равноparseFloat(apiData.давление.psi).toFixed(2) + 'psi';
давлениеHpa.innerHTML знак равноparseFloat(apiData.давление.гПа).toFixed(2) + 'гПа';
давление P.innerHTML знак равноparseFloat(apiData.давление.п).toFixed(2) + ' П';

влажность.innerHTML знак равноparseFloat(apiData.влажность).toFixed(2) + '%';
}


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

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

Затем нажмите + Икс с последующим А ТАКЖЕ а также чтобы спасти app.js файл.

Здесь строка 1 запускает главный() функция, когда веб-страница завершает загрузку. в главный() функция, getAPIData () функция извлекает данные API погоды с помощью AJAX и вызывает Обновить() функция (в строке 10) после успешного извлечения данных. В Обновить() функция обновляет элемент веб-страницы, используя данные 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 API, выполните следующую команду:

$ curl -s http: // локальный: 5000 / api | json_pp

Как видите, данные API погоды выводятся на консоль. Следовательно, API работает.

Чтобы протестировать приложение 'Погода', посетите http: // локальный: 5000 из веб-браузера Chromium. Приложение Погода должно быть загружено в веб-браузере, но сначала данные о погоде не должны отображаться.

Через несколько секунд приложение погоды должно завершить получение данных о погоде из API и отобразить их.

В любой момент вы можете нажать + C чтобы остановить веб-сервер.

Создание сервиса Systemd для веб-приложения Weather

В этом разделе мы покажем вам, как создать служебный файл systemd для приложения погоды, чтобы оно автоматически запускалось при загрузке.

Сначала создайте метеостанция. служба файл в каталоге вашего проекта следующим образом:

$ nano weather-station.service

Введите следующие строки кода в метеостанция. служба файл.

[Ед. изм]
Описание = Веб-приложение метеостанции Raspberry Pi с использованием Raspberry Pi Sense Hat
После = network.target

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

[Установить]
WantedBy = multi-user.target

Затем нажмите + Икс с последующим А ТАКЖЕ а также чтобы спасти метеостанция. служба файл.

Скопируйте метеостанция. служба файл в / и т.д. / systemd / system / каталог с помощью следующей команды:

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

Перезагрузите демоны systemd, чтобы изменения вступили в силу следующим образом:

$ sudo systemctl демон-перезагрузка

В метеостанция Сервис systemd в данный момент должен быть неактивен, как показано на скриншоте ниже.

$ sudo systemctl status weather-station.service

Начать метеостанция service с помощью следующей команды:

$ sudo systemctl start weather-station.service

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

$ sudo systemctl status weather-station.service

Теперь, когда метеостанция сервис работает, вы можете добавить его в системный запуск ОС Raspberry Pi с помощью следующей команды:

$ sudo systemctl enable weather-station.service

Перезагрузите Raspberry Pi с помощью следующей команды:

$ sudo перезагрузка

После загрузки Raspberry Pi метеостанция сервис должен быть запущен, как показано на скриншоте ниже.

$ sudo systemctl status weather-station.service

Доступ к приложению Погода с других устройств

Чтобы получить доступ к приложению погоды с других устройств в вашей домашней сети, вам необходимо знать 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 секунд, чтобы постоянно обновлять веб-приложение с последними данными о погоде.