WeatherStation. Часть 0: Описание и концепция

Часть 1: Основной модуль
Часть 2: Ethernet модуль

Наверное, все начинающие AVR-программисты пробуют сделать часы. Я не исключение: ATmega8, часовой кварц, двухстрочный экран, BlueTooth — вот и получились беспроводные часы с возможностью брать время с компа. Даже яркость\контрастность можно было настраивать =).

Но в какой-то момент я понял — мне этого мало. И появилась идея проекта WeatherStation.

Итак, что это? Это станция, которая показывает время, дату, температуру и влажность за окном и прогноз погоды на утро, день вечер и ночь в пределах следующих 24 часов. Прогноз погоды обновляется по Интернет. Время тикает от RTC модуля на DS1307 (или M41T56) и также может обновляться по Сети для корректировки.

Концепция
Основная отличительная особенность этого проекта от всех остальных часов на AVR — связь с Интернет. Что это дает? Во-первых, всегда точное время. Согласитесь — подводить часы каждый день\неделю\месяц не очень удобно. Во-вторых, прогноз погоды. Частенько, прежде чем выйти из дома, мы заходим в Интернет и смотрим прогнозы. А тут бросил взгляд и уже знаешь, что вечером будет +5 и дождь, так что нужно взять зонт и одеться потеплее. В-третьих — удаленный мониторинг и управление. Например, можно сделать настройку часового пояса из удобной веб-админки, и выводить туда же температуру\влажность (ну или на почту отправлять при критических отметках).

Система получилась модульная. Это позволяет в любой момент расширить функционал, например, добавить датчик измерения давления. Данные между модулями передаются с помощью трансиверов nRF24L01+, а это значит, что можно сделать целую сеть датчиков, и все это будет без проводов и сложных программ (при этом станция всегда будет знать, от какого модуля ей пришла информация).
Пока я остановился на трех модулях:
  • Основной модуль (синоним по тексту — модуль Main) принимает информацию с остальных и отображает ее (т.е. это сама станция).

  • Модуль с DHT22 — датчиком температуры и влажности — лежит за окном и раз в N минут опрашивает датчик, посылая результат основному модулю.

  • Модуль Ethernet, состоящий из Arduino Uno и Ethernet-шилда, подключен проводом к сети; основная его цель — принимать запросы от основного модуля, посылать пакеты в Интернет и выдавать обратно полученную информацию.


Вывод информации
Что же эта система будет способна показать? Вот список на данный момент: температуру и влажность за окном, температуру внутри (внутри корпуса, если точнее), время, день недели, дату в формате ДД.ММ.ГГ, прогноз погоды на утро, день, вечер и ночь — температуру и состояние (ясно, облачно, дождь, снег).

Я отказался от LCD-экранов — их угол обзора слишком мал, да и просто хотелось сделать что-то необычное. Также я отказался от одной строки с меняющимся текстом, так как хотелось максимум информативности — бросил взгляд и сразу все увидел. Вместо LCD я решил использовать семисегментные индикаторы — счетверенный на время (с общими катодами), и одинарные на дату\температуру. Минусы и состояние погоды сделал обычными LED. Почему именно так? Все просто — индикация времени динамическая, остальная информация выводится через цепочку сдвиговых регистров, управляющих оставшимися индикаторами и светодиодами. Такое подключение позволяет рулить огромным количеством выводов, используя всего 4 ноги на МК. Да и угол обзора у них гораздо больше.

Но такое решение может привести не к самым приятным последствиям. Представьте — ночь, свет от тусклых лампочек на сетевых фильтрах \ роутерах \ других девайсах позволяет еле различать контуры мебели. И тут на полке стоит 100+ светодиодов, лупящих на полной яркости! Согласитесь — не очень приятно. «Поставь резисторы побольше» — можете сказать Вы. Но тут можно привести другой пример. Летом, в солнечный полдень, цифр Вы не увидите…
К чему я это? А к тому, что на одном из модулей (скорее всего, на основном) будет стоять фотодатчик, на основании которого будет меняться яркость (способ изменения описан ниже, в алгоритме).

Подробнее о модулях
• Основной модуль
Сердце всего проекта. В качестве микроконтроллера я выбрал ATmega32 в TQFP корпусе. На модуле расположены МК, nRF24L01+ для связи, плата Mini I2C Modules (RTC и EEPROM + место под DS18B20), 4 семисегментных индикатора в одном корпусе для отображения времени, 14 семисегментных индикаторов для отображения даты, температуры и прогноза (картинка вверху — начальный вариант: заменил третий индикатор в прогнозе на 1 LED), группы светодиодов — минусы, дни недели, состояние погоды, 18 (!) сдвиговых регистров 74HC595 для управления братией индикаторов и светодиодов. Чтобы затолкать все это в относительно небольшие размеры (~ 11x11x7 см), пришлось сделать несколько двухслойных плат (подробнее — в следующей статье).

• Модуль DHT22
Состоит из МК (скорее всего ATmega8L, возможно, удастся сделать на ATtiny), датчика температуры и влажности — DHT22 (аналоги — RHT03, AM2303) и nRF24L01+. Единственная задача — просыпаться раз в N минут и передавать температуру и влажность основному модулю. Обратной связи нет.

• Модуль Ethernet
Состоит из Arduino Uno с Ethernet-шилдом (возможна замена на ATmega + сетевой модуль на ENC — на руках нет просто) и трансивера. При поступлении запроса обрабатывает его, запрашивает данные из Интернет и отправляет обратно.

Примерный алгоритм работы
В момент включения основной модуль ждет секундного тика на RTC, чтобы секунды совпали. После этого, запускаются таймеры. Таймер 0 используется для динамического отображения времени (частота кадров 400 Гц, т.е. картинка из 4 цифр появляется 100 раз в секунду). После отображения четвертой цифры происходит запрос времени с RTC и проверка наличия данных на трансивере. Если что-то пришло — выдаем изменения на сдвиговые регистры. Двух миллисекунд должно хватить на все эти операции, поэтому морганий динамики быть не должно. Таймер 1 заведует ШИМом на базы транзисторов динамики и пины OE сдвиговых регистров. Зачем? Для регулировки яркости (да, вот такой странный способ =) ).

Состояние проекта
На данный момент готовы почти все платы основного модуля и схема модуля DHT. Программа для основного модуля написана примерно на 60%, программа для DHT-модуля — на 90%.
В ближайшее время будет продолжение статьи.

Спасибо за внимание!

P.S: это моя первая запись в блог размером более 900 слов (да, я считал =) ), так что стиль изложения и оформление может хромать. С радостью приму любые исправления.

Комментарии (2)

RSS свернуть / развернуть
+
0
Доброго времени суток! А не подскажите что надо поменять в библиотеке чтобы DHT22 работал при тактовой частоте 1 МГц? А то при 16 МГц все работает, а от внутреннего RC даже на 8 МГц не хочет.
avatar

Nazzik

  • 10 декабря 2014, 16:25
+
0
Честно говоря, не помню в коде ничего зависящего от тактовой частоты МК. Тем более у меня он работал именно на 8МГц (и даже вроде на 1МГц)… Но все же просмотрю на всякий случай код библиотеки.
avatar

shadowalker

  • 10 декабря 2014, 21:35

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.