Беспроводной датчик температуры
Другие материалы
В отличии от других вариантов реализации (Например nRF24LE1 или WI-FI ESP8266 ) беспроводной передачи данных - этот вариант может быть собран на очень дешевом микроконтроллере Attiny13, стоимость которого всего 50 центов.
Примеры для приемников, которые могут принять сигнал от данного датчика можно посмотреть на страничке алгоритма передачи данных. Так же полезна будет статья Интеграция в систему умного дома
Так как передатчик не имеет внешних настроек,то все настройки задаются перед компиляцией прошивки. Для удобства разработан конструктор прошивки,который находится внизу данной страницы. Данный подход упростит разработку устройств тем,кто плохо знаком с языком Си.
Поддерживаемые микроконтроллеры: Attiny85. Attiny45. Attiny25. Attiny13, Attiny2313(НЕТ АЦП !). Возможно добавить и другие м/к.
Конструктор сам указывает какие фьюзы необходимо прошить для работы от внутреннего генератора,в том числе при использовании внутреннего делителя на 8. Если вы хотите изменить эти настройки,то смотрите калькулятор фьюзов .
Если у Вас будет несколько передатчиков,то ключи должны быть у всех разные.
Выбор протокола:
В конструкторе можно выбрать два варианта протокола - зависит от того, какую библиотеку использовать:
Для троичного протокола необходима библиотека RemoteSwitch.
Для двоичного протокола - RCswitch.
Аналоговый вход (АЦП):
Передатчик может передавать состояние аналогового входа (АЦП), например с фоторезистора(датчика освещенности). Для этого необходимо задать ключ,если значение ключа равно нулю, то код, отвечающий за АЦП не компилируется и не занимает памяти в микроконтроллере. Размер кода в прошивке занимает примерно 60 байт.
Аналоговый вход находится на PB2(7 нога м/к). В Attiny2313 АЦП нет.
Схема подключения:
На схемах отображены только основные детали. К выводу PB0(5 нога) для экономии энергии могут подключатся выводы питания датчиков и радиомодуля (через транзистор)- в этом случае они будут запитыватся только в момент опроса датчика. У Attiny2313 распиновка отличается -смотрите в даташите.
Вариант с DHT
Вариант с DS18B20:
Внимание. Если датчик будет использоватся на улице(при минусовой температуре), то необходимо использование кварца. Для этого необходимо пересчитать фьюзы и указать частоту кварца в соотсвествующем поле. Attiny13 кварц не поддерживает. Для использования кварца необходимо поменять используемые выводы микроконтроллера соотсвествующей галкой. т.к. кварц подключается на выводы PB3, PB4 по стандартной схеме.
Экономия энергии при работе от батареи:
Микроконтроллеры Amtel умеют "засыпать" и включатся по прерыванию или по таймеру Watchdog - это может хорошо сэкономить заряд батареи или аккумулятора.
При использовании Watchdog время обновления и отправки данных может быть только кратно 8 секундам(8,16..64..256..).В обычном же режиме без использования Watchdog время кратно 5 секундам (используется обычный _delay_ms(5000)).
Если ,например, Attiny85 при работе 8мгц имеет потребление около 7 мА.(тут и ниже ток будет указан в милиамперах для удобства сравнения), а при работе на 1мгц(используя делитель на 8) 2 мА,то в спящем режиме ток падает до 0.01 мА.
У Attiny13 параметры экономии ещё лучше: при 9.6 мгц потребление около 5мА(5в) 2.5мА(3.3в), при 1.2 мгц (используя делитель на 8) - 1.5мА(5в) 0.7мА(3.3в), в спящем режиме до 0.005мА.
К сожалению размер прошивки при использовании спящего режима увеличивается примерно на 82 байта.
Прошивка микроконтроллера:
При генерации hex файла конструктор показывает командую строку для загрузки через утилиту avrdude.
Не забываем к данной коммандной строке дописывать опцию установки фьюзов,генерируемой при установке частоты и выбора м/к. Это можно делать только один раз ,а при следущем изменении настроек(не связанной с частотой м/к) изменение фьюзов менять уже не нужно.
При использовании делителя,возможно м/к откажется прошиваться - для исправления ситуации воспользуйтесь опцией -B 20 .
При прошивке через плату Arduino необходимо указать СОМ порт.
Оптимизация размера прошивки:
При использовании Attiny13, где всего 1024 байт, могут возникнуть трудности с размером прошивки. Некоторые комбинации настроек могут уместить все необходимые функции:
1. Двоичный протокол занимает меньше кода,чем троичный.
2. Хотя ключи можно писать шестизначные, но если датчиков мало,то ограничтесь 5 значными значениями (до 32767).
3. Включение делителя может так же уменьшить код.
4. Если беспроводной датчик не будет питаться от батареек/аккумуляторов,то в использовании спящего режима нет смысла.
Конструктор прошивки:
Беспроводной датчик температуры ST-1.1200.Kl
Цена с НДС от 3416 руб.
• может быть изготовлен со съемным электронным модулем
• большой ресурс работы до смены элемента питания
• широкий диапазон температуры эксплуатации
• возможность контроля температуры движущихся объектов
Количество каналов измерения температуры – 1.
Диапазон измерения температуры, в зависимости от конструктивного исполнения датчика:
– Kl0 – от минус 50 до плюс 1200°С;
– Kl1–2 – от минус 50 до плюс 800°С.
Пределы допускаемой абсолютной погрешности, не более ±(0,5+0,0025Т) °С, где Т – температура измеряемой среды, °С.
Дополнительная погрешность не более ±0,1°С на каждые 10°С изменения температуры окружающей среды.
Тип используемого чувствительного элемента – термопара ХА(К) по ГОСТ Р 8.585–2001.
Частотный диапазон связи с измерительным прибором – от 2,4 до 2,4835 ГГц.
Дальность связи между датчиком и прибором в здании (прямая видимость):
– для датчика с внешней антенной с усилением 3 dB – 70 м;
– для датчика с внутренней антенной – 30 м.
Напряжение питания – 3,6 В (тионил – хлоридная батарея 1/2АА (ER14250M EEMB)
Средняя потребляемая мощность при периоде передачи датчика 10 сек – не более 0,15 мВт.
Продолжительность работы при температуре (20±5)°С, периоде опроса датчика 10 сек и указанном выше элементе питания составляет 19 месяцев.
Протокол связи с датчиками – специально разработанный протокол LP–Sensor (Low Power sensor) с разделением (синхронизацией) по времени передачи каналов (датчиков).
При этом, датчик основное время находится в состоянии низкого энергопотребления (Sleep режим), а длительность цикла приёма передачи составляет порядка 62 мс с периодом от 1 с.
Период опроса (передачи) датчика: от 1 до 60 секунд (устанавливается пользователем на измерительном приборе).
Разрешающая способность датчика в диапазоне:
– от минус 40 до 999°С – ±0,1 °С;
– от 1000 до 1200°С – ±1,0 °С.
Средняя наработка на отказ – не менее 20000 ч.
Средний срок службы – 5 лет.
Конструктивные исполнения и условные обозначения датчиков температуры беспроводных ST–1.1200.Kl
Погода в доме: беспроводной метеодатчик из Arduino Pro Mini
%img src="http://img.mysku-st.ru/250/i.ebayimg.com/00/s/NTAwWDUwMA==/$(KGrHqF,!osFCrtd-(wtBQ7pokLqDQ
60_1.JPG" /%
В прошлом рассказе про то, что можно сделать из Arduino. мне предложили делать погоду и бросать ее в сеть. Не сказать, чтобы это мне это было сильно нужно, но сама идея осталась в голове и это обстоятельство представляло хотя и смутное, но постоянное беспокойство.
Так что я решил попробовать, и закрыть этот вопрос раз и навсегда. Тем более, что тот самый рассказ стал призовым, и позволил мне купить практические все необходимое, чтобы решить задачу.
В некотором смысле это спасибо MySKU и всем, кому понравились игрушки из Arduino.
Arduino Pro Mini
Плата совершенно крошечная. Я даже не ожидал, что настолько. Но при этом на ней — взрослый чип ATmega328, так что по производительности она не уступает той же Uno. Это версия 5В, питается или от 5В стабилизированного по любому пину VCC или же от 5 — 12В по пину RAW (если верить Arduino.cc). По-моему, очень удобно.
Это уже проверенные (не в этом магазине, а вообще) простейшие приемники и передатчики с амплитудной модуляцией. У них нет никаких средств коррекции ошибок и контроля передачи, зато они крайне дешевы и без проблем работают с нужными мне устройствами (розетками, выключателями и с самими собой).
Очень простой, недорогой и универсальный — есть питание 5В и 3.3В на выбор. Нужен, чтобы загружать код в Arduino Pro Mini, так как у платы нет своего USB. Шлейф, который вы видите на фото, входит в комплект. И хотя ничего необычного в нем нет — обычные четыре провода, все равно приятно.
Заказывал часы для жены, но 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В.
Поэтому рассматриваю две альтернативы. Первая — эксперименты со «спящим» режимом. Вторая — бросить эти девичьи мечты об автономности и запитать уже от электрической сети.
Ну а пока наслаждаюсь тем, что датчик вообще работает :)