Чтение данных датчика погоды BL999 с помощью Arduino
Нам понадобится:
- датчик BL999 от комнатной метеостанции (вроде такой);
- плата Arduino 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
Latest from aave
- Как сделать пульт для умной сигнализации с помощью Arduino
- Программная реализация кодера свёрточного кода и декодера по алгоритму Витерби
- Аппаратная реализация декодера свёрточного кода по алгоритму Витерби
- Код программы перевода числа из произвольной системы счисления в другую произвольную
- Кодирование и декодирование свёрточного кода по алгоритму Витерби
2 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. Протокол обмена у датчиков Вашей метеостанции закрытый. По крайней мере, разработчик их нигде не выкладывает и на запрос предоставить мне не ответил. Поэтому есть вариант только попробовать проверить совместимость экспериментально. Но я практически уверен, что они несовместимы.