Temperature remote sensor bl999 что это
Чтение данных датчика погоды BL999 с помощью Arduino
1 Описание метеодатчика BL999 и его информационного протокола
Датчик BL999 – это недорогой датчик температуры и влажности, который используется в комплекте с домашними метеостанциями. Датчик может работать как в комнате, так и на улице. Периодически он передаёт метеостанции по радиоканалу данные измерений и отчёт о своём состоянии. Подобные погодные датчики сейчас очень распространены. Рассматриваемый сенсор BL999 имеет следующие характеристики:
К одной метеостанции можно подключить до трёх таких датчиков. Номер (канал) датчика устанавливается переключателем, который расположен под съёмной крышкой батарейного отсека (трёхпозиционная кнопка SW1 на фото ниже). Фактически, канал здесь – это просто признак в структуре пакета данных датчика, никакого физического смысла (например, изменение рабочей частоты) он в себе не несёт.
Чтобы лучше понять протокол датчика, с помощью которого он отправляет данные метеостанции, можно попытаться воспользоваться радиоприёмником и разбираться с тем, что приходит из радиоэфира. Но на популярной частоте 433 МГц работает множество бытовых устройств, и приёмник будет ловить большое количество посторонних шумов. Этот факт не позволит нам спокойно изучить протокол датчика.
Внешний вид и внутренности метеодатчика BL999
Поэтому давайте для начала разберём датчик и подключимся осциллографом прямо к выходу, который генерирует цифровой сигнал непосредственно перед отправкой на передающую антенну. Землю можно найти возле «минуса» батареи в отсеке для батарей, а сигнальный провод подключим к верхнему выводу платы, как на фотографии. Для быстрого теста я подключил миниатюрный осциллограф DS203. На осциллограмме видно, что датчик генерирует какой-то сигнал. Далее этот сигнал поступает на передающую антенну и излучается в пространство.
Места подключения щупа осциллографа к метеодатчику BL999
Чтобы изучить генерируемый датчиком сигнал, нужен хороший осциллограф. Данные отправляются пакетами длительностью примерно 500…600 мс. Вот как выглядит типичный пакет с датчика BL999 на экране осциллографа.
Изучение сигнала метеодатчика BL999 Типичный пакет метеодатчика BL999 на экране осциллографа
Снимок экрана для этого пакета. Здесь красным цветом показан аналоговый сигнал, а голубым – оцифрованный сигнал, без присущих аналоговым сигналам искажений.
Осциллограмма типичного пакета метеодатчика BL999
Вот представлены 4 оцифрованных информационных пакета, сгенерированных датчиком. Эти пакеты пришли друг за другом с разницей в 30 секунд. Именно с такой периодичностью датчик BL999 отсылает свои данные.
Информационные пакеты метеодатчика BL999
Посмотрим на этот сигнал. С первого взгляда бросается в глаза, что:
Очевидно, что в данном случае применяется некое временное кодирование (скорее всего, фазо-импульсное или частотно-импульсное), когда значимая информация скрыта в длительности пауз между импульсами. В случае датчика BL999 короткая пауза между соседними импульсами (A) означает логический нуль, а длинная (B) – логическую единицу. Изучим сигнал более детально.
Длительность пауз логических нулей и логических единиц | Длительность между первым импульсом и данными, а также между группами |
Длительность всех импульсов одинакова (с допуском на погрешность) | Единичный импульс при большем увеличении масштаба по времени |
Как видно, в сигнале присутствует ряд коротких импульсов. Длительность всех импульсов одинакова и равна примерно 486 мкс. Длительность коротких промежутков (логический «0») равна примерно 2,4 мс, длительность средних промежутков (логическая «1») равна примерно 4,5 мс. Продолжительность самых длинных промежутков – около 9,4 мс.
Как уже было упомянуто, в пакете присутствуют 4 группы по 37 импульсов. Этими импульсами закодированы 36 битов, которые можно условно разбить на участки по 9 полубайтов. Следующий рисунок показывает, что закодировано в этих 36-ти битах:
Назначение битов информационного пакета метеодатчика BL999 в одной группе
Полубайт также называют «ниббл» (англ. nibble) или тетрада. Это единица измерения информации, содержащая четыре бита.
Давайте разберём реальный пример, и на его основе расшифруем закодированные в нём данные. Возьмём одну группу из 36-ти битов из вот такого пакета, пришедшего от датчика BL999:
Пример информационного пакета метеодатчика 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, и земля к земле, соответственно.
Приёмник XY-MK-5V и Arduino Nano принимают сигнал датчика BL999
Существует отличная библиотека для Arduino, которая позволяет получать по радиоканалу и декодировать данные датчика BL999. Скачаем библиотеку, распакуем в папку libraries, откроем пример из библиотеки и загрузим в память Arduino. Если поблизости есть датчик BL999, то в мониторе последовательного порта Arduino IDE мы должны увидеть следующее:
Вывод скетча для метеодатчика BL999 в Arduino IDE
Не забудьте настроить монитор порта на скорость 115200 бит/с: именно такая скорость используется автором библиотеки для передачи данных от Arduino.
Инструкция для EA2 BL999
БЕСПРОВОДНОЙ ДИСТАНЦИОННЫЙ ТЕРМО- ГИГРОДАТЧИК
РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
Различные варианты установки
Частота передачи сигнала: 433МГц
Радиус сигнала: 30 м на открытом пространстве
2. Беспроводной термо- гигродатчик
D1: Светодиод передачи сигнала
D2: Отверстие для закрепления на
стене
D3: Переключатель номера канала
D4: Кнопка «СБРОС НАСТРОЕК»
(“RESET”)
D5: Отсек для батареек
D6: Подставка
Открутите винты крышки отсека для батареек [D5], снимите ее.
Соблюдая полярность, вставьте две батарейки типа AAA.
Дистанционный датчик должен быть надежно закреплен в месте установки.
Передача данных осуществляется на расстояние до 30м на
открытом пространстве. Открытое пространство: местность без
препятствий – зданий, деревьев, механизмов, линий электропередач и тп.
Для достижения наилучшего качества передачи радиосигнала попробуйте
различные варианты расположения передающего и принимающего
устройств.
Оглавление инструкции
В состав обычных щелочных батареек входит значительное количество водного раствора, замерзающего при падении окружающей температуры до приблизительно –12°C. При более низких температурах рекомендуется использовать литиевые батарейки, способные функционировать до приблизительно –30°C. Замерзшие
Чтение данных датчика погоды BL999 с помощью Arduino
1 Описание метеодатчика BL999 и его информационного протокола
Датчик BL999 – это недорогой датчик температуры и влажности, который используется в комплекте с домашними метеостанциями. Датчик может работать как в комнате, так и на улице. Периодически он передаёт метеостанции по радиоканалу данные измерений и отчёт о своём состоянии. Подобные погодные датчики сейчас очень распространены. Рассматриваемый сенсор BL999 имеет следующие характеристики:
К одной метеостанции можно подключить до трёх таких датчиков. Номер (канал) датчика устанавливается переключателем, который расположен под съёмной крышкой батарейного отсека (трёхпозиционная кнопка SW1 на фото ниже). Фактически, канал здесь – это просто признак в структуре пакета данных датчика, никакого физического смысла (например, изменение рабочей частоты) он в себе не несёт.
Чтобы лучше понять протокол датчика, с помощью которого он отправляет данные метеостанции, можно попытаться воспользоваться радиоприёмником и разбираться с тем, что приходит из радиоэфира. Но на популярной частоте 433 МГц работает множество бытовых устройств, и приёмник будет ловить большое количество посторонних шумов. Этот факт не позволит нам спокойно изучить протокол датчика.
Внешний вид и внутренности метеодатчика BL999
Поэтому давайте для начала разберём датчик и подключимся осциллографом прямо к выходу, который генерирует цифровой сигнал непосредственно перед отправкой на передающую антенну. Землю можно найти возле «минуса» батареи в отсеке для батарей, а сигнальный провод подключим к верхнему выводу платы, как на фотографии. Для быстрого теста я подключил миниатюрный осциллограф DS203. На осциллограмме видно, что датчик генерирует какой-то сигнал. Далее этот сигнал поступает на передающую антенну и излучается в пространство.
Места подключения щупа осциллографа к метеодатчику BL999
Чтобы изучить генерируемый датчиком сигнал, нужен хороший осциллограф. Данные отправляются пакетами длительностью примерно 500…600 мс. Вот как выглядит типичный пакет с датчика BL999 на экране осциллографа.
Изучение сигнала метеодатчика BL999 Типичный пакет метеодатчика BL999 на экране осциллографа
Снимок экрана для этого пакета. Здесь красным цветом показан аналоговый сигнал, а голубым – оцифрованный сигнал, без присущих аналоговым сигналам искажений.
Осциллограмма типичного пакета метеодатчика BL999
Вот представлены 4 оцифрованных информационных пакета, сгенерированных датчиком. Эти пакеты пришли друг за другом с разницей в 30 секунд. Именно с такой периодичностью датчик BL999 отсылает свои данные.
Информационные пакеты метеодатчика BL999
Посмотрим на этот сигнал. С первого взгляда бросается в глаза, что:
Очевидно, что в данном случае применяется некое временное кодирование (скорее всего, фазо-импульсное или частотно-импульсное), когда значимая информация скрыта в длительности пауз между импульсами. В случае датчика BL999 короткая пауза между соседними импульсами (A) означает логический нуль, а длинная (B) – логическую единицу. Изучим сигнал более детально.
Длительность пауз логических нулей и логических единиц | Длительность между первым импульсом и данными, а также между группами |
Длительность всех импульсов одинакова (с допуском на погрешность) | Единичный импульс при большем увеличении масштаба по времени |
Как видно, в сигнале присутствует ряд коротких импульсов. Длительность всех импульсов одинакова и равна примерно 486 мкс. Длительность коротких промежутков (логический «0») равна примерно 2,4 мс, длительность средних промежутков (логическая «1») равна примерно 4,5 мс. Продолжительность самых длинных промежутков – около 9,4 мс.
Как уже было упомянуто, в пакете присутствуют 4 группы по 37 импульсов. Этими импульсами закодированы 36 битов, которые можно условно разбить на участки по 9 полубайтов. Следующий рисунок показывает, что закодировано в этих 36-ти битах:
Назначение битов информационного пакета метеодатчика BL999 в одной группе
Полубайт также называют «ниббл» (англ. nibble) или тетрада. Это единица измерения информации, содержащая четыре бита.
Давайте разберём реальный пример, и на его основе расшифруем закодированные в нём данные. Возьмём одну группу из 36-ти битов из вот такого пакета, пришедшего от датчика BL999:
Пример информационного пакета метеодатчика 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, и земля к земле, соответственно.
Приёмник XY-MK-5V и Arduino Nano принимают сигнал датчика BL999
Существует отличная библиотека для Arduino, которая позволяет получать по радиоканалу и декодировать данные датчика BL999. Скачаем библиотеку, распакуем в папку libraries, откроем пример из библиотеки и загрузим в память Arduino. Если поблизости есть датчик BL999, то в мониторе последовательного порта Arduino IDE мы должны увидеть следующее:
Вывод скетча для метеодатчика BL999 в Arduino IDE
Не забудьте настроить монитор порта на скорость 115200 бит/с: именно такая скорость используется автором библиотеки для передачи данных от Arduino.
Самодельная метеостанция Ea2 на ардуино за 300 рублей!
Шесть лет назад я написал обзор на метеостанцию Ea2 OP308 — она еще успешно исполняет свои обязанности, вместе с тремя датчиками BL999. Но, играясь в настоящее время с ардуино, я нашел интересную библиотеку lib_BL999. С помощью этой библиотеки и приемника 433 мегагерц, можно считывать данные с датчиков BL999. Собственно, предлагать скетчи здесь нет смысла, так как вполне рабочий скетч для вывода данных с датчиков в терминал предлагается в составе библиотеки.
Возможности использования этих данных ограничены только Вашей фантазией. Вот несколько вариантов:
Разумеется, считывание данных с датчиков BL999 никаким образом не мешает работе самой метеостанции Ea2 (встроенный в нее приемник считывает данные с датчиков одновременно с самодельным приемником — они друг другу не мешают).
Для примера я использовал Arduino Nano, приемник XY-MK-5V и LCD-экран типа Nokia 5110 для вывода температуры и влажности, но можно обойтись и без него, если выводить данные сразу в компьютер.
Данные выводятся верные, но только на небольшом расстоянии (меньше, чем расстояние приема оригинальной метеостанции). Для увеличения дальности приема нужно припаять к разъему антенны кусок проволоки длиной 173 мм, 345 мм или 691 мм (проверил на 173 мм, дальность приема действительно увеличивается).
Так что если Ваша метеостанция Ea2 сломалась, не огорчайтесь, ведь Вы можете без особых знаний в электронике сделать ее клон за сравнительно небольшие деньги (на 2019-й год это от 130 рублей за ардуино нано + 70 рублей за XY-MK-5V в комплекте с передатчиком, который не пригодится в этом проекте, ну а экран можно выбрать любой какой нравится; тот же экран для нокиа 5110 из примера стоит от 100-130 рублей). Таким образом, готовый работающий прототип будет стоить примерно 300 рублей, а не 1500-2000 рублей, как новая метеостанция — останется только оформить его по вкусу.
6 комментариев Самодельная метеостанция Ea2 на ардуино за 300 рублей!
А можно скетч для этого проекта ( http://tol.acritum.com/1282/ea2-bl999-arduino ) пожалуйста?
Это был «игрушечный» проект, просто чтобы убедиться, что это работает, поэтому скетча у меня не осталось. Но в библиотеке есть простой пример (https://github.com/sprilukin/lib_BL999/blob/master/examples/reciever/reciever.ino), просто заменяете Serial.println на функцию вывода на тот экран, который у Вас есть в наличии. Всю низкоуровневую возню берет на себя библиотека, так что никаких особо знаний и не требуется для создания своего термометра.
#include
// Connect the receiver to digital pin 2.-пин 2.это вход для Радиоприёмника
void setup() <
Serial.begin(115200);
RemoteReceiver::init(0, 3, showCode);
>
void loop() <
>
void showCode(unsigned long receivedCode, unsigned int period) <
Serial.print(«Code: «);
Serial.print(receivedCode);
Serial.print(«, period duration: «);
Serial.print(period);
Serial.println(«us.»);
>
#include
#include
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
void setup() <
// инициализация и очистка дисплея
display.begin();
display.clearDisplay();
display.display();
display.setContrast(60); // установка контраста
delay(1000);
display.setTextSize(1); // установка размера шрифта
display.setTextColor(BLACK); // установка цвета текста
display.setCursor(0, 0); // координаты начала текста
А в чем трудность? Serial.print — вывод в терминал, а display.print — вывод на экран. Меняешь serial.print на display.print, и после отправки всего нужного текста на экран вызываешь display.display(); для отрисовки и видишь текст на экране. Ну и, ясное дело, из секций второго скетча всё в соответсвующие разделы первого перенести, чтобы инициализировать экран перед тем, как выводить на него текст.
Это для Вас трудностей нет,а я не разу этого не делал.Я в этом дуб.Могу только тупо скетч залить в ардуину. И то только если знаю какие пины подключать и на какой ардуине. Мне-то надо на arduino mega 2560 PRO ( EMAED ). Помогите пожалуйста.Прошу.
Ну тут сложно помочь, все равно, что трехлетнему ребенку пытаться объяснять, как ЦПГ дизельного трактора перебрать 🙂 Логично сначала изучить принцип работы трактора, а потом уже пытаться его ремонтировать. В любом деле хотя бы основы надо изучить, иначе в чем вообще смысл этим заниматься? Почитайте сайты по ардуино, есть уроки для новичков, в том числе на youtube (что куда сувать, как светодиод зажечь, помигать им, включать/выключать что-то кнопкой). Почитайте/посмотрите хотя бы первые 10 уроков для новичков, через неделю уже будете сами понимать, что куда подключать и как изменить чужой скетч, чтобы он работал с вашим оборудованием. Просто перепечатывать все это из других форумов в этот не вижу смысла, так как тема не нова и уже очень много интересных и доступных для понимания самоучителей можно найти в интернете.