[Из песочницы] Подключаем китайскую метеостанцию

В сети широко рассматривался вариант реализации датчика температуры, выполненного на микросхеме DS18B20 и подключенного к роутеру TP-link MR-3020 (с прошивкой OpenWRT) через преобразователь PL2303.Утилитой digitemp датчик читался и данные отправлялись на сайт narodmon.ru.Но данного функционала оказалось маловато, захотелось чего-то большего…На китайском сайте была заказана погодная станция (Weather Station). Внешний вид:

1bdde5dffbf24e529bbb5097f68e9c66

Сие чудо китайской инженерии согласно описанию имеет довольно сносные технические характеристики и позволяет измерять следующие параметры:

температуру воздуха; влажность воздуха; скорость ветра; направление ветра; величину атмосферных осадков. Единственный минус, так это отсутствие показаний величины атмосферного давления.Долгожданный девайс был получен и собран, но уже с самого начала он отказался стабильно работать. При включении приемный блок не хотел показывать параметры. Вынимал батарейки из приемного и передающего блоков, лишь иногда показания появлялись. В общем больше времени не работало, чем работало.

Решено было разобрать передатчик и посмотреть его работу осциллографом.

Опытным путем была найдена цепь модулятора, формирующая осциллограммы следующего вида:

535e41761c0641848e65eaec54fb4b2a

Передавалось последовательно две одинаковых посылки, затем передатчик молчал около 40 секунд.

На одном форуме ребята подсказали, что кодировка посылки напоминает манчестерский код.

Было принято решение сделать устройство приема сигнала («аппаратный сниффер») и посмотреть структуру сообщения, в надежде на возможное вскрытие и извлечение полезной информации.

В загашнике валялось пару отладочных плат на микроконтроллере STM32F103C8T6, ранее приобретенных через китайский сайт:

02f134f7d94b4ae5a869d6b2cf477b81

Цепь модулятора была подцеплена на пины PA0, PA1, обработку импульсов осуществлял по прерываниям (по переднему и заднему фронту), биты паковали в байты и выводил через UART.

В результате был получены сообщения следующего вида: температура: 23 C влажность: 61%0xF5 0×3F 0×42 0×00 0xF0 0xE6 0×3D 0×00 0×00 0×00 0×01 0×00 0×8A 0×0Aтемпература: 22,4 C влажность: 53%0xF5 0×3F 0×42 0×00 0xF0 0xE0 0×35 0×00 0×00 0×00 0×01 0×00 0×7C 0×76температура: 27,7 C влажность: 20%0xF5 0×3F 0×42 0×00 0xF1 0×15 0×14 0×00 0×00 0×00 0×01 0×00 0×91 0×8B

После длительных наблюдений за принятыми сообщениями удалось выявить какой байт что кодирует.Видимо китайцы сильно не заморачивались при реализации данного протокола, все довольно просто и наглядно. Единственное, только не удалось определить алгоритм вычисления контрольной суммы (последние 2 байта), но и так жить можно.

Пока продолжались изыскания, решено было в довесок ко всему прикрутить датчик атмосферного давления BMP085 (на платке с обвязкой около 200 руб. у китайцев). Выглядит вот так:

c799e3edf6204fe2838076f1f44fc686

Прицепил его к отладочной плате по I2C, исходный код для работы с ним найден в сети. Все сразу заработало. Появилась возможность измерять атмосферное давление, температуру и вычислять высоту.Теперь, в ответ на запрос (отправляем по UART знак »?») получаем следующее сообщение:

01 Pressure: 762.02 mmHg 02 Temp_indoor: 23.10 C 03 Humidity: 37% 04 Temp_outdoor: 19.00 C 05 Wind_speed: 2.0 m/s 06 Wind_direction: 360 07 Precipitation: 0 mm Теперь все надо запаковать и отправить в сеть на narodmon, для чего подключаем отладочную плату к роутеру MR-3020: 79f8a70149344331bf9648a78cbd4e9b

Прошивка кастомная, с поддержкой 3G модема (делал ставку на автономность).

Вот такой скрипт дергаю cron«ом каждые 6 минут:

#!/bin/sh

TEST_WAN=»`ifconfig | grep 3g | cut -b 1`» if [ »$TEST_WAN» = 3 ]; then # echo »3G-WAN OK» logger »3G router OK» else reboot && exit fi #----------------------------------------------------------------- ifconfig | grep HWaddr | awk '{FS=» »; if (NR==1) {print »#»$5;}}' > /var/log/HWaddr count=0 echo »?» > /dev/ttyUSB0 sed -e 's/:/-/g' /var/log/HWaddr > /var/log/temp while read -t 3 LINE < /dev/ttyUSB0 ; do echo $LINE | awk '{FS=" "; if($3==":") { print MAC $1"#"$4;}}' MAC=`cat /var/log/HWaddr` >> /var/log/temp done < /dev/ttyUSB0

rm /var/log/HWaddr echo »##» >> /var/log/temp sed -e 's/://g' /var/log/temp > /var/log/narodmon rm /var/log/temp cat /var/log/narodmon LC=`cat /var/log/narodmon | wc -l` if [ $LC -gt 2 ] then cat /var/log/narodmon | nc narodmon.ru 8283 > /var/log/narodmon.log fi

Вот результат работы скрипта:

#64–65-B3–2C-25-AA #6465B32C25AA01#740.46 #6465B32C25AA02#25.50 #6465B32C25AA03#27 #6465B32C25AA04#29.50 #6465B32C25AA05#0.00 #6465B32C25AA06#NONE #6465B32C25AA07#0 ## Да, еще в автозагрузку прописываем инициализацию настроек порта:

stty -F /dev/ttyUSB0 cs8 57600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts -hupcl

В итоге получаем возможность смотреть и сохранять кучу параметров о погоде.

© Habrahabr.ru