Чтение данных датчика погоды BL999 с помощью Arduino
Нам понадобится:
- датчик BL999 от комнатной метеостанции (вроде такой);
- плата Arduino UNO, Nano или любой другой модификации;
- радиоприёмник XY-MK-5V;
- соединительные провода (рекомендую вот такой набор);
- макетная плата (breadboard);
- компьютер с установленной Arduino IDE или другой средой разработки.
1Описание метеодатчика BL999 и его информационного протокола
Датчик BL999 – это недорогой датчик температуры и влажности, который используется в комплекте с домашними метеостанциями. Датчик может работать как в комнате, так и на улице. Периодически он передаёт метеостанции по радиоканалу данные измерений и отчёт о своём состоянии. Подобные погодные датчики сейчас очень распространены. Рассматриваемый сенсор BL999 имеет следующие характеристики:
- диапазон измеряемых температур: −40…+50°C;
- диапазон измеряемой влажности: 1…99%;
- период измерений: 30 сек;
- рабочая радиочастота: 433,325 МГц;
- число каналов: 3;
- рабочее расстояние: до 30 м на открытых пространствах.
К одной метеостанции можно подключить до трёх таких датчиков. Номер (канал) датчика устанавливается переключателем, который расположен под съёмной крышкой батарейного отсека (трёхпозиционная кнопка SW1 на фото ниже). Фактически, канал здесь – это просто признак в структуре пакета данных датчика, никакого физического смысла (например, изменение рабочей частоты) он в себе не несёт.
Чтобы лучше понять протокол датчика, с помощью которого он отправляет данные метеостанции, можно попытаться воспользоваться радиоприёмником и разбираться с тем, что приходит из радиоэфира. Но на популярной частоте 433 МГц работает множество бытовых устройств, и приёмник будет ловить большое количество посторонних шумов. Этот факт не позволит нам спокойно изучить протокол датчика.
Поэтому давайте для начала разберём датчик и подключимся осциллографом прямо к выходу, который генерирует цифровой сигнал непосредственно перед отправкой на передающую антенну. Землю можно найти возле «минуса» батареи в отсеке для батарей, а сигнальный провод подключим к верхнему выводу платы, как на фотографии. Для быстрого теста я подключил миниатюрный осциллограф DS203. На осциллограмме видно, что датчик генерирует какой-то сигнал. Далее этот сигнал поступает на передающую антенну и излучается в пространство.
Чтобы изучить генерируемый датчиком сигнал, нужен хороший осциллограф. Данные отправляются пакетами длительностью примерно 500…600 мс. Вот как выглядит типичный пакет с датчика BL999 на экране осциллографа.
Снимок экрана для этого пакета. Здесь красным цветом показан аналоговый сигнал, а голубым – оцифрованный сигнал, без присущих аналоговым сигналам искажений.
Вот представлены 4 оцифрованных информационных пакета, сгенерированных датчиком. Эти пакеты пришли друг за другом с разницей в 30 секунд. Именно с такой периодичностью датчик BL999 отсылает свои данные.
Посмотрим на этот сигнал. С первого взгляда бросается в глаза, что:
- данные передаются пакетами;
- каждый пакет начинается с короткого импульса, за которым следует относительно длительный промежуток времени с нулевым уровнем;
- в каждом пакете присутствует 4 группы импульсов, разделённых такими же длительными паузами;
- в каждой группе содержатся импульсы, следующие друг за другом через короткие или вдвое более длинные паузы;
- всего имеются 3 вида промежутков между импульсами: самые короткие (условно назовём их типа A), вдвое более длинные (B) и вчетверо более длинные (C);
- в каждой группе ровно по 37 импульсов;
- все 4 группы каждого пакета одинаковые (содержат повторяющиеся последовательности импульсов).
Очевидно, что в данном случае применяется некое временное кодирование (скорее всего, фазо-импульсное или частотно-импульсное), когда значимая информация скрыта в длительности пауз между импульсами. В случае датчика BL999 короткая пауза между соседними импульсами (A) означает логический нуль, а длинная (B) – логическую единицу. Изучим сигнал более детально.
Как видно, в сигнале присутствует ряд коротких импульсов. Длительность всех импульсов одинакова и равна примерно 486 мкс. Длительность коротких промежутков (логический "0") равна примерно 2,4 мс, длительность средних промежутков (логическая "1") равна примерно 4,5 мс. Продолжительность самых длинных промежутков – около 9,4 мс.
Как уже было упомянуто, в пакете присутствуют 4 группы по 37 импульсов. Этими импульсами закодированы 36 битов, которые можно условно разбить на участки по 9 полубайтов. Следующий рисунок показывает, что закодировано в этих 36-ти битах:
Полубайт также называют «ниббл» (англ. nibble) или тетрада. Это единица измерения информации, содержащая четыре бита.
Давайте разберём реальный пример, и на его основе расшифруем закодированные в нём данные. Возьмём одну группу из 36-ти битов из вот такого пакета, пришедшего от датчика BL999:
В пакете, согласно схеме, присутствуют следующие части:
Обозначение | Номера битов | Описание | Значение из примера |
---|---|---|---|
ID | 35…32, 29…28 | Это идентификатор датчика. Он задаётся произвольным образом и изменяется при каждом включении. | 0101_11 = 23 |
Chan | 31…30 | Номер канала датчика. Кодируется обычным двоичным кодом: "01" – 1, "10" – 2, "11" – 3. | 01 = 1ый канал |
Bat | 27 | Уровень заряда батареи: "0" – норма, "1" – низкий заряд. | 0 = норма |
? | 26…24 | Нет данных. | 100 |
Temperature | 23…12 | Данные температуры. Число записано в обратном порядке и умножено на 10. Отрицательные температуры, кроме этого, хранятся в дополнительном коде (*). | 0111_1111_0000 обращение 0000_1111_1110 = 254 деление на 10 25,4°C |
Humidity | 11…4 | Влажность. Записывается как результат вычитания из 100, в дополнительном коде (*). | 0000_1101 обращение 1011_0000 инверсия битов 0100_1111=79 +1 =80 вычитание из 100% 100 − 80 = 20% |
Checksum | 3…0 | Контрольная сумма. Вычисляется как сумма 8-ми полубайтов, записанных в обратном порядке. От получившегося числа берутся 4 младших разряда и также записываются в обратном порядке. | 0101 0111 0100 0111 1111 0000 0000 1101 0100 1010 + 1110 + 0010 + 1110 + 1111 + 0 + 0 + 1011 = 100_0010 обращаем 0010 0100 |
(*) Дополнительный код числа – это специальный вид представления чисел, который часто используется в вычислительной технике. Онлайн-калькулятор и хорошая статья на эту тему здесь.
Каждая группа из 36 битов повторяется в пакете по 4 раза, что сделано для повышения надёжности приёма. Если в каком-то из четырёх дублей из-за помех в радиолинии контрольная сумма не сошлась, возьмём тот из четырёх, где с контрольной суммой всё в порядке.
2Приём данных с метеодатчика BL999при помощи Arduino
Для того чтобы мы могли принимать данные с метеодатчика, нам нужен радиоприёмник, работающий на частоте 433 МГц. Прекрасно подойдёт копеечный модуль XY-MK-5V, который работает как раз на этой частоте. Мы уже не раз использовали его в своих проектах. Подключается он элементарно: вывод Data – к любому цифровому выводу Arduino, питание – к +5V Arduino, и земля к земле, соответственно.
Существует отличная библиотека для Arduino, которая позволяет получать по радиоканалу и декодировать данные датчика BL999. Скачаем библиотеку, распакуем в папку libraries, откроем пример из библиотеки и загрузим в память Arduino. Если поблизости есть датчик BL999, то в мониторе последовательного порта Arduino IDE мы должны увидеть следующее:
Не забудьте настроить монитор порта на скорость 115200 бит/с: именно такая скорость используется автором библиотеки для передачи данных от Arduino.
Поблагодарить автора:
Поделиться
Related items
4 comments
-
Валентина Владимировна Суббота, 04 Апрель 2020 18:06 Ссылка на комментарий
Уважаемый автор!
У меня проблема: в датчик bl999 для метеостанции Ea2 AL808 (произв. 2013 г.). попала вода, всё заржавело, он НЕРАБОТОСПОСОБЕН.
У меня есть еще одна метеостанция - GAL (модель GAL WS-1501 SN: AF1H80545, произв. октябрь 2017 г.) .
Можно ли использовать датчик для GAL WS-1501 SN: AF1H80545 вместо bl999 для Ea2 al808 ?
Я искала ответ в интернете - не нашла, всё, скорее всего, зависит от протоколов передачи данных так как характеристики этих датчиков одинаковые.
Может быть, Вы занимались протоколами передачи данных других датчиков?
Пожалуйста, дайте ответ - это, конечно, НЕ ВОПРОС ЖИЗНИ И СМЕРТИ, но если есть уже один датчик, нужно ли покупать ещё, тем более, что bl999 в продаже бывает очень редко. -
aave1 Воскреснье, 05 Апрель 2020 15:48 Ссылка на комментарий
Добрый день, Валентина Владимировна!
Я не имею в наличии станции GAL WS-1501, чтобы проверить на совместимость с датчиком BL999. Протокол обмена у датчиков Вашей метеостанции закрытый. По крайней мере, разработчик их нигде не выкладывает и на запрос предоставить мне не ответил. Поэтому есть вариант только попробовать проверить совместимость экспериментально. Но я практически уверен, что они несовместимы. -
Михаил Понедельник, 18 Июль 2022 09:06 Ссылка на комментарий
подскажите вы же как то считали данные по радиоканалу, то есть ели этот код залить на передатчик возможно ли сделать датчик который будет связываться со станцией? или эта библиотека подойдет только для приема?
-
aave1 Понедельник, 18 Июль 2022 19:23 Ссылка на комментарий
Михаил! Конкретно описанная библиотека предназначена только для приёма. Но вам никто не мешает написать свою программу для передатчика, т.к. в данной библиотеке и статье описан формат пакета метеодатчика. Придётся поработать, но всё же это не то же самое, что начинать с нуля :)