Рейтинг@Mail.ru

Чтение данных датчика погоды BL999 с помощью Arduino

4 комментарии Arduino
Print Friendly, PDF & Email
Рассмотрим, как получать и расшифровывать с помощью Arduino метеоданные датчика BL999 от комнатной метеостанции фирмы Ea2.

Нам понадобится:

1Описание метеодатчика BL999 и его информационного протокола

Датчик BL999 – это недорогой датчик температуры и влажности, который используется в комплекте с домашними метеостанциями. Датчик может работать как в комнате, так и на улице. Периодически он передаёт метеостанции по радиоканалу данные измерений и отчёт о своём состоянии. Подобные погодные датчики сейчас очень распространены. Рассматриваемый сенсор BL999 имеет следующие характеристики:

  • диапазон измеряемых температур: −40…+50°C;
  • диапазон измеряемой влажности: 1…99%;
  • период измерений: 30 сек;
  • рабочая радиочастота: 433,325 МГц;
  • число каналов: 3;
  • рабочее расстояние: до 30 м на открытых пространствах.

К одной метеостанции можно подключить до трёх таких датчиков. Номер (канал) датчика устанавливается переключателем, который расположен под съёмной крышкой батарейного отсека (трёхпозиционная кнопка SW1 на фото ниже). Фактически, канал здесь – это просто признак в структуре пакета данных датчика, никакого физического смысла (например, изменение рабочей частоты) он в себе не несёт.

Чтобы лучше понять протокол датчика, с помощью которого он отправляет данные метеостанции, можно попытаться воспользоваться радиоприёмником и разбираться с тем, что приходит из радиоэфира. Но на популярной частоте 433 МГц работает множество бытовых устройств, и приёмник будет ловить большое количество посторонних шумов. Этот факт не позволит нам спокойно изучить протокол датчика.

Внешний вид и внутренности метеодатчика BL999
Внешний вид и внутренности метеодатчика BL999

Поэтому давайте для начала разберём датчик и подключимся осциллографом прямо к выходу, который генерирует цифровой сигнал непосредственно перед отправкой на передающую антенну. Землю можно найти возле «минуса» батареи в отсеке для батарей, а сигнальный провод подключим к верхнему выводу платы, как на фотографии. Для быстрого теста я подключил миниатюрный осциллограф DS203. На осциллограмме видно, что датчик генерирует какой-то сигнал. Далее этот сигнал поступает на передающую антенну и излучается в пространство.

Места подключения щупа осциллографа к метеодатчику BL999
Места подключения щупа осциллографа к метеодатчику BL999

Чтобы изучить генерируемый датчиком сигнал, нужен хороший осциллограф. Данные отправляются пакетами длительностью примерно 500…600 мс. Вот как выглядит типичный пакет с датчика BL999 на экране осциллографа.

Изучение сигнала метеодатчика BL999
Изучение сигнала метеодатчика BL999
Типичный пакет метеодатчика BL999 на экране осциллографа
Типичный пакет метеодатчика BL999 на экране осциллографа

Снимок экрана для этого пакета. Здесь красным цветом показан аналоговый сигнал, а голубым – оцифрованный сигнал, без присущих аналоговым сигналам искажений.

Осциллограмма типичного пакета метеодатчика BL999
Осциллограмма типичного пакета метеодатчика BL999

Вот представлены 4 оцифрованных информационных пакета, сгенерированных датчиком. Эти пакеты пришли друг за другом с разницей в 30 секунд. Именно с такой периодичностью датчик BL999 отсылает свои данные.

Информационные пакеты метеодатчика BL999
Информационные пакеты метеодатчика 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-ти битах:

Назначение битов информационного пакета метеодатчика BL999 в одной группе
Назначение битов информационного пакета метеодатчика BL999 в одной группе

Полубайт также называют «ниббл» (англ. nibble) или тетрада. Это единица измерения информации, содержащая четыре бита.

Давайте разберём реальный пример, и на его основе расшифруем закодированные в нём данные. Возьмём одну группу из 36-ти битов из вот такого пакета, пришедшего от датчика BL999:

Пример информационного пакета метеодатчика BL999
Пример информационного пакета метеодатчика BL999

В пакете, согласно схеме, присутствуют следующие части:

ОбозначениеНомера битовОписаниеЗначение из примера
ID35…32, 29…28Это идентификатор датчика. Он задаётся произвольным образом и изменяется при каждом включении. 0101_11 = 23
Chan31…30Номер канала датчика. Кодируется обычным двоичным кодом: "01" – 1, "10" – 2, "11" – 3.01 = 1ый канал
Bat27Уровень заряда батареи: "0" – норма, "1" – низкий заряд.0 = норма
?26…24Нет данных.100
Temperature23…12Данные температуры. Число записано в обратном порядке и умножено на 10. Отрицательные температуры, кроме этого, хранятся в дополнительном коде (*). 0111_1111_0000 обращение 0000_1111_1110 = 254 деление на 10 25,4°C
Humidity11…4Влажность. Записывается как результат вычитания из 100, в дополнительном коде (*). 0000_1101 обращение 1011_0000 инверсия битов 0100_1111=79 +1 =80 вычитание из 100% 100 − 80 = 20%
Checksum3…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, и земля к земле, соответственно.

Приёмник XY-MK-5V и Arduino Nano принимают сигнал датчика BL999
Приёмник XY-MK-5V и Arduino Nano принимают сигнал датчика BL999

Существует отличная библиотека для Arduino, которая позволяет получать по радиоканалу и декодировать данные датчика BL999. Скачаем библиотеку, распакуем в папку libraries, откроем пример из библиотеки и загрузим в память Arduino. Если поблизости есть датчик BL999, то в мониторе последовательного порта Arduino IDE мы должны увидеть следующее:

Вывод скетча для метеодатчика BL999 в Arduino IDE
Вывод скетча для метеодатчика BL999 в Arduino IDE

Не забудьте настроить монитор порта на скорость 115200 бит/с: именно такая скорость используется автором библиотеки для передачи данных от Arduino.

Демонстрация работы скетча по приёму метеоданных с датчика BL999
Последнее изменениеВторник, 09 Январь 2024 20:20 Прочитано 16744 раз

Поблагодарить автора:

Поделиться

Print Friendly, PDF & Email

4 комментарии

  • Валентина Владимировна
    Валентина Владимировна 04.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
    aave1 05.04.2020 15:48 Комментировать

    Добрый день, Валентина Владимировна!

    Я не имею в наличии станции GAL WS-1501, чтобы проверить на совместимость с датчиком BL999. Протокол обмена у датчиков Вашей метеостанции закрытый. По крайней мере, разработчик их нигде не выкладывает и на запрос предоставить мне не ответил. Поэтому есть вариант только попробовать проверить совместимость экспериментально. Но я практически уверен, что они несовместимы.

  • Михаил
    Михаил 18.07.2022 09:06 Комментировать

    подскажите вы же как то считали данные по радиоканалу, то есть ели этот код залить на передатчик возможно ли сделать датчик который будет связываться со станцией? или эта библиотека подойдет только для приема?

  • aave1
    aave1 18.07.2022 19:23 Комментировать

    Михаил! Конкретно описанная библиотека предназначена только для приёма. Но вам никто не мешает написать свою программу для передатчика, т.к. в данной библиотеке и статье описан формат пакета метеодатчика. Придётся поработать, но всё же это не то же самое, что начинать с нуля :)

Оставить комментарий