[Из песочницы] Подключаем китайскую метеостанцию
В сети широко рассматривался вариант реализации датчика температуры, выполненного на микросхеме DS18B20 и подключенного к роутеру TP-link MR-3020 (с прошивкой OpenWRT) через преобразователь PL2303.Утилитой digitemp датчик читался и данные отправлялись на сайт narodmon.ru.Но данного функционала оказалось маловато, захотелось чего-то большего…На китайском сайте была заказана погодная станция (Weather Station). Внешний вид:
Сие чудо китайской инженерии согласно описанию имеет довольно сносные технические характеристики и позволяет измерять следующие параметры:
температуру воздуха; влажность воздуха; скорость ветра; направление ветра; величину атмосферных осадков. Единственный минус, так это отсутствие показаний величины атмосферного давления.Долгожданный девайс был получен и собран, но уже с самого начала он отказался стабильно работать. При включении приемный блок не хотел показывать параметры. Вынимал батарейки из приемного и передающего блоков, лишь иногда показания появлялись. В общем больше времени не работало, чем работало.
Решено было разобрать передатчик и посмотреть его работу осциллографом.
Опытным путем была найдена цепь модулятора, формирующая осциллограммы следующего вида:
Передавалось последовательно две одинаковых посылки, затем передатчик молчал около 40 секунд.
На одном форуме ребята подсказали, что кодировка посылки напоминает манчестерский код.
Было принято решение сделать устройство приема сигнала («аппаратный сниффер») и посмотреть структуру сообщения, в надежде на возможное вскрытие и извлечение полезной информации.
В загашнике валялось пару отладочных плат на микроконтроллере STM32F103C8T6, ранее приобретенных через китайский сайт:
Цепь модулятора была подцеплена на пины 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 руб. у китайцев). Выглядит вот так:
Прицепил его к отладочной плате по 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:
Прошивка кастомная, с поддержкой 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
В итоге получаем возможность смотреть и сохранять кучу параметров о погоде.