Часы метеостанция на Arduino

Шаг 7: Код передатчика

Часы метеостанция на Arduino

Прежде всего, нам необходимо скачать библиотеку RF24, чтобы облегчить нашу жизнь при работе с беспроводными модулями NRF24L01. Нам также нужна библиотека DHT для датчика DHT22.

Библиотека NRF24L01:

Библиотека DHT22:

Давайте сначала посмотрим код передатчика. Он отправляет простую структуру данных, которая содержит два числа: температуру и влажность.

Чтобы установить канал связи, мы должны создать «трубу» между двумя модулями. Эта труба должна иметь адрес. Оба модуля должны писать и читать из одного канала, чтобы общаться. Это первое, что мы определяем в нашем коде, мы устанавливаем адрес канала равным «0». Далее мы определяем канал, по которому мы хотим общаться с другим модулем. Чип NRF24L01 поддерживает 126 различных каналов. Оба модуля должны использовать один и тот же канал для связи друг с другом. В этом примере я использую канал 115. Далее я определяю, что хочу использовать максимальную мощность передачи, которую предлагает модуль. Он использует больше энергии, но расширяет диапазон связи. Далее мы определяем скорость передачи данных. Я установил его на 250 Кбит / с, что является самой низкой из возможных скоростей передачи данных для достижения лучшего диапазона. Следующим шагом является открытие канала для последующей записи в него.

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

ЧАСЫ-МЕТЕОСТАНЦИЯ НА ARDUINO

• 28.01.19 meteoClock_v1.3: исправлено предсказание погоды (работало “наоборот”) • 19.04.19 meteoClock_v1.5: добавлено управление яркостью подсветки и светодиода по датчику света. Смотрите последнюю схему!

Рекомендую ознакомиться с модифицированной прошивкой от Norovl, в ней полностью переработан интерфейс, русифицированы дни недели и добавлено меню на русском языке. Почитать и скачать можно на GitHub автора .

Решил таки сделать свою версию метеостанции-часов-календаря на Arduino с кучей датчиков и различными крутыми штуками! Проект уместился в корпусе G909G из магазина Чип и Дип, питается от micro-USB и выглядит весьма неколхозно! =)

  • Большой дешёвый LCD дисплей
  • Вывод на дисплей:
    • Большие часы
    • Дата
    • Температура воздуха
    • Влажность воздуха
    • Атмосферное давление (в мм.рт.ст.)
    • Углекислый газ (в ppm)
    • Прогноз осадков на основе изменения давления
  • Построение графиков показаний с датчиков за час и сутки
  • Индикация уровня CO2 трёхцветным светодиодом (общий анод/общий катод, настраивается в прошивке)
  • Переключение режимов сенсорной кнопкой

Версия 1.5 – Добавлено управление яркостью – Яркость дисплея и светодиода СО2 меняется на максимальную и минимальную в зависимости от сигнала с фоторезистора Подключите датчик (фоторезистор) по схеме. Теперь на экране отладки справа на второй строчке появится величина сигнала с фоторезистора. Пределы яркости устанавливаются в настройках прошивки.

ПРОШИВКА И НАСТРОЙКА

Загружать прошивку желательно до подключения компонентов, чтобы убедиться в том, что плата рабочая. После сборки можно прошить ещё раз, плата должна спокойно прошиться. В проектах с мощными потребителями в цепи питания платы 5V (адресная светодиодная лента, сервоприводы, моторы и проч.) необходимо подать на схему внешнее питание 5V перед подключением Arduino к компьютеру, потому что USB не обеспечит нужный ток, если например лента его потребует. Это может привести к выгоранию защитного диода на плате Arduino. Гайд по скачиванию и загрузке прошивки можно найти под спойлером на следующей строчке.

ИНСТРУКЦИЯ ПО ЗАГРУЗКЕ ПРОШИВКИ

1. Если это ваше первое знакомство с Arduino, внимательно изучите гайд для новичков и установите необходимые для загрузки прошивки программы.

2. Скачайте архив со страницы проекта. Если вы зашли с GitHub – кликните справа вверху Clone or download, затем Download ZIP. Это тот же самый архив!

3. Извлеките архив. Содержимое папки libraries перетащите в пустое место папки с библиотеками Arduino C:/Program Files (x86)/Arduino/libraries/

4. Папку с прошивкой из firmware положите по пути без русских букв . Если в папке с прошивкой несколько файлов – это вкладки, они откроются автоматически.

5. Настройте прошивку (если нужно), выберите свою плату, процессор. Подключите Arduino к компьютеру, выберите её COM порт и нажмите загрузить.

6. При возникновении ошибок или красного текста в логе обратитесь к 5-ому пункту гайда для новичков – “Разбор ошибок загрузки и компиляции“.

Содержимое папок в архиве

  • libraries – библиотеки проекта. Заменить имеющиеся версии
  • firmware – прошивки для Arduino
  • schemes – схемы подключения компонентов

Как показал эксперимент, снаружи корпуса датчик температуры показывает на 0.5 градуса меньше, чем внутри! Нужно более удачно компоновать электронику, отводить и экранировать тепло от греющихся элементов…

Если дисплей показывает слишком тускло/на белом фоне На плате драйвера дисплея (к которой подключаются провода) есть крутилка контрастности, с её помощью можно подстроить контраст на нужный. Также контрастность зависит от угла взгляда на дисплей (это же LCD) и можно настроить дисплей на чёткое отображение даже под углом “дисплей на уровне пупка, смотрим сверху”. А ещё контрастность сильно зависит от питания: от 5V дисплей показывает максимально чётко и ярко, тогда как при питании от USB через Arduino напряжение будет около 4.5V (часть падает на защитном диоде по линии USB), и дисплей показывает уже не так ярко. Вывод настраивайте крутилкой при внешнем питании от 5V!

Если датчик CO2 работает некорректно (инфа от Евгения Иванова) Ну там в папке библиотеки сенсора в examples есть скетчи для калибровки. также ее можно запустить втупую замкнув на землю разъем “HD” на 7+ секунд. Само собой вот прямо на улице на морозе этим заниматься не обязательно… можно просто в бутылку набрать свежего воздуха с датчиком внутри и запечатать. калибровка проводится минимум 20 минут.. По-умолчанию датчик поставляется с включенной автокалибровкой, которая происходит каждый день, и если датчик используется в невентелируемом помещении, то эта калибровка быстро уводит значения от нормы за горизонт, потому ее нужно обязательно отключать. Документация.

Автокалибровка датчика CO2 отключена в скетче!

Если у вас не работает датчик BME280, скорее всего у него отличается адрес. В проекте используется библиотека Adafruit_BME280, у которой нет отдельной функции смены адреса, поэтому адрес задаётся вручную в файле библиотеки Adafruit_BME280.h почти в самом начале файла (лежит в папке Adafruit_BME280 в вашей папке библиотек, вы должны были её туда установить), у моего модуля был адрес 0x76. Как узнать адрес своего модуля BME280? Есть специальный скетч, называется i2c scanner. Его можно нагуглить, можно скачать с моего FTP. Прошиваете данный скетч, открываете порт и получаете список адресов подключенных к шине i2c устройств. Чтобы остальные модули вам не мешали – можно их отключить и оставить только BME280. Полученный адрес указываем в библиотеке, сохраняем файл и загружаем прошивку метео-часов. Всё!

Популярные статьи  Из сломанного зарядника: Мини преобразователь с 1,5 В до 220 В

Если отстают часы, проблема скорее всего в питании схемы. Если при смене блока питания на более качественный проблема не уходит, повесьте конденсатор по питанию RTC модуля (прям на плату на VCC и GND паять): обязательно керамический, 0.1-1 мкФ (маркировка 103 или 104, смотрите таблицу маркировок). Также можно поставить электролит (6.3V, 47-100 мкФ)

Пояснения к коду

  • Очень часто бывает полезно обмениваться данными, например, с компьютером. В частности, для отладки работы устройства: можно, например, смотреть, какие значения принимают переменные.
  • В данном эксперименте мы знакомимся со стандартным объектом , который предназначен для работы с последовательным портом (UART) Arduino, и его методами (функциями, созданными для работы с данным объектом) , и , которые вызываются после точки, идущей за именем объекта:
    • чтобы обмениваться данными, нужно начать соединение, поэтому вызывается в

    • отправляет содержимое . Если мы хотим отправить текст, можно просто заключить его в пару двойных кавычек: . Кириллица, скорее всего, будет отображаться некорректно.
    • делает то же самое, только добавляет в конце невидимый символ новой строки.
  • В и можно использовать второй необязательный параметр: выбор системы счисления, в которой выводить число (это может быть , , , для десятичной, двоичной, шестнадцатеричной и восьмеричной систем счисления соответственно) или количество знаков после запятой для дробных чисел.

Например,

Serial.println(18,BIN);
Serial.print(3.14159,3);

в мониторе порта даст результат

10010
3.142
  • Монитор порта, входящий в Arduino IDE, открывается через меню Сервис или сочетанием клавиш Ctrl+Shift+M. Следите за тем, чтобы в мониторе и в скетче была указана одинаковая скорость обмена данными, . Скорости 9600 бит в секунду обычно достаточно. Другие стандартные значения можете посмотреть в выпадающем меню справа внизу окна монитора порта.
  • Вам не удастся использовать цифровые порты 0 и 1 одновременно с передачей данных по последовательному порту, потому что по ним также идет передача данных, как и через USB-порт платы.
  • При запуске монитора порта скетч в микроконтроллере перезагружается и начинает работать с начала. Это удобно, если вам нельзя упустить какие-то данные, которые начинаю передаваться сразу же. Но в других ситуациях это может мешать, помните об этом нюансе!
  • Если вы хотите читать какие-то данные в реальном времени, не забывайте делать хотя бы на 100 миллисекунд, иначе бегущие числа в мониторе будет невозможно разобрать. Вы можете отправлять данные и без задержки, а затем, к примеру, скопировать их для обработки в стороннем приложении.
  • Последовательность выводится как символ табуляции (8 пробелов с выравниванием). Также вы можете использовать, например, последовательность для перевода строки. Если вы хотите использовать обратный слеш, его нужно экранировать вторым таким же: .

Шаг 8: Код получателя

Часы метеостанция на Arduino

Давайте теперь посмотрим код получателя. Нам нужно 4 библиотеки.

Сначала мы должны загрузить библиотеку для отображения по этой ссылке:

Библиотека DISPLAY:

После загрузки библиотеки вы должны открыть строку 13 комментария файла User_Setup.h и строку 14 комментария, потому что на нашем дисплее используется драйвер HX8357C. Теперь мы можем продолжить работу с 3 другими библиотеками. Нам нужна одна библиотека для часов реального времени, одна для датчика DHT22 и, наконец, одна для беспроводного модуля.

NRF24L01:

DHT22:

DS3231:

Давайте посмотрим на код. Первое, что нам нужно сделать, это установить время для модуля часов реального времени, если он еще не установлен. Для этого введите текущую дату и время в функции setRTCTime, раскомментируйте вызов setRTCTime функции в строке 54 и загрузите программу в Arduino. Сейчас время установлено. Но затем мы должны еще раз прокомментировать вызов функции setRTCTime и снова загрузить программу в Arduino.

Код получателя работает следующим образом. В функции настройки мы инициализируем все датчики и модули и печатаем пользовательский интерфейс. Затем в функции петли мы постоянно проверяем новые беспроводные данные. Если есть новые данные, мы сохраняем эти данные в переменных и печатаем их на дисплее. Мы читаем температуру и влажность один раз в минуту, и мы обновляем данные только в случае изменения значений. Таким образом мы еще больше уменьшаем мерцание дисплея! Я также подготовил версию кода с температурой, отображаемой в градусах Фаренгейта. Вы можете найти обе версии кода, прилагаемые к этой инструкции.

Версия №1. RF433МГц сервер Arduino Uno + Zyxel Keenetic

Метеосенсор с передатчиком на 433МГц

Компоненты:

  • Arduino Pro Mini 3.3 — $4
  • Датчик температуры и влажности DHT22 — $4
  • Датчик давления (а также температуры и высоты) BMP085 -$5.6
  • Датчик освещенности BH1750 (довольно бесполезный из за фонаря под окнами) — $2.2
  • Делитель между +, землей и аналоговым входом для измерения напряжения батареи
  • Передатчик RF 433МГц (продается в комплекте с приемником) — $1.22/2
  • Коробочка водонепроницаемая  купленной в ближайшем радиомагазине — 300 руб

Сервер с приемо-/передатчиком 433МГц, подключенный к Zyxel Keenetic через USB

Компоненты:

  • Arduino Uno с USB кабелем — 9$
  • Приемник и передатчик RF 433МГц  — $1.22
  • Блок питания — 5В зарядник от старого телефона
  • Коробочка бытовая в качестве корпуса

Табло со светодиодным дисплеем, приемником 433МГц  и модулем DS1307

Компоненты:

  • Дисплей матричный светодиодный трехцветный 16×32 ~ $35 с доставкой
  • Arduino Uno с USB кабелем — 9$
  • Приемник  RF 433МГц  — $1.22/2
  • Модуль с часами реального времени DS1307 — $1.1
  • Блок питания 5В 5А ~ $8

Часы отображающие точное время и погоду с дисплеем 1602

Слеплены за вечер для контроля работы погодной станции и тестирования переходника I2C для дисплея 1602

Компоненты:

  • Arduino Pro Mini — $2.6
  • Приемник  RF 433МГц  — $1.22/2
  • Дисплей 1602 с голубой подсветкой — $2.25
  • Плата интерфейса I2C/TWI/SPI для дисплея 1602 — $1.74
  • Коробочка — $2.5

Станция в таком виде прожила дома около года. За это время накопились проблемы:

  • Дешевые 433МГц приемо-передатчики имеют низкую помехозащищенность, сильно зависят от положения антенн, открытых/закрытых дверей и т.д. что сказывается на общем качестве системы. При добавлении новых устройств 433МГц проблем добавлялось.
  • Уличный датчик на аккумуляторах  на Arduino Pro Mini 3.3 с демонтированным светодиодом питания в летнее время работает 2-3 месяца (с использованием режима сна). Нынешней зимой при температуре ниже -30С батареи просто садились до нуля. Следующую версию метеосенсора запитал от сети, благо недалеко было тянуть.
  • Часы на DS1307 китайского производства убегали безбожно и применение их без подстройки от интернета или GPS весьма сомнительно. Применение с синхронизацией тоже сомнительно, так как на внутренних часах Arduino все неплохо.
  • Сервер Arduino Uno, подключенный к Zyxel Keenetic по USB работал неплохо, но программы, написанные на SH периодически подвисали, думаю, в связи с нехваткой памяти. Поддержка кода одновременно со стороны роутера и микроконтроллера напрягала. Решил отказаться в пользу Ethernet на Arduino.
  • Внешний вид информации, отображаемый на табло приелся и был не очень эргономичен. Например, показатель влажности в зимнее время очень условно и весьма неинформативно.

В общем подошло время модернизации системы с учетом  предыдущего опыта

Шаг 2: Датчик температуры и влажности DHT22

Для измерения температуры используются разные датчики. Популярностью пользуются DHT22, DHT11, SHT1x

Я объясню, чем они отличаются друг от друга, и почему я использовал именно DHT22.

Датчик AM2302 использует цифровой сигнал. Этот датчик работает на уникальной системе кодировки и сенсорной технологии, поэтому его данные надежны. Его сенсорный элемент соединен с 8-битным однокристальным компьютером.

Каждый сенсор этой модели термокомпенсированный и точно откалиброванный, коэффициент калибровки находится в однократно программируемой памяти (ОТР-память). При чтении показаний сенсор будет вызывать коэффициент из памяти.

Популярные статьи  Сарафана с воротником для куклы

Маленький размер, низкое потребление энергии, большое расстояние передачи (100 м) позволяют AM2302 подходить почти ко всем приложениям, а 4 выхода в один ряд делают монтаж очень простым.

Давайте рассмотрим плюсы и минусы трех моделей датчиков.

DHT11

Плюсы: не требует пайки, самый дешевый из трех моделей, быстрый стабильный сигнал, дальность свыше 20 м, сильная интерференция.
Минусы: Библиотека! Нет вариантов разрешения, погрешность измерений температуры +/- 2°С, погрешность измерений уровня относительной влажности +/- 5%, неадекватный диапазон измеряемых температур (0-50°С).
Области применения: садоводство, сельское хозяйство.

DHT22

Плюсы: не требует пайки, невысокая стоимость, сглаженные кривые, малые погрешности измерений, большой диапазон измерений, дальность больше 20 м, сильная интерференция.
Минусы: чувствительность могла быть выше, медленное отслеживание температурных изменений, нужна библиотека.
Области применения: изучение окружающей среды.

SHT1x

Плюсы: не требует пайки, сглаженные кривые, малые погрешности измерений, быстрое срабатывание, низкое потребление энергии, автоматический режим сна, высокая стабильность и согласованность данных.
Минусы: два цифровых интерфейса, погрешность в измерении уровня влажности, диапазон измеряемых температур 0-50°С, нужна библиотека.
Области применения: эксплуатация в суровых условиях и в долгосрочных установках. Все три датчика относительно недорогие.

Соединение

  • Vcc – 5В или 3,3В
  • Gnd – с Gnd
  • Data – на второй вывод Arduino

Виды датчиков

Для измерения параметров среды часто применяют три вида сенсоров:

  • DHT11;
  • DHT22;
  • SHT1x.

Плюс первого — дешевизна, скорость работы и стабильность сигнала. Из минусов отметим сравнительно слабую программную реализацию библиотеки, высокую погрешность выполняемых измерений и не всегда подходящий диапазон рабочих температур. DHT22 выгодно отличается благодаря:

  • малым погрешностям;
  • высокой дальности сигнала;
  • поддержке дробных значений.

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

Датчики линейки SHT1x быстро срабатывают, имеют весьма низкую погрешность, экономичны и умеют «засыпать» при долгой неактивности. Из недостатков выделим:

  • два цифровых интерфейса;
  • невозможность работы без подключения программной библиотеки и диапазон от 0 до 50 градусов — как в других образцах. Его хватает не всегда.

По стоимости все три варианта примерно одинаковы. Для «домашних» установок чаще берут DHT11-22 за их сравнительную простоту в эксплуатации и настройке.

Подключение Bluetooth

А теперь самое интересное. «Насаживаем» наши шилды с bt-модулем на нашу Arduino:

Часы метеостанция на Arduino

Master-устройство будет подключаться к Slave-устройству, которое будет ждать входящего подключения. На одной из плат устанавливаем переключатель в H, это и будет наш master. На другой плате — в L, это будет slave.

Часы метеостанция на Arduino

Прикрепив модули к Arduino можно начинать настройку. Для настройки master-a нужно будет послать некоторый набор команд в bt-модуль, будем делать это с помощью Serial Monitor (Ctrl+Shift+M). При обмене сообщениями рекомендуется выставить Baud rate -> 38400 & «Both NL&CR».

Послав команду «AT» и нажав отправить, мы ожидаем ответ «OK». Если это так — плата подключена правильно, можно продолжать. Если нет — стоит вернуться на пару шагов назад и проверить корректность подключения bluetooth-модуля.

Несколько важных АТ-команд, которые нам могу пригодиться:

AT — просто вернет «OK», значит всё в порядке
AT+NAME? — вернет имя модуля. Мы также можем задать своё имя, послав, например, AT+NAME=WEATHER_MONITOR
AT+ROLE? — одна из ключевых команд, вернет роль устройства, master/slave. Задать значение можно с помощью AT+ROLE=0 — перевести в режим slave, либо AT+ROLE=1 — режим master.
AT+PSWD? — вернёт пин-код, используемый для подключения.
AT+ADDR? — вернёт адрес устройства, например «14:2:110007». Стоит заметить, что при использовании адреса в посылаемых AT-командах двоеточия «:» нужно заменять запятыми «,», т.о. «14:2:110007» -> «14,2,110007».

Настройка Master’a

Этап первый. Конфигурация.

  1. Посылаем AT+ORGL, тем самым возвращая модуль к его изначальной конфигурации
  2. Имя модуля можно изменить, послав AT+NAME=myname.
  3. AT+RMAAD — удаляем информацию о предыдущих «спариваниях».
  4. AT+PSWD=1234 — устанавливаем пароль
  5. AT+ROLE=1 — говорим устройству, что оно будет работать в master режиме.
  6. AT+CMODE=1 — говорим устройству, что оно будет подключаться к любым адресам.

Этап второй. Подключение.

  1. Отправляем команду AT, чтобы удостовериться, что модуль подключен и готов к работе.
  2. AT+INIT — инициализация. Если в ответ получаем ERROR(17) — ничего страшного, значит команда инициализации уже посылалась, продолжаем работу.
  3. AT+INQ — начинаем поиск доступных BT-устройств, ответ будет содержать список из адресов
  4. AT+LINK=<адрес> — тут происходит непосредственно подключение к slave-устройству. Команда на подключение может, например, выглядеть так: AT+LINK=14,2,110007.

После выполнения последней команды диоды начнут мигать с меньшей частотой, что говорит об успешном подключении.

Метеостанция на Arduino с беспроводным датчиком температуры

Как-то прогуливаясь по городу увидел новый открывшийся магазин радиоэлектроники. Зайдя в него обнаружил большое количество шилдов для Ардуины т.к. у меня дома была Arduino Uno и Arduino Nano сразу пришла мысль поиграться с передатчиками сигнала на расстоянии. Решил купить самый дешевый передатчик и приемник на 433 МГц:

Записав простейший скетч передачи данных (пример взят от сюда), выяснилось, что передающие устройства могут вполне подойти для передачи простейших данных, таких как температура, влажность.

Передатчик имеет следующие характеристики: 1. Модель: MX -FS — 03V 2. Радиус действия (зависит от наличия преграждающих предметов): 20-200 метров 3. Рабочее напряжение: 3.5 -12В 4. Размеры модуля : 19 * 19 мм 5. Модуляция сигнала : AM 6. Мощность передатчика: 10 мВт 7. Частота: 433 МГц 8. Необходимая длина внешней антенны : 25см 9. Простота подключения (всего три провода): DATA ; VCC ; земля.

Характеристики приемного модуля: 1. Рабочее напряжение: DC 5В 2. Ток: 4мA 3. Рабочая частота: 433,92 МГц 4. Чувствительность : — 105дБ 5. Размеры модуля : 30 * 14 * 7 мм 6. Небходима внешняя антенна: 32 см.

В просторах интернета сказано, что дальность передачи информации на 2Кб/сек может доходить до 150м. Сам не проверял, но в двухкомнатной квартире принимает везде.

Аппаратная часть домашней метеостанции

После нескольких экспериментов решил подключить к Arduino Nano датчик температуры, влажности и передатчик.

Часы метеостанция на Arduino

Датчик температуры DS18D20 подключается к ардуино следующим образом:

1) GND к минусу микроконтроллера. 2) DQ через подтягивающий резистор к земле и к выводу D2 Ардуины 3) Vdd к +5В.

Более детально почитать о работе датчика можно здесь.

Модуль передатчика MX -FS — 03V питается от 5 Вольт, вывод данных (ADATA) подключен к выводу D13.

К Ардуино Уно подключил LCD дисплей и барометр BMP085.

Часы метеостанция на Arduino

Приемник сигнала подключен к выводу D10.

Модуль BMP085 — цифровой датчик атмосферного давления. Датчик позволяет измерять температуру,давление и высоту над уровнем моря. Интерфейс подключения: I2C. Напряжение питания датчика 1.8-3.6 В

Подключается модуль к Arduino также, как и другие I2C устройства:

  • VCC — VCC (3,3 В);
  • GND — GND;
  • SCL — к аналоговому выводу 5;
  • SDA — к аналоговому выводу 4.
  • Очень низкая стоимость
  • Питание и I/O 3-5 В
  • Определение влажности 20-80% с 5% точностью
  • Определение температуры 0-50 град. с 2% точностью
  • Частота опроса не более 1 Гц (не более раза в 1 сек.)
  • Размеры 15.5мм x 12мм x 5.5мм
  • 4 вывода с расстоянием между ножками 0.1″
  1. Vcc (3-5V питание)
  2. Data out — Вывод данных
  3. Не используется
  4. Общий

Подключается к D8 Ардуины.

Программная часть домашней метеостанции

Передающий модуль измеряет и передает температуру раз в 10 минут.

Приемное устройство принимает данные, измеряет давление и температуру в помещении и передает на дисплей.

Источник

Шаг 3: Датчик давления BMP180

BMP180 – барометрический датчик атмосферного давления с I2C-интерфейсом.
Барометрические датчики атмосферного давления измеряют абсолютное значение окружающего воздуха. Этот показатель зависит от конкретных погодных условий и от высоты над уровнем моря.

Популярные статьи  Ламповый усилитель звука своими руками

У модуля BMP180 имелся 3,3В стабилизатор на 662кОм, который я, по собственной глупости, случайно взорвал. Пришлось делать обводку питания напрямую к чипу.

Из-за отсутствия стабилизатора, я ограничен в выборе источника питания – напряжение выше 3,3В разрушит датчик.
У других моделей может не быть стабилизатора, обязательно проверяйте его наличие.

Схема соединения датчика и шины I2C с Arduino (nano или uno)

  • SDA — A4
  • SCL — A5
  • VCC — 3.3V
  • GND – GND

Давайте немного поговорим о давлении, и его связи с температурой и высотой.

Атмосферное давление в любой точке непостоянно. Сложное взаимодействие между вращением Земли, наклоном Земной оси, приводит к появлению множества областей высокого и низкого давления, что, в свою очередь, приводит к ежедневной смене погодных условий. Наблюдая за изменением давления, вы можете сделать краткосрочный прогноз погоды.

Например, падение давления обычно означает дождливую погоду или приближение грозы (приближение области низкого давления, циклона). Поднимающееся давление обычно означает сухую ясную погоду (над вами проходит область высокого давления, антициклон).

Атмосферное давление также изменяется с высотой. Абсолютное давление в базовом лагере на Эвересте (5400 м над уровнем моря) ниже, чем абсолютное давление в Дели (216 м над уровнем моря).

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

Измерение высоты

Среднее давление на уровне моря 1013,25 ГПа (или миллибар). Если подняться над атмосферой, это значение упадет до нуля. Кривая этого падения вполне понятна, поэтому вы можете сами вычислить высоту над уровнем моря, используя следующее уравнение: alti=44330*

Если вы примите давление на уровне моря 1013,25 Гпа как р0, решением уравнения будет ваша текущая высота над уровнем моря.

Меры предосторожности

Не забывайте, что датчику BMP180 нужен доступ к окружающей атмосфере, чтобы иметь возможность считывать давление воздуха, не помещайте датчик в закрытый корпус. Небольшого вентиляционного отверстия будет вполне достаточно. Но и слишком открытым его не оставляйте – ветер будет сбивать показания давления и высоты. Продумайте защиту от ветра.

Защитите от нагревания. Для измерения давления необходимы точные температурные показания. Постарайтесь защитить датчик от перепадов температуры и не оставляйте его вблизи источников высоких температур.

Защитите от влаги. Датчик BMP180 чувствителен к уровню влажности, постарайтесь предотвратить возможное попадание воды на датчик.

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

Ардуино. Метеостанция на LCD 1602 и DHT11

Часы метеостанция на Arduino
Ардуино. Метеостанция с дисплеем LCD 1602 и DHT22

После сборки схемы, загрузите в микроконтроллер следующий скетч (здесь ссылка на скачивание архива со скетчем для метеостанции и необходимыми библиотеками). Информация с датчика DHT22 выводиться будет на монитор порта Arduino IDE и на жидкокристаллический дисплей 1602a, для отображения информации использован русский шрифт для LCD и символы (в скетче есть подробные комментарии).

Скетч для метеостанции с DHT11 на Ардуино

#include <Wire.h>                 // библиотека для протокола IIC 
#include <LiquidCrystal_I2C.h>    // подключаем библиотеку LCD IIC
LiquidCrystal_I2C lcd(0x27,20,2); // присваиваем имя lcd для дисплея

#include "DHT.h"   // подключаем библиотеку для DHT11
DHT dht(2, DHT11); // к какому порту подключаем датчик

// создаем символ градуса и присваиваем имя "gradus"
byte gradus = {
0b01100,0b10010,0b10010,0b01100,0b00000,0b00000,0b00000,0b00000
};

// создаем русскую букву "П"
byte P = {
0b11111,0b10001,0b10001,0b10001,0b10001,0b10001,0b10001,0b00000
};

// создаем русскую букву "У"
byte Y = {
0b10001,0b10001,0b10001,0b01111,0b00001,0b00001,0b01110,0b00000
};

// создаем русскую букву "Л"
byte L = {
0b00111,0b01001,0b10001,0b10001,0b10001,0b10001,0b10001,0b00000
};

// создаем русскую букву "Ж"
byte ZH = {
0b10101,0b10101,0b10101,0b01110,0b10101,0b10101,0b10101,0b00000
};

// создаем русскую букву "Ь"
byte znak = {
0b10000,0b10000,0b10000,0b11110,0b10001,0b10001,0b11110,0b00000
};

void setup() {
  Serial.begin(9600); // запуск последовательного порта
  lcd.init();         // инициализация LCD дисплея
  lcd.backlight();    // включение подсветки дисплея

  lcd.createChar(1, gradus);
  lcd.createChar(2, P);
  lcd.createChar(3, Y);
  lcd.createChar(4, L);
  lcd.createChar(5, ZH);
  lcd.createChar(6, znak);
}

void loop() {
  // если нужны точные значение, то используйте float, вместо byte
  byte h = dht.readHumidity();    // считываем значение температуры
  byte t = dht.readTemperature(); // считываем значение влажности

  Serial.print("Temperature: ");
  Serial.println(t);   // отправляем значение температуры на монитор

  Serial.print("Humidity: ");
  Serial.println(h);   // отправляем значение температуры на монитор

  Serial.println(" "); // пустая строка

  lcd.setCursor(0,0);  // ставим курсор на 1 символ первой строки
  lcd.print("TEM");    // используем латинские буквы
  lcd.print(char(2));  // выводим русскую букву "П"
  lcd.print("EPAT");   // используем латинские буквы
  lcd.print(char(3));  // выводим русскую букву "У"
  lcd.print("PA: ");   // используем латинские буквы
  lcd.print(t);        // выводим значение температуры на LCD
  lcd.print(char(1));  // выводим знак градуса

  lcd.setCursor(2,1);  // ставим курсор на 3 символ второй строки
  lcd.print("B");      // используем латинские буквы
  lcd.print(char(4));  // выводим русскую букву "Л"
  lcd.print("A");      // используем латинские буквы
  lcd.print(char(5));  // выводим русскую букву "Ж"
  lcd.print("HOCT");   // используем латинские буквы
  lcd.print(char(6));  // выводим русскую букву "Ь"
  lcd.print(": ");     // используем латинские буквы
  lcd.print(h);        // выводим значение влажности на LCD
  lcd.print("%");      // выводим знак процент
  
  delay(1000);
}

Пояснения к коду:

  1. в скетче можно использовать до 8 русских букв и символов, при необходимости заменяйте буквы из кириллицы — латинскими буквами;
  2. скорость обновления данных замените на необходимое значение.

Заключение. Мы рассмотрели, как сделать простую домашнюю метеостанцию на Ардуино c дисплеем 1602а и датчиком температуры и влажности воздуха DHT11. Данный проект можно доработать, добавив к схеме еще больше датчиков для анализа метеоусловий. Также можно сделать беспроводную метеостанцию на Arduino Uno, используя блютуз или радио модули для передачи информации на расстояние.

Программа

Программа передатчика

Сперва рассмотрим программу передающей части:

Для передачи влажности и температуры в одном сообщении я соединяю их вместе. Сначала данные считываются в переменную как целые числа, потом целые числа преобразовываются в массив символов, а затем они соединяются друг с другом. На приемной стороне данные будут разделены на отдельные символы. Делая это, я ограничиваю себя двумя цифрами градусов. Если датчик находится в среде с температурой менее 10°C, я буду получать на дисплее символы мусора. Например, если температура составляет 20°C, а влажность – 45%, то будет передаваться сообщение 2045, и всё хорошо. Если температура равна 9°C, а влажность – 78%, то передастся сообщение 978x, где «x» – случайный символ. Поэтому, если вы будете собирать данный беспроводной термометр, я советую вам изменить программу для передачи правильных данных, когда температура будет меньше 10°C.

Программа приемника

Интересный способ использования библиотеки LiquidCrystal – это создание пользовательских символов. С помощью я создал символ градусов. Таким же способом вы можете создать и свои собственные символы. Чтобы создать пользовательский символ или значок, вам необходимо объявить его, как массив из восьми байт, и «нарисовать», какие пиксели будут включены (1 – включен, 0 – выключен).

В функции вы создаете его с помощью . принимает два аргумента: номер позиции для хранения символа и массив байт, в котором определено, какие пиксели будут отображаться. В нашем случае это . Затем символ выводится на LCD с помощью функции .

Оцените статью
( Пока оценок нет )
Добавить комментарий