Меню Рубрики

Raspberry pi метеостанция своими руками

Содержание

Для воссоздания этой метеостанции понадобится:

Схема подключения датчика изображена на рисунке.

Дисплей WH1602 подключается как показано на рисунке. Наличие дисплея не обязательно:

Настройка I 2 C

Для включения I 2 C шины на Raspberry Pi нужно выполнить операции, описанные ниже.

Вариант #1:

Запустить настройки командой raspi-config

Зайти в меню Advanced Options->I2C

Включить I2C, позволить загрузку модуля для I2C

Вариант #2:

Редактируем файл: /etc/modprobe.d/raspi-blacklist.conf:

Закомментируйте строку blacklist i2c-bcm2708. Пример содержимого файла:

Редактируем файл: /etc/modules:

Редактируем файл: /boot/config.txt:

Устанавливаем i2c-tools утилиты

Перезагружаем Raspberry Pi:

После перезагрузки можем пересмотреть устройства подключенные к шине I 2 C:

0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — 76 —

В данном случае на шине 1 только одно устройство по адресу 0x76

Установка программного обеспечения

Устанавливаем скрипт weather.py

Качаем скрипты (у /home/pi/ будет создана директория weather и в нее закачаны необходимые файлы):

Создаем базу данных:

Настройка скрипта

Проверяем параметры:
home_dir – папка где лежит скрипт.
www_dir – папка www – сервера в которую будет записываться html файл с графиками.

Скрипт должен отработать без ошибок и сформировать файл index.htm с графиками в директории www_dir

Зайдите браузером для просмотра:

Устанавливаем запуск скрипта каждые 15 минут

Как работает скрипт

сrontab запускает скрипт каждые 15 минут (смотри файл /etc/crontab). Этот параметр можно изменить по желанию.

Далее комментарии к некоторым строкам кода.

Скрипт опрашивает датчик:

Выводит текущие данные в консоль и на дисплей:

Если хотите чтобы температура произносилась голосом установите програму espeak и разкоментируйте следующие строки:

Подключается к базе данных и записывает текущие данные:

Удаляет старые записи:

Где delete_data_older_than_days – период в днях, за который данные сохраняются в базе. Все что старше удаляется.

Формирует HTML с графиками:

Записывает HTML файл:

Закрывает базу данных:

Отправляет данные на сайт:

Пример скрипта на PHP для приема данных и записи в файл:

SimpleHTTP.py

Если Вы по каким-то причинам не хотите использовать Apache в качестве web-сервера, достаточно запустить скрипт SimpleHTTP.py:

Перед запуском следует проверить указанную директорий DocumentRoot. Она должна существовать и совпадать с www_dir указанной в скрипте weather.py

4 комментария: Метеостанция на Raspberry Pi своими руками

Ошибка при выполнении
sudo python weather.py

Traceback (most recent call last):
File “weather.py”, line 52, in
ps = BME280()
File “/home/pi/weather/BME280.py”, line 91, in __init__
self.dig_t1 = self.read_word(BME280_DIG_T1) # Unsigned
File “/home/pi/weather/BME280.py”, line 172, in read_word
lbs = self.bus.read_byte_data(self.address, adr)
IOError: [Errno 5] Input/output error

Читайте также:  Гибкий кабель канал чертеж

А что говорит команда i2cdetect -y 1
?

Для воссоздания этой метеостанции понадобится:

Схема подключения датчика изображена на рисунке.

Дисплей WH1602 подключается как показано на рисунке. Наличие дисплея не обязательно:

Настройка I 2 C

Для включения I 2 C шины на Raspberry Pi нужно выполнить операции, описанные ниже.

Вариант #1:

Запустить настройки командой raspi-config

Зайти в меню Advanced Options->I2C

Включить I2C, позволить загрузку модуля для I2C

Вариант #2:

Редактируем файл: /etc/modprobe.d/raspi-blacklist.conf:

Закомментируйте строку blacklist i2c-bcm2708. Пример содержимого файла:

Редактируем файл: /etc/modules:

Редактируем файл: /boot/config.txt:

Устанавливаем i2c-tools утилиты

Перезагружаем Raspberry Pi:

После перезагрузки можем пересмотреть устройства подключенные к шине I 2 C:

0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — 76 —

В данном случае на шине 1 только одно устройство по адресу 0x76

Установка программного обеспечения

Устанавливаем скрипт weather.py

Качаем скрипты (у /home/pi/ будет создана директория weather и в нее закачаны необходимые файлы):

Создаем базу данных:

Настройка скрипта

Проверяем параметры:
home_dir – папка где лежит скрипт.
www_dir – папка www – сервера в которую будет записываться html файл с графиками.

Скрипт должен отработать без ошибок и сформировать файл index.htm с графиками в директории www_dir

Зайдите браузером для просмотра:

Устанавливаем запуск скрипта каждые 15 минут

Как работает скрипт

сrontab запускает скрипт каждые 15 минут (смотри файл /etc/crontab). Этот параметр можно изменить по желанию.

Далее комментарии к некоторым строкам кода.

Скрипт опрашивает датчик:

Выводит текущие данные в консоль и на дисплей:

Если хотите чтобы температура произносилась голосом установите програму espeak и разкоментируйте следующие строки:

Подключается к базе данных и записывает текущие данные:

Удаляет старые записи:

Где delete_data_older_than_days – период в днях, за который данные сохраняются в базе. Все что старше удаляется.

Формирует HTML с графиками:

Записывает HTML файл:

Закрывает базу данных:

Отправляет данные на сайт:

Пример скрипта на PHP для приема данных и записи в файл:

SimpleHTTP.py

Если Вы по каким-то причинам не хотите использовать Apache в качестве web-сервера, достаточно запустить скрипт SimpleHTTP.py:

Перед запуском следует проверить указанную директорий DocumentRoot. Она должна существовать и совпадать с www_dir указанной в скрипте weather.py

4 комментария: Метеостанция на Raspberry Pi своими руками

Ошибка при выполнении
sudo python weather.py

Читайте также:  Sw2604a схема блока питания нет запуска

Traceback (most recent call last):
File “weather.py”, line 52, in
ps = BME280()
File “/home/pi/weather/BME280.py”, line 91, in __init__
self.dig_t1 = self.read_word(BME280_DIG_T1) # Unsigned
File “/home/pi/weather/BME280.py”, line 172, in read_word
lbs = self.bus.read_byte_data(self.address, adr)
IOError: [Errno 5] Input/output error

А что говорит команда i2cdetect -y 1
?

Как известно, что ни делай под Raspberry Pi, получится либо медиаплеер, либо метеостанция. Постигла эта участь и меня — когда после очередного ливня датчик метеостанции залило, настала пора или купить новую, или сделать самому.

От метеостанции нужны были следующие функции:

  • отображение температуры
  • отображение графика атмосферного давления
  • прогноз дождя
  • синхронизация времени (в случае обычной метеостанции, по DCF77, если уж на устройстве есть часы, они должны показывать точное время)

Из покупных, по сочетанию «дизайн-цена-функции» не понравилась ни одна — либо нет одного, либо другого, либо слишком громоздко и дорого. В итоге решено было задействовать Raspberry Pi с TFT-экраном, и сделать те функции, которые нужны.

Получилось примерно так:

Подробности реализации и готовый проект под катом.

Получение данных погоды

Первое, с чем нужно было определиться — это получение данных погоды. Здесь есть 2 варианта, либо использовать свои датчики, либо брать погоду из интернета. Первое интереснее, но есть несколько «но»:

  • Сделать датчик «абы как» несложно, но сделать датчик хорошо, чтобы он например год работал от одного комплекта батареек, задача уже не столь тривиальная. Есть конечно сейчас и малопотребляющие процы, и радиомодули, но потратить на это месяц было бы лень.
  • Нужно заморачиваться с корпусом, влагозащитой и прочими мелочами (3д-принтера у меня нет).
  • Балкон выходит на солнечную сторону, так что погрешность измерения температуры в первую половину дня была бы слишком большой.

Альтернативным вариантом была покупка готового метеомодуля с датчиками для Raspberry Pi.
Увы, поиск показал что в продаже есть всего 2 варианта:

Raspberry Pi sense hat

Плата имеет «на борту» термометр, барометр, датчик влажности, гироскоп и акселерометр — но чем думали разработчики, ставя такой «экран» 8х8 светодиодов, непонятно — ничего внятного на нем вывести нельзя. Желаю разработчикам этого модуля всю жизнь UI под матрицу 8х8 писать :)

Raspberry Pi weather hat

Ничего кроме светодиодов здесь нет вообще.

В общем, как ни странно, но нормального готового шилда для метеостанции с хорошим экраном и хорошим набором датчиков так никто и не сделал. Краудсорсеры, ау — рыночная ниша пропадает :)

В итоге, не паримся и делаем по-простому — берем погоду из Интернета и выводим на обычный TFT. Как подсказал гугл, самое развитое API сейчас у https://openweathermap.org/api, его и будем использовать.

В комментариях был вопрос про точность интернет-данных. Как можно видеть в коде ниже, для вывода температуры и атмосферного давления используется запрос на получение текущих (current weather data), а не прогнозируемых данных. Их точность можно считать вполне достаточной для бытовых целей, более того, скорее всего она даже выше, чем точность уличного термометра/датчика, размещенного за окном или на балконе.

Читайте также:  Doorhan transmitter 2 pro инструкция по программированию

Регистрация

Для получения данных погоды с openweathermap нужен ключ, его можно получить бесплатно, зарегистрировавшись на вышеупомянутом сайте. Ключ выглядит примерно так «dadef5765xxxxxxxxxxxxxx6dc8». Большинство функций доступны бесплатно, платные API нам не понадобятся. Для бесплатных функций есть ограничение на 60 запросов в минуту, нам этого достаточно.

Чтение данных

Чтение данных весьма просто благодаря библиотеке pyowm.

Получение погоды на данный момент (Python):

Получение прогноза погоды для отображения осадков:

На выходе получаем массив данных со списком дождей и их интенсивностью. Несмотря на название функции three_hours_forecast_at_coords, дожди прописаны на 2-3 дня вперед.

Можно использовать GET-запросы напрямую, например так. Это может пригодиться, например при портировании кода на MicroPython под ESP.

Получение координат пользователя

Как можно видеть выше, для получения данных нужны широта и долгота. Получение координат также весьма просто, и делается в 3 строчки кода:

Собственно, самая сложная часть. На Raspberry Pi используется TFT-дисплей от Adafruit, поддерживающий систему команд ILI9340. Библиотеки под него найти несложно, однако отлаживать код на Raspberry Pi не очень удобно. В итоге было принято решение написать высокоуровневый набор контролов, которых нужно было всего 3 — изображения, текст и линии. При запуске на Raspberry Pi контрол будет рисовать себя на TFT, при запуске на десктопе будет использоваться встроенная в Python библиотека tkinter. В итоге, код будет работать везде — и на Raspberry Pi, и на Windows, и на OSX.

Код одного контрола выглядит примерно так:

Класс «FakeTFT» создает обычное окно программы:

Класс «LCDTFT» использует «настоящий» дисплей (фрагмент кода):

При инициализации автоматически выбирается нужный дисплей, в зависимости от того, где запускается программа:

Все это позволяет полностью абстрагироваться от «железа», и писать код типа такого:

Собственно UI выглядит так:

На экране отображаются текущая температура, график атмосферного давления за сегодняшний день (в следующей версии будет добавлен график температуры), также в случае прогноза дождя, его время отмечается на графике вертикальной синей чертой (на данной картинке дождей нет). Также выводятся время последнего обновления данных и IP-адрес, если понадобится подключиться к устройству.

Желающие ознакомиться с исходником подробнее, могут посмотреть его на guthub.

Установка на Raspberry Pi

Для тех, кто не хочет заморачиваться описанным выше, короткая инструкция по установке под спойлером.

— Если не установлен Python3, ставим:
sudo apt-get install python3

— Ставим дополнительные библиотеки (они нужны для работы с дисплеем):
sudo pip3 install numpy pillow spidev

— Добавляем в автозапуск (sudo nano /etc/rc.local)

Если все работает, то перезагружаемся (sudo reboot) и пользуемся.

В плане добавить еще что-нибудь полезное, например отображение карты облачности, API на openweathermap для этого есть.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *