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 слов (да, я считал =) ), так что стиль изложения и оформление может хромать. С радостью приму любые исправления.


0 комментариев на «“WeatherStation. Часть 0: Описание и концепция”»

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

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

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

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение