http://habrahabr.ru/post/241599/
В сети широко рассматривался вариант реализации датчика температуры, выполненного на микросхеме DS18B20 и подключенного к роутеру TP-link MR-3020 ( с прошивкой OpenWRT) через преобразователь PL2303.
Утилитой digitemp датчик читался и данные отправлялись на сайт narodmon.ru.
Но данного функционала оказалось маловато, захотелось чего-то большего…
На китайском сайте была заказана погодная станция (Weather Station). Внешний вид:
Сие чудо китайской инженерии согласно описанию имеет довольно сносные технические характеристики и позволяет измерять следующие параметры:
- температуру воздуха;
- влажность воздуха;
- скорость ветра;
- направление ветра;
- величину атмосферных осадков.
Единственный минус, так это отсутствие показаний величины атмосферного давления.
Долгожданный девайс был получен и собран, но уже с самого начала он отказался стабильно работать. При включении приемный блок не хотел показывать параметры. Вынимал батарейки из приемного и передающего блоков, лишь иногда показания появлялись. В общем больше времени не работало, чем работало.
Решено было разобрать передатчик и посмотреть его работу осциллографом.
Опытным путем была найдена цепь модулятора, формирующая осциллограммы следующего вида:
Передавалось последовательно две одинаковых посылки, затем передатчик молчал около 40 секунд.
На одном форуме ребята подсказали, что кодировка посылки напоминает манчестерский код.
Было принято решение сделать устройство приема сигнала («аппаратный сниффер») и посмотреть структуру сообщения, в надежде на возможное вскрытие и извлечение полезной информации.
В загашнике валялось пару отладочных плат на микроконтроллере STM32F103C8T6, ранее приобретенных через китайский сайт:
Цепь модулятора была подцеплена на пины PA0, PA1, обработку импульсов осуществлял по прерываниям (по переднему и заднему фронту), биты паковали в байты и выводил через UART.
В результате был получены сообщения следующего вида:
температура: 23 C влажность: 61%
0xF5 0x3F 0x42 0x00 0xF0 0xE6 0x3D 0x00 0x00 0x00 0x01 0x00 0x8A 0x0A
температура: 22,4 C влажность: 53%
0xF5 0x3F 0x42 0x00 0xF0 0xE0 0x35 0x00 0x00 0x00 0x01 0x00 0x7C 0x76
температура: 27,7 C влажность: 20%
0xF5 0x3F 0x42 0x00 0xF1 0x15 0x14 0x00 0x00 0x00 0x01 0x00 0x91 0x8B
После длительных наблюдений за принятыми сообщениями удалось выявить какой байт что кодирует.Видимо китайцы сильно не заморачивались при реализации данного протокола, все довольно просто и наглядно. Единственное, только не удалось определить алгоритм вычисления контрольной суммы (последние 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
В итоге получаем возможность смотреть и сохранять кучу параметров о погоде.