Беспроводная метеостанция на Arduino


В данной статье мы рассмотрим создание беспроводной метеостанции на основе платы Arduino. Наружная температура и влажность в нашем проекте будут измеряться с помощью датчика DHT22, затем эти данные будут передаваться по беспроводной сети на внутренний блок с помощью модулей приемопередатчика NRF24L01. Во внутреннем блоке также имеется еще один датчик DHT22 для измерения температуры и влажности в помещении, а также модуль часов реального времени DS3231, который может отслеживать время, даже если Arduino теряет питание. Все эти данные будут выводиться на экране 0,96-дюймового OLED-дисплея.

Беспроводная метеостанция на Arduino

В собранном виде начинка внутреннего и внешнего модуля нашей метеостанции будет выглядеть следующим образом:

Электронная начинка внутреннего и внешнего модуля нашей метеостанции

Также на нашем сайте вы можете посмотреть аналогичные проекты измерения температуры и влажности на основе платы Arduino:

Необходимые компоненты

  1. Плата Arduino Nano (купить на AliExpress).
  2. Модуль nRF24L01 (купить на AliExpress).
  3. Датчик температуры и влажности DHT22 (купить на AliExpress).
  4. Модуль OLED дисплея SSD1306 128×64 с диагональю 0.96 дюйма и интерфейсом I2C (купить на AliExpress).

Схема проекта

Принципиальная схема беспроводной метеостанции на основе платы Arduino представлена на следующем рисунке.

Принципиальная схема беспроводной метеостанции на основе платы Arduino

И модуль часов реального времени, и OLED-дисплей используют протокол I2C для связи с Arduino, поэтому они подключаются к контактам I2C или аналоговым контактам под номерами 4 и 5 на плате Arduino Nano. Рядом с модулем приемопередатчика NRF24L01 находится конденсатор, обеспечивающий более стабильное питание. Для правильной работы датчика к контакту данных DHT22 также подключен подтягивающий резистор.

Что касается источника питания, я использовал адаптер питания постоянного тока на 12 В для внутреннего блока, а с другой стороны, для питания наружного блока я использовал две литий-ионные батареи напряжением около 7,5 В. При такой конфигурации наружный блок может работать около 10 дней, прежде чем батареи разрядятся, поскольку мы периодически передаем данные, а тем временем переводим Arduino в спящий режим, в котором потребляемая мощность составляет всего около 7 мА.

Чтобы лучше понять принцип работы данной схемы рекомендуем ознакомиться со следующими статьями на нашем сайте:

Печатная плата для метеостанции

Чтобы сохранить порядок в электронных компонентах, в соответствии с принципиальной схемой я разработал специальную печатную плату с помощью бесплатного онлайн-программного обеспечения для проектирования схем EasyEDA (на нашем сайте мы делали обзор возможностей редактора EasyEDA и рассматривали проектирование электронных схем с его помощью). Отметим, что одна и та же плата может использоваться как для внутреннего, так и для наружного блока, только плата Arduino должна быть запрограммирована по-разному.

Дизайн печатной платы для радиостанции

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

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

Сборка метеостанции

Я начал сборку электронных компонентов этого проекта с припаивания разъемов к печатной плате. Таким образом, мы можем легко подключать и отключать компоненты при необходимости.

Припаивание разъемов к печатной плате

Затем я также вставил и припаял конденсатор и подтягивающий резистор. После завершения этого шага мы можем просто прикрепить компоненты к разъемам контактов печатной платы.

Установка компонентов схемы на печатную плату

Далее я приступил к изготовлению кейсов (корпусов) для проекта. Для этой цели я использовал плиту МДФ толщиной 8 мм и с помощью циркулярной пилы вырезал все детали по размеру.

Вырезка деталей корпусов из плиты МДФ

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

Изготовление прорезей на боковых панелях корпусов внутреннего и наружного блоков метеостанции

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

Изготовление прорези для OLED-дисплея

Для сборки корпусов я использовал столярный клей, несколько зажимов и несколько шурупов.

Использование столярного клея, зажимов и шурупов для скрепления деталей корпусов

Я покрасил корпуса аэрозольной краской. Я использовал белую краску для наружного блока и черную для внутреннего блока. После того, как краска высохла, я просто вставил платы в корпуса.

Установка платы в корпус метеостанции

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

Внешний и внутренний блоки метеостанции в собранном виде

И всё, наша беспроводная метеостанция Arduino теперь работает - более наглядно этот процесс вы можете посмотреть в видео в конце статьи.

Код беспроводной метеостанции Arduino

Код наружного блока метеостанции Arduino:

Описание работы кода:  Наружный блок является передатчиком беспроводной связи, поэтому сначала нам нужно подключить библиотеку RF24 , библиотеку DHT , а также библиотеку LowPower, которая используется для перевода Arduino в спящий режим (более подробно про спящие режимы Arduino вы можете прочитать в этой статье).

После определения их экземпляров, контактов, к которым подключены модули и некоторых переменных, в разделе настройки нам необходимо инициализировать адрес беспроводной связи. Затем в функции loop мы сначала считываем данные с датчика DHT22 - это температура и влажность. Изначально эти значения являются целыми числами и разделены, поэтому я конвертирую их в одну строковую переменную, помещаю их в массив символов и с помощью функции radio.write() отправляю эти данные во внутренний блок. Используя цикл for, мы отправляем данные 3 раза, чтобы быть уверенными, что получатель получит данные в случае, если контроллер занят в момент отправки.

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

Код внутреннего блока метеостанции Arduino:

Описание кода: С другой стороны, на внутреннем блоке или приемнике, нам необходимо подключить еще две библиотеки: одну для модуля часов реального времени DS3231 и одну для OLED-дисплея, библиотеку U8G2 . Точно так же, как и раньше, нам нужно определить экземпляры, контакты и некоторые переменные, необходимые для программы ниже. Также здесь нам нужно определить значки температуры и влажности в виде растровых изображений.

Растровое изображение значка температуры:

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

Рисование значка температуры в редакторе GIMP

Затем мы можем открыть этот файл с помощью блокнота и оттуда скопировать растровое изображение в код Arduino.

Программы, которыми можно открыть файл .xbm

Обратите внимание, что здесь мы можем определить растровое изображение как константу, используя модификатор переменной PROGMEM, и таким образом растровое изображение будет храниться во флэш-памяти, а не в SRAM платы Arduino.

В разделе настройки нам необходимо инициализировать беспроводную связь, а также инициализировать OLED-дисплей и модуль часов реального времени.

Затем в секции цикла мы постоянно проверяем, есть ли входящие данные, доступные для чтения через модули NRF24L01. Если это правда, мы читаем его с помощью функции radio.read() и сохраняем первые два символа в строковую переменную температуры, а следующие два символа — в строковую переменную влажности.

Затем мы используем функцию millis(), чтобы отображать различные данные на дисплее с интервалами, определенными с помощью переменной интервала, которую я установил на 3 секунды. Мы используем функцию millis(), потому что таким образом остальная часть кода может выполняться повторно, а в случае, если мы используем функцию delay(), программа ожидает этот период, поэтому мы, вероятно, пропустим входящие данные от наружного блока.

Затем, используя функции firstPage() и nextPage() библиотеки U8G2, мы печатаем пять различных экранов, которые определены с помощью пользовательских функций.

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

Видео, демонстрирующее сборку и работу метеостанции

Источник статьи

(Проголосуй первым!)
Загрузка...
256 просмотров

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

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