пятница, 18 января 2013 г.

Погодная станция с часами (за полчаса)

Сегодня мы создадим погодную станцию, которая будет работать с двумя внешними датчиками Oregon (THGN132N - температура и относительная влажность), измерять температуру, атмосферное давление и относительную влажность внутри помещения.
Дополнительно оснастим ее часами реального времени (для удобства и оставим некоторый "задел на будущее").
Отображение температуры, влажности и состояния элемента питания датчика

Функционирование реализуем следующее:

  1. На дисплее циклически будет отображаться:
    • Текущее время, день недели, дата
    • Атмосферное давление, температура и относительная влажность внутри помещения
    • Температура, относительная влажность с внешних датчиков и информация о состоянии их батарей
  2. Принудительное переключение между режимами отображения с помощью кнопки.
  3. Для всех параметров (температура, влажность, давление) будем отслеживать тренд изменения (увеличивается, стабильно, понижается) и рядом с конкретным значением будем показывать эту информацию в виде специальных значков.
  4. В качестве уличных датчиков будем использовать покупные Oregon THGN132N.
  5. Когда приходит информация от уличного датчика - будем индицировать это кратковременным зажиганием светодиода.

Для достижения быстрого результата нам потребуется:
Комплектующие серии Grove очень удобно соединять между собой - достаточно взять модуль, подключить к нему соответствующий кабель и дальше этот кабель подсоединить в необходимый разъем на шилде. Таким образом есть некоторая "защита от дурака" - сложно перепутать контакты питания между собой и скорость монтажа просто потрясающая - нашу "погодную станцию" можно собрать за пару минут.

Большая часть необходимых нам комплектующих входит в Grove Starter Kit.

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

Аппаратная конфигурация


  1. Подсоединяем дисплей к разъему 5 (здесь и далее разъемы согласно нумерации на схеме шилда) - будем использовать D5 и D6, как TX и RX.
  2. Датчик для измерения внутренней температуры и влажности (DHT11) подключаем к разъему 4 - используем D4.
  3. Модуль кнопки - в разъем 3 - используем D3.
  4. RF-приемник на 433МГц подключаем к разъему 2 - используем D2.
  5. Модуль светодиода подключаем к разъему 13 - используем D13.
  6. Модуль RTC подключаем к разъему IIC (SDA - A4, SCL - A5).
  7. Модуль барометра BMP085 - тоже к разъему IIC (SDA - A4, SCL - A5).

Последние два модуля фактически получаются подключенными параллельно (это нормально).
Быстросборный "паук".
Модули (по часовой стрелке, начиная с самого верхнего): RTC, LED, Button, DHT11, Serial LCD, RF-приемник (антенна в виде спирали), BMP085. В центре виден Base-шилд.

Датчики THGN132N так же необходимо подготовить - на одном из них выбрать (переключателем под крышкой батарейного отсека) канал 1 (это будет первый уличный датчик), а на втором, соответственно, надо выбрать 2 канал.
Переключатель каналов под крышкой батарейного отсека

На этом наша "аппаратная платформа" полностью готова.

Программная часть

В качестве основы для общего кода будем использовать примеры использования конкретных датчиков (и их библиотеки, если они необходимы).
В конце статьи есть ссылка на архив, содержащий скетч нашей метеостанции и необходимые библиотеки.
Сложность возникает с датчиками Oregon, но благодаря тому, что датчики эти доступны по цене (от 600 рублей) и обладают хорошими характеристиками, энтузиасты  не прошли мимо протокола их работы и неплохо его разобрали. Более подробно работа с датчиками описана в этой заметке на habrahabr.ru (повторяться не будем).

Особенности:

  • Для хранения информации о текущих значениях датчиков используется два массива t[4] и  h[4] (температура и влажность, соответственно). Значения давления храним в соответствующем элементе массива вместо влажности.
  • Для вычисления трендов используется массивы предыдущих значений PrevTemp[] и PrevHym[]. Сами же параметры, характеризующие рост (или спад) того или иного параметра задаются с помощью директив (можно изменить под свои личные предпочтения):
    • #define DELTA_TIME 900000 // 15 минут - период расчета трендов
    • #define DELTA_TEMP 0.1    // превышение этого значения будет означать изменение температуры - 0.1 градуса
    • #define DELTA_HYM 1       // порог для влажности 1 процент
    • #define DELTA_BAR 1       // порог для давления 1 мм.рт.ст.
  • Для определения температуры внутри помещения используем значения с датчика BMP085, как более высокоточного по сравнению с DHT11.
  • Из-за того, что дисплей не поддерживает кириллицу и нельзя "создать" собственные символы, для отображения трендов и состояния элементов питания будем использовать символы из набора доступных.
  • Получение параметров от датчиков Oregon происходит по мере того, как датчики передают о себе информацию (примерно 1 раз в 40 секунд).
  • Остальные измерения происходят в момент обновления экрана (в автоматическом режиме 1 раз в 20 секунд или в ручном режиме при нажатии на кнопку).
Примеры отображения информации на экране:
Текущее время, день недели и дата
Атмосферное давление и температура и влажность внутри помещения.
Атмосферное давление и влажность растут (обозначено значком "^")
Отображение информации с датчиков Oregon (первый датчик находится на улице, второй - дома).
Уличная температура - понижается (обозначено значком "_"), остальные параметры - повышаются.
Состояние элементов питания в датчиках - в норме (для обоих).
Вот, собственно, и все - наша погодная станция готова и функционирует.

Что можно было бы еще добавить:

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

Как это работает:


Продолжение: оснастим нашу погодную станцию web-интерфейсом.

11 комментариев:

  1. Хотел вам задать несколько вопросов по поводу статьи.
    Скачал скети и библиотеки. Среда разработки IDE 1.01 установлена C/Program files, операционная система WINDOWS XP SP 2. Элементарные программы с диодами и типа "HELLO WORLD" работают, а вот при использовании сложных скетчей в ходе компиляции постоянно выдает ошибки в библиотеках.
    Вначале проверил библиотеку DHTtester ошибка в скетче: TYPE does not name a type.
    Далее попробовал скомпилировать сам скетч weather_all, начинать выдавать аналогичные ошибки: Bounce does not name type встроке Bounce bouncer = Bounce (BUTTON,5). Такое же сообщение касается RTC, LCD.
    Кроме того есть еще одна проблема с библиотеками скачиваемыми с SEEEDSTUDIO при переходе по вашей ссылке: в некоторых скачиваемых библиотеках неуказано расширение файла( ino, pde); при входе в программу в examples и libreries их просто не видно, при прописывании разрешения вручную скетч открывается, но там одни каракули.
    Я был бы вам очень признателен, если бы вы помогли разобраться с этой проблемой.

    ОтветитьУдалить
  2. Внутри архива есть папка libraries с нужными библиотеками (каталоги). Их надо положить в папку libraries внутри папки arduino (там, где вы установили среду на своем компьютере). Вообще это обычная работа с библиотеками.

    После этого можно запускать Arduino IDE и открывать скетч weather_all - все без ошибок скомпилируется.

    ОтветитьУдалить
  3. Подскажите пожалуйста в какой IDE компилировали. Пробовал в 023, 1.0.1 и 1.0.2 в каждой IDE видит разные ошибки. В вашей статье про автоматизацию все скомпилировалось в 023, на железе тоже работает.

    ОтветитьУдалить
  4. У меня версия 1.0.3, но уверен, что в любой версии старше 1.0.0 скомпилируется без ошибок (если правильно установлены библиотеки).
    Вы бы указали, что за ошибки при компиляции возникают?

    ОтветитьУдалить
  5. Очень плохо ловит.. только если лежат прям в 10см, даже на полметра уже не ловит, подскажите что может быть? Передатчик и приёмник как у Вас.

    ОтветитьУдалить
    Ответы
    1. Отвечаю сам себе. Модуль просто оказался бракованный, новый работает отлично.

      Удалить
  6. Добрый день !
    Я дико извиняюсь если не по теме, но может вы сможете помочь моему горю.
    Решил сделать проект с использованием IBoard 1.1 и grove-sereal LCD v1.1..
    При работе через программатор все хорошо и отлично, но как только отключаю программатор и подключаю блок питания то LCD наводить на меня грусть своим темным экраном (не чего не хочет отображать :-( ) Хотя питание на него подается...

    ОтветитьУдалить
    Ответы
    1. Сам себе отвечаю, перед подключение прочитать что пишут о плате в спецификации... Рабочее напряжение 3,3 v

      Удалить
  7. Добрый день.
    Скажите, имеет ли значение тип модуляции на RF приемнике?

    ОтветитьУдалить
  8. Подскажите, как подключить приемник 433 мгц, он немного не такой, как у вас. На нем написано XD-RF-5V, четыре выхода. Левый GND, два центральных (вроде спаяны вместе) DATA, правый VCC. Помогите подключить, все остальное есть, а вот приемник только такой. Спасибо!

    ОтветитьУдалить
  9. Здравствуйте
    Подскажите кто может такое сделать?

    Меня интересует покупка Метеостанции может сможете сделать ее под заказ или посоветовать кого то кто сделает!?

    В станции надо датчики:
    температуры
    влаги
    давления
    направление и скорость ветра
    а также датчик UV

    всё это мне надо как то выводить на своем сайте
    на сервере стоит LINUX

    есть возможность подключить станцию через LAN или WIFI к роутеру.

    зарание спасибо

    ОтветитьУдалить