В прошлом рассказе про то,
что можно сделать из Arduino, мне предложили делать погоду и бросать ее в сеть. Не сказать, чтобы это мне это было сильно нужно, но сама идея осталась в голове и это обстоятельство представляло хотя и смутное, но постоянное беспокойство.
Так что я решил попробовать, и закрыть этот вопрос раз и навсегда. Тем более, что тот самый рассказ стал призовым, и позволил мне купить практические все необходимое, чтобы решить задачу.
В некотором смысле это спасибо MySKU и всем, кому понравились игрушки из Arduino.
ЖЕЛЕЗКИ
Arduino Pro Mini
Плата совершенно крошечная. Я даже не ожидал, что настолько. Но при этом на ней — взрослый чип ATmega328, так что по производительности она не уступает той же Uno. Это версия 5В, питается или от 5В стабилизированного по любому пину VCC или же от 5 — 12В по пину RAW (если верить Arduino.cc). По-моему, очень удобно.
Комплект передатчик-приемник ASK/OOK 433 МГц
Это уже проверенные (не в этом магазине, а вообще) простейшие приемники и передатчики с амплитудной модуляцией. У них нет никаких средств коррекции ошибок и контроля передачи, зато они крайне дешевы и без проблем работают с нужными мне устройствами (розетками, выключателями и с самими собой).
Живые фото можно посмотреть
в предыдущем тексте про Arduino.
Преобразователь Serial — USB
Очень простой, недорогой и универсальный — есть питание 5В и 3.3В на выбор. Нужен, чтобы загружать код в Arduino Pro Mini, так как у платы нет своего USB. Шлейф, который вы видите на фото, входит в комплект. И хотя ничего необычного в нем нет — обычные четыре провода, все равно приятно.
Датчик влажности и температуры DHT21
Заказывал часы для жены, но DX ошибся с заказом, ошибку признал и вернул стоимость на счет в магазине. Так что вместо часов жене получился датчик температуры мне любимому. Этот датчик выбран за разумную цену (вообще, а не в DX), широкий диапазон измерений и точность до десятых. Кроме того, в отзывах на DX писали, что он полностью совместим с DHT22, для которого есть готовые библиотеки для Arduino.
Пара слов о продавце на eBay
С одной стороны, в магазине приятные цены, все выслали достаточно быстро, и почти все пришло в рабочем состоянии.
Исключение — один приемник, который не включился. Возможно, он настроен на другую частоту и поэтому я не увидел сигнала на выходе. С этим буду разбираться позже, но пока факт остается фактом — в текущем состоянии один приемник оказался бесполезен.
Другой минус состоит в том, что бесплатная доставка — без номера для отслеживания. А так как я эти номера все же люблю, то заплатил за него, как и было предложено в письме-подтверждении заказа. При этом продавец предлагает оплатить трек-номер на отдельный эккаунт PayPal.
Итог: сначала мне больше недели номер вообще не давали. Потом, когда я пообещал диспут, выдали с интервалом в день сразу два трек-номера. Один был явно левым, поскольку дата приема посылки по нему была раньше даты заказа.
Другой казался нормальным ровно до импорта в России. Как только появился индекс места назначения стало понятно, что это посылка не моя, а какого-то счастливчика из Обнинска.
Ну а потом уже пришла моя посылка — без каких-либо трек-номеров. Поэтому поводу я еще немного поскандалил с продавцом, и в конечном итоге плату за трек-номер мне вернули.
Впечатления двойственные: с одной стороны, в магазине очень приятные цены. С другой — получается какая-то лотерея.
ФИЗИЧЕСКИЙ УРОВЕНЬ
За громким заголовком суровая правда: дома на боевом дежурстве живет
небольшая коробочка с Arduino Uno, подключенная к сети через Ethernet-шилд.
В этой коробочке также есть копия упомянутого выше ASK/OOK приемника для получения сигналов с домашних датчиков (протечки, открытия дверей и т.п.).
Это определило некое подобие клиент-серверной модели для подключения метеодатчика. То есть, метеодатчик на базе Arduino Pro Mini отправляет данные температуры и влажности коробке, а она, в свою очередь, отправляет их в интернет.
Отвечаю на очевидные вопросы )
Q: Почему примитивные приемники, а не, скажем, рекомендованные ранее чудесные nRF24L01, которым не страшны помехи, которые легко объединяются в сеть и вообще идеальны для такого применения?
A: Во-первых, кажется, я просто боюсь, что потрачу слишком много времени на усвоение методики работы с nRF24L01. Во-вторых, у меня (то есть, у Arduino Uno в коробке) заканчивается все — пины, память. А нужно подключить еще несколько устройств: пищалку, датчик движения.
Между тем, в коробке уже есть все, что нужно для получения метеоданных — и приемник, и библиотека RC-Switch, которая вполне подходит не только для управления розетками, но для передачи нескольких символов. Почему бы не воспользоваться уже имеющимися ресурсами?
Q: Почему тогда не Virtual Wire?
A: Ответ, в общем, выше — еще одна библиотека, еще меньше памяти. С практической точки зрения такой радиоканал можно назвать слабым местом системы. Но, если задуматься, вся моя система — сплошное слабое место, так сказать, by design.
Q: почему бы не подключить Arduino Pro Mini к сети напрямую?
A: Дело в том, что для минимального количества проводов я планирую поставить датчик на окно, а рядом нет ни сетевых, ни электрических розеток. Это раз.
И два: Wi-Fi-шилд для Arduino или комбинация из электрической розетки с Ethernet и обычного Ethernet-шилда Arduino стоят совершенно неразумных для решения этой задачи денег.
Q: Почему не меряем атмосферное давление?
A: Потому что датчик сразу не заказал, и в итоге он еще не приехал. А попробовать очень хотелось.
Q: У тебя же есть метеостанция с беспроводным датчиком. Почему не используешь его, а городишь огород на пустом месте?
A: Честно говоря, огород для меня проще, чем писать код для обработки сигнала. Потом, может быть, попробую. А сейчас так гораздо быстрее.
ЛОГИЧЕСКИЙ УРОВЕНЬ
Для логической основы радиоканала я решил воспользоваться возможностями библиотеки RC-Switch. Она предназначена для управления беспроводными розетками, но методика управления позволяет использовать ее и для передачи данных. Медленно, не очень надежно, но — позволяет.
Суть в том, что команда розетки — всего лишь цифровой код. При этом RC-Switch совершенно безразлично, какой именно код передавать. Главное — не больше 24 бит, то есть не больше 16777216.
В итоге мой протокол передачи метеоданных выглядит следующим образом:
Первые три цифры — идентификатор датчика
Четвертая цифра — тип данных (1 — влажность, 0 — температура)
Пятая цифра — знак температуры (1 — отрицательная, 0 — положительная)
Остальные цифры — величина
Например, чтобы передать температуру 23.5С нужно отправить через RC-Switch код 16100235.
Плюсы примитивного «кодирования»: достаточно всего одного действия арифметики, чтобы выделить передаваемую величину. Минусы — один «пакет» для одного значения.
ПРАКТИЧЕСКАЯ РЕАЛИЗАЦИЯ
Arduino Pro Mini поставляется в комплекте с контактными планками. При желании их можно напаять на плату. А при необходимости сделать максимально компактную конструкцию провода можно паять прямо к контактным площадкам платы.
Я выбрал первый вариант — мне так проще, да и плату, если что, легче использовать повторно.
После беглого ознакомления с датчиком температуры и влажности DHT21 выяснилось, что напрямую подключать его к Arduino не очень правильно. Оказывается, правильная схема включает «подтягивающий» резистор 4.7 кОм между плюсом и линией данных. Мне повезло — нужный резистор выкусил из ненужного беспроводного звонка.
Для питания прототипа я воспользовался ненужной «аварийной» зарядкой для мобильного телефона. Это такой цилиндрик: с одной стороны вставляем батарейку AA 1.5В, а с другой получаем 5.9В (без нагрузки). Для страховки я подключил выход зарядки к входу RAW Arduino Pro Mini, чтобы все компоненты (плата и датчик) получали стабилизированные 5В. По крайней мере, из описания платы можно заключить, что RAW принимает от 5В до 12В, при этом на контактах VCC — стабилизированные 5В.
Дальше все просто. Подключаем передатчик, датчик и пишем простой код. В моем случае для кода потребовались три библиотеки: RC-Switch (передача данных), SimpleTimer (отсчет интервалов для передачи) и DHT22 (получение данных с датчика температуры и влажности).
А вот и прототип:
Схема работы: раз в пять минут опрашиваем датчик и попеременно отправляем температуру и влажность. За одну сессию можно передать только один параметр, поэтому «большая сестра» получает их по очереди, а потом скопом отправляет в Open Weather Map. В результате данные в интернете обновляются раз в десять минут.
Почему такой интервал? Потому что, во-первых, каждая сессия — это занятый радиоканал (а у меня есть и другие радиодатчики, требующие внимания) и отнятое процессорное время. Так что это попытка минимизировать издержки.
Во-вторых, я не такой уж и погодный маньяк, чтобы обновлять погоду каждую секунду.
И третье. Интервал в пять минут, по-моему, более-менее рационален с точки зрения энергетики, так как я планирую питать метеодатчик от батареек.
Для записи кода в плату соединяем Arduino Pro Mini с компьютером через преобразователь Serial — USB и не забываем «перекрестить» линии TX/RX, то есть: RX подключаем к TX, и наоборот — TX к RX. Для питания берем пин 5В, потому что эта версия Arduino — 5В.
Секрет: если заливка программы не удается (ошибка типа avrdude: stk500_getsync(): not in sync: resp=0x00), помогает такая процедура:
1) Нажимаем кнопку загрузки программы в среде разработки Arduino
2) Ждем пока загорится красный светодиод на преобразователе Serial — USB
3) Нажимаем кнопку сброса на Arduino Pro Mini
Если не получилось — ждем, пока погаснет красный светодиод на преобразователе и повторяем процедуру.
Со стороны «большой сестры» нужно только добавить несколько фрагментов кода для получения метеоданных из радиоканала и отправки их в интернет. Для примера — готовый код по ссылке в конце текста, который подходит для использования с Arduino Uno как в монопольном режиме, так и в составе вашего кода (если, разумеется, разобрать исходник на нужные части).
Если будете использовать — не забудьте подставить свои IP/MAC, ключ авторизации OpenWeatherMap и координаты метеодатчика.
А вот так метеодатчик выглядит почти в финальной (ну или вообще финальной, если нет ничего более постоянного, чем временное) версии:
НА ДЕРЕВНЮ, ДЕДУШКЕ
Итак, метеоданные получили, передали и приняли. Ок. И что делать с этим счастьем? Мне советовали отправлять его в Openweathermap.org, поскольку дело хорошее и вообще. Я проникся и немного изучил вопрос, хотя такое ощущение, что Openweathermap это совершенно не нужно.
Так что получилось, скорее, не благодаря, а вопреки. Спасибо нашему чуваку, который сделал интернет-метеостанцию и рассказал о ней, Wiki за описание базовой аутентификации HTTP и чудесному сервису hurl.it, который имитирует HTTP-запросы и показывает их тело, что важно для кода. Ах да, еще большое спасибо онлайновым сервисам кодирования Base64.
Иными словами, документация на Openweathemap upload API говорит, что нужна аутентификация HTTP Basic и описывает имена и форматы полей данных, но не дает практических примеров, что нужно таким безмозглым, как я.
Как все получилось.
Сначала я зарегистрировался на Openweathermap.org.
Потом выяснил, что для HTTP Basic нужна строка авторизации, состоящая из имени и пароля, разделенных двоеточием и кодированных Base64. Так что взял логин и пароль, пошел в онлайновый кодер и на выходе получил нужную строчку.
Например, для имени test и пароля test она выглядит так: dGVzdDp0ZXN0
Как результат, строка авторизации Openweathermap выглядит так:
Authorization: Basic dGVzdDp0ZXN0
Берем ее и составляем тестовый запрос в Openweathermap и смотрим тело запроса:
Обратите внимание, что если все правильно, то «тест» отправляет данные в Openweathermap. Я эту проблему решил просто: подставлял актуальную информацию о погоде из своего региона.
Полученный таким образом текст запроса можно запросто использовать в коде Arduino: строчки печатаются в HTTP-клиент.
Плюсы: в целом все довольно просто.
Минусы: у Openweathermap отсутствуют адекватные (с моей точки зрения, разумеется) методы визуализации данных. Доступны только запросы к БД с выдачей результатов для визуализации «на стороне».
КАК ЭТО РАБОТАЕТ
Все просто. Метеодатчик получает температуру и влажность от DHT21, и отправляет их Arduino Uno, подключенной к интернету.
Оттуда данные уходят на Openweathermap (чего добру пропадать?), где их можно посмотреть в онлайне и где они, вероятно, используются для прогноза погоды.
Желающим понаблюдать за местной (Россия, Москва, СВАО, Лианозово) погодой:
мой метеодатчик на Openweathermap.org.
А ТЕПЕРЬ О ПРОБЛЕМАХ
Так как руки у меня растут все-таки не совсем из правильного места, то я закономерно наступил на несколько художественным образом разложенных грабель.
Во-первых, несмотря на то, что авторы библиотеки DHT22 заверяли, что они решили проблему с отрицательными температурами, мне это не помогло. При минусе библиотека начала выдавать совершенно нереальные показания, что в обсуждениях обосновывали ошибкой переполнения.
Т.е. вместо -4.5С мне показывали 32763,5. Я не стал переписывать библиотеку (см. выше про руки), а просто стал вычитать полученное значение из 32768 (максимальное значение для заданного типа переменной).
Во-вторых, практически сразу после первого включения метеодатчика выяснилась печальная особенность: на кухонном столе (около 2.5 метров до приемника) он еще работал, а вот на балконе (около 4 метров) — нет. После изучения кода и прочего стало понятно, что проблема, все-таки и не в нем, и не в батарейках.
Подозрение пало на антенны, которые я сделал из простых кусочков провода. Чтение этих ваших интернетов догадки подтвердило: диапазон 433 МГц — довольно коварная в плане распространения волн штука. Поэтому антенну лучше делать хотя бы минимально похожей на антенну, а не изгибать проводочки под причудливыми углами, лишь бы в корпус поместилось.
В итоге я заменил все проводки на штыри из одножильного медного провода (просто купил пару метров (с запасом, да) 2х1.5 электрического кабеля, и распотрошил его на жилы. Длина штырей как и раньше — около 17.3 см, т.е. четверть волны. Все ориентированы вертикально.
Результат — теперь не только метеодатчик работает на балконе, но и другие беспроводные датчики в квартире работают гораздо более уверенно.
Третья очевидная проблема — совершенно зверское потребление энергии. Двух батареек 14500 по 1000 мАч хватает где-то на пару суток. Т.е., по грубым прикидкам метеодатчик кушает около 20 мА. Говорят, что одна из наиболее прожорливых частей — встроенный стабилизатор напряжения, но от него я избавиться как раз и не могу, потому что пока не вижу, как в батарейный отсек на две АА можно разместить автономный источник 5В.
Поэтому рассматриваю две альтернативы. Первая — эксперименты со «спящим» режимом. Вторая — бросить эти девичьи мечты об автономности и запитать уже от электрической сети.
Ну а пока наслаждаюсь тем, что датчик вообще работает :)
ССЫЛКИ
Библиотека RC-Switch
Библиотека DHT22
Библиотека SimpleTimer
Сервис для тест HTTP-запросов hurl.it
Сервис кодирования Base64
Код метеодатчика
Код принимающей стороны
Однозначно +++
Для dht21 и всех остальных можно использовать типа такой универсальной библиотеки homes-smart.ru/upload/arduino/DHTALL.zip
Питание радиопередатчика можно повесить на цифровой пин и включать его только при передаче — может и немного, но возможно будет экономия батареи…
Можно пойти дальше и сделать передатчик например на малютке ATTINY85 (http://www.taydaelectronics.com/attiny85-attiny85-20pu-8-bit-20mhz-microcontroller-ic.html) -он вроде меньше жрет энергии, прошивается через ардиуну…
Сам использую проводные варианты и статистика датчиков, в том числе и давления ведется в своей БД и доступна через самодельный веб интерфейс.
И еще, разумеется, спасибо за советы — возможно, на следующей итерации будет ATtiny. Пока же я пользуюсь тем, с чем проще и быстрее, иначе это будет не игрушка, а мучение.
Тоже думал про локальную БД, но, в итоге скатился до наиболее простого варианта — в облако, все в облако.
з.ы. полезный обзор
Читал, что понижают процессору тактовую до 4мГц и после этого плата питается напрямую от 3.7в аккумуляторов.
Или применить спец платку LilyPad Arduino с пониженным энергопореблением.
Как обычно, в общем: хочешь просто — мирись с неизбежным.
В общем, если ресурсы в контроллере еще останутся — попробую отправку данных в narodmon помимо прочего )
Например, chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo
Хотел узнать: а есть какие-то недорогие датчики веса? Нужно измерять вес до 100 грамм, точность в 5 грамм будет достаточной.
А вообще, если посмотреть, что народ с Arduino делает, то можно поделить на два направления:
— используют электронные весы (подключаются к выходу АЦП)
— используют датчики силы (?) (force sensitive resistor) (https://www.sparkfun.com/categories/143)
ЗЫ: ндэ, не такие уж и копейки…
radiokot.ru/lab/controller/51/
aliexpress.com/store/product/3-pieces-lot-100-brand-new-Weighing-sensors-for-AD-module-force-module-dual-channel/915786_730524264.html
aliexpress.com/store/product/Free-shipping-Load-cell-weight-sensor-24-AD-analog-to-digital-conversion-weight-measurement-Internal-integrated/915786_883914536.html
Поскольку использование PoE слишком увеличивает габариты устройства.
Сечение витой маленькое, на самом деле, на бОльшие расстояния надо считать исходя из сопротивления/сечения провода.
Днина кабеля будет далеко не 10 м.
Буду искать на ebay может что-то и найдем.
а вообще — у вас что, материнки лишней нету? там ведь есть термодатчик. вынести его из корпуса, или вообще корпус не ставить — и мониторь себе на здоровье. я понимаю, что из пушки по воробьям, но зато 100% надежно, просто, и бесплатно — из подручного овна и палок ;)
ЗЫ: Кстати, продавец очень приятный (в плане цен и ассортимента около-ардуинной хрени, много у него накупил уже давно, в т.ч. и пару таких же «апгрейднутых мини».
Если нужен высокий КПД, смотрим в сторону импульсных стабилизаторов. Хороший вариант — стабилизаторы на основе Kis-3r33s.
Импульсные, опять же, разные бывают.
Пробовал на базе LM2596 (20В -> 5В). Греется, значит КПД чуть получше чем у линейного. Судя по документации, этот стабилизатор способен на большее при правильном обвесе, чего в китайских дешевых поделках ждать не приходится.
он, как минимум, немного дороже моего решения. Особенно с учетом того, что на DX зависло какое-то количество денег.
Другие соображения я тоже высказывал — для датчика нужен дополнительный код, а памяти остается не так много. Особенно, с учетом того, что я еще не все сделал, что хотел.
Плюс к тому, Pro Mini в датчике, если я что-то еще придумаю, сможет заниматься и другими задачами в промежутках между погодой. А вот просто метеодатчик — нет.
Протокол никоим образом не совместим с метеостанциями, поэтому rc-switch для работы с готовыми датчиками не подходит. Для готовых необходимо или решение под него, или самостоятельный разбор протокола.
В любом случае — спасибо! А то я все гадал — и чего у китайцев этих адаптеров море. Оказывается, все по делу.
Попробуйте простейший «таймер» на МОСФЕТе в цепи по питанию. Алгоритм такой:
1. Вся схема обесточена, ёмкость на затворе заряжается примерно 5 минут;
2. МОСФЕТ открылся, схема работает — измеряет-передаёт;
3. Передача закончена, через вывод Ардуинки ёмкость на затворе разряжается, напряжение питания снимается на 5 минут, СПИМ!
4. И снова… :-).
Если проживет в таком виде неделю — будет замечательно: я примерно в таком темпе меняю батарейки в других домашних штуках, так что привык.
Спасибо за советы!
К сожалению, я в схемотехнике не силен, даже в первом приближении не смогу сформулировать вопрос к гугле… :o(
Что касается энергосбережения, то пока я выпаял светодиод питания и проверяю, как плата работает с библиотекой Narcoleptic. По первым впечатлениям — дольше, чем в голом виде, но не настолько, чтобы конкурировать со специализированным метеодатчиком.
Спасибо за намек на LaunchPad.
Приобрел данные радиомодуля недавно. Подключил их к USB конвертеру, так при выключенном передатчике у меня мусор идет от приемника, когда к передатчику подключаю питание приемник ловит иногда набор нулей.
Кто-нибудь сталкивался с таким?
У вас получается пульт передает только в момент нажатия кнопки, т.е. приемник получает все тот же бессмысленный мусор из эфира, пока не будет нажата кнопка на ПДУ?
Просто закупил 4 комплекта приемник/передатчик, хотел задействовать и на этих помехах тормознул.
С пультом все именно так: передача только в момент нажатия кнопки. Если говорить о тех пультах, что у меня, то они для «синхронизации» с приемником используют специальную преамбулу — включают несущую на время, необходимое, чтобы приемник перестроил настройку уровня сигнала. При таком раскладе он (приемник) перестает слышать более слабые сигналы (подразумевается, что кроме информационного сигнала все остальные — незначительны), и захватывает наиболее сильный.
В остальное время на выходе приемника действительно постоянный ужасный шум. Так что если хотите использовать — нужны соответствующие протоколы/алгоритмы. Для Arduino это, например, VirtualWire. Или, на более примитивном уровне — библиотека RC-Switch и аналогичные ей, имитирующие протокол многих беспроводных пультов/розеток с фиксированным кодом.
Один из аппаратных вариантов — взять те же кодеры/декодеры SC2260/2262 и передавать данные с их помощью. Но это довольно медленно и неудобно. Возможно, есть другие варианты, я их, если честно, не изучал даже.
Программные варианты — например, адаптировать для себя библиотеку VirtualWire для Arduino (если пишете на ассемблере, это наверняка не должно быть особой проблемой). И уж простите, но я упоминаю Arduino не потому, что нет других решений, а просто потому, что с другими дела не имел.
Другой вариант — использовать методику тех же SC2260. То есть — перед каждой передачей данных выдавать импульс на синхронизацию (предположим, та же единица на вход передатчика на время захвата несущей приемником), а после — данные.
Соответственно, контроллер на принимающей стороне должен начинать прием данных только после того, как увидит «тишину» из приемника в течение времени достаточного, чтобы понять, что это именно синхронизирующий импульс.
Для ориентира — обычных радиорозетках синхронизация что-то около 3-4 тыс. микросекунд.
« Глагол быть в настоящем времени имеет лишь две формы: есть (3-е лицо ед. ч.) и суть (3-е лицо мн. ч.).В будущем времени этот глагол имеет все шесть форм:
буд-у, буд-ешь, буд-ет; буд-ем. буд-ете. буд-ут.» ©