подключение передатчика от китайской метеостанции
- Войдите на сайт для отправки комментариев
Всем здравствуйте.
Имеется безимянный 433МГц передатчик от метеостанции, на плате есть точки подключения питания и данных (как считывать по радио каналу еще не разбирался). Подключал датчик к осцилографу, способ кодирования узнал, нужные данные расшифровал. Как это лучше сделать на ардуине нано с атмега328?
Протокол передачи: 1-высокий уровень 500мкс, 0-высокий уровень 1500мкс, паузы 1000мкс.
первые 8бит всегда 1,затем что-то похожее на id, с 22 по 32 бит - температура, с 32 по 40 влажность, 2 бита уровень батареи, еще 2 бита номер канала, и вконце скорей всего crc, его расшифровать не получилось.
пример пакета:
11111111 01110000111100(id) 1010100110((температура+400)*10) 00101100(влажность) 00(сигнал низкой батареи) 01(канал) 1111 00010111 01101100(crc?)
ардуину как и си вижу впервые, сильно не пинайте, но удалось родить вот это
#include <avr/io.h> #define F_CPU 16000000UL #include <util/delay.h> #include <avr/interrupt.h> #include <Arduino.h> volatile uint8_t count=0; volatile uint8_t res[64]; volatile uint8_t flag=0; int main(void) { Serial.begin(9600); DDRD &= ~(1<<PORTD2); //D2 как вход PORTD &= ~(1<<PORTD2); //низкое напряжение на D2 EICRA = 0b0011; // D3|D2(INT1|INT0) 00 - низкий уровень на входе/01 - любое изменение уровня на входе/10 - по спадающему сигналу на входе/11 - по возрастающему сигналу на входе EIMSK |= 1<<INT0; //разрешить локально прерывание INT0 sei(); //глобально разрешить прерывания while (1) { if (flag==1) //если были данные { //Serial.println(""); //проверка правильности получения uint16_t tmp = 0; for (uint8_t i = 0;i<8;i++) { tmp<<=1; tmp|=res[i]&1; }; //Serial.println(tmp); if (tmp==0xff) { //первый байт должен быть 0xff //Температура double temp = 0; int16_t temp_tmp = 0; for (uint8_t i=22;i<32;i++) //биты температуры { temp_tmp<<=1; //смещаем влево temp_tmp|=res[i]&1; //прибавляем младший бит }; temp=(temp_tmp-400)/10.0; //Влажность uint8_t hum = 0; for (uint8_t i=32;i<40;i++) //биты влажности { hum<<=1; hum|=res[i]&1; }; //Канал uint8_t ch = 0; for (uint8_t i=42;i<44;i++) //биты канала { ch<<=1; ch|=res[i]&1; }; Serial.print("Temperature: "); Serial.print((temp),1); Serial.print("C; Humidity: "); Serial.print(hum); Serial.print("%; Channel: "); Serial.print(ch); //Батарея if (res[41]) { Serial.print("; Low battery!!!"); }; Serial.println(""); }; res[0]=0; flag=0; count=0; sei(); }; }; return 0; }; ISR( INT0_vect ) { _delay_us(600); if (digitalRead(2)==HIGH) { res[count]=0; count++; //Serial.print("0"); } else { res[count]=1; count++; //Serial.print("1"); }; if (count==64) { flag=1; cli(); _delay_ms(250); }; }
код в общем работает, но ощущение дикой его кривизны меня не покадает, подскажите как лучше читать данные, с возможность, в дальнейшей перспективе, подключения по радио.
Спасибо.
пробовал всю последовательность хранить в uint64_t, добавляя новые биты и читая необходимые с помощью сдвига, но выдавало непонятно что. Куда еще можно записать 64 бита? Желательно чтобы добавлять новые биты можно было бесконечно, например так: res<<=1; res|=0b1;
А что за метеостанция? У меня есть вопросы по передатчику и приемнику китайской метеостанции. У меня метеостанция видит выносной датчик всего на 30 см...:(
дальше она его теряет.
Вот эта метеостанция.
Основной блок не показывает отрицательные температуры с беспроводного датчика, вот и решил хоть как то его задействовать. Вот только почему он их не понимает - загадка. сам датчик температуру шлет целым числом без знака, отрицательные температуры сама метеостация выводить умеет(есть типа калибровки и можно поставить в минус), но с датчика показывает +70 градусов.
По Вашей ссылке не показывает. Объявление удалено. Посмотрите мою. В другом форуме я задавал по ней вопросы. Посмотрите, приемник и передатчик не такой как у меня?. У меня показывает и отрицательные температуры.
Только не знаю как ссылку вставить.
исправил ссылку, вашу тему не нашел, ссылку вставить есть кнопка.
Что-то не понимаю как ссылку вставить. Выходит окошечко для ссылки, вставляю ссылку, а ни на какие кнопки это окошко не реагирует, даже на крестик закрыть. Какие-то там еще якоря, метки....ни чего не понимаю
ни на какие кнопки это окошко не реагирует, даже на крестик закрыть.
это у вас что-то с браузером
http://kazus.ru/forums/showthread.php?t=108556
Точно с браузером! Гугл хром загрузил без проблем. Спасибо :)
ардуину как и си вижу впервые, сильно не пинайте, но удалось родить вот это
хренасе. для первого раза ничо так ))
У меня внутренности станции похожи, приемник на микрухе, в качестве антенны кусок провода, и вроде нормально ловит, а на передатчике антенна вообще на плате нарисована.
Вобщем переписал свой код, избавился от массивов, добавил сон. Какие замечания будут?
а как crc посчитать никто не подскажет?
решил брать данные по радиоканалу прямо с приемника метеостанции, так на этой частоте помех очень много и левые значения отсеить не получается.
а как crc посчитать никто не подскажет?
решил брать данные по радиоканалу прямо с приемника метеостанции, так на этой частоте помех очень много и левые значения отсеить не получается.
Nerwin, как Ваши успехи с метеостанцией? Разобрались. А то моя метеостанция внешний датчик ловит только на 30 см. Может Ваш опыт поможет что-то придумать.
сделать то сделал, но я ардуино цеплял к выходу радиоприемника самой станции. У вас наверное 433Мгц сильно зашумлено, или катушка (антенна) немного не на ту частоту настроены.
сделать то сделал, но я ардуино цеплял к выходу радиоприемника самой станции. У вас наверное 433Мгц сильно зашумлено, или катушка (антенна) немного не на ту частоту настроены.
А не подскажете каким приемником или чем еще можно еще попробовать половить сигнал с моих выносных датчиков? Хотелось бы увидеть что мои датчики посылают.
Спасибо.
Ой, невнимательно прочитал. А можно подробней как к ардуинке подключали, схема, скетч, если можно.
Я вообще хочу избавиться от радиоканала или разместить передатчик внутри помещения на окне, например, а датчики пусть на улице живут.
на плате самой станции был нераспаянный разъем, земля, +3.3В, и линия которая идет на микруху радиоприемник. подключение простое, землю на землю, выход приемника на любой цифровой вход. Посмотреть, что передает можно через звуковуху, даже схемы с нч генератором не надо городить, просто 1 из каналов через резистор подключить перед входом модулятора в датчике.
на плате самой станции был нераспаянный разъем, земля, +3.3В, и линия которая идет на микруху радиоприемник. подключение простое, землю на землю, выход приемника на любой цифровой вход. Посмотреть, что передает можно через звуковуху, даже схемы с нч генератором не надо городить, просто 1 из каналов через резистор подключить перед входом модулятора в датчике.
Спасибо. Попробую осмыслить.
Сегодня пришла посылка с разными штучками и логическим анализатором в том числе. Сразу же попробовал его в действии, подключил к выходу выносного датчика от китайской метеостанции. Зачем я это делаю?
Сама метеостанция мне вполне нравится и предсказывает погоду, как мне кажется, точнее яндекса в плане ясно или пасмурно будет, и будут ли осадки. Но в комплекте имеются выносные датчики, симпатичненькие, с LCD дисплейчиками, и передатчиками. Предназначение их я не очень понимаю. Температуру измеряют только от - 5 градусов, и зачем такую красивую коробочку выставлять на улицу вместе с дисплеем и батарейками? И плюс к тому связь с основной станцией только на дальность 30 см !!!!!!!!!!!!!!!!!!!! Хочу вынести на улицу только датчики температуры и влажности (уже свои), а самодельный блочок с передатчиком и батарейками установить в помещении, пусть передает по радио температуру и влажность на улице, а основная станция пусть принимает данные.
С этой целью заснял сигнал с выносного датчика. Думал анализатор определит протокол и все расшифрует.....но случился облом. Ни чего понять я не смог :( Просидел несколько часов, лопатил интернет, результат - ноль.
Здесь смотрели?
http://arduino.ru/forum/proekty/chtenie-i-emulyatsiya-datchikov-oregon-s...
Здесь смотрели?
http://arduino.ru/forum/proekty/chtenie-i-emulyatsiya-datchikov-oregon-s...
Вот так на анализаторе выглядит сигнал с выносного датчика метеостанции
Весь сигнал, похоже, состоит из двенадцати блоков. Все импульсы одинаковой длительности примерно 0.5 мсек. Сигнал начинается с импульса и паузой за ним длительностью примерно 4 мсек. Все 12 блоков начинаются с этого. Данные записаны, как я понимаю одинаковыми импульсами по 0.5 м сек, но с разными паузами 1 мсек и 2 мсек. В конце всей передачи короткий импульс 0.13 мсек....а дальше тишина.
Вот загадка, блин!!!!
Продолжаю ломать моск.... Определил, что выносной датчик шлет 12 одинаковых пакетов. Все импульсы(уровень 1) 0.5 миллисекунды, отличаются только паузы (уровень 0).
Все начинается с импульса и паузы за ним 4 мсек. Каждый из двенадцати одинаковых частей пакета начинается с импульса и паузы 2 мсек. Само содержимое определяется, как понимаю, одинаковыми импульсами и разными паузами 1.5 и 2 мсек.
Может есть здесь специалисты, которые могут подсказать, что это за протокол? В какую сторону копать?
Выкладываю изображение кусков пакета (первые 3 и последние два, все пакеты одинаковые, кроме последнего, он заканчивается коротким импульсом 0.13 мсек). Части пакета между двумя большими паузами в каждой строке.
Передается номер канала, температура (число с одним знаком после запятой), влажность (целое двухзначное) и состояние батареи датчика.
ПОМОГИТЕ
Тут 2 варианта, либо длинная пауза 0 либо 1, короткая соответственно наоборот. Надо записать несколько измерений (разных) и смотреть что меняется
Запишу несколько измерений и что показывает дисплей датчика. Похоже, что вся информация умещается в 36 битов.
Примерно так я расшифровывал свой
ID? (t+400)*10 hum lb|ch crc?
1 27.8 44
11111111 01110000111100 1010100110 00101100 00 01 1111 00010111 01101100
255 678 44 0 1 23 108
1 30.1 39
11111111 01110000111100 1010111101 00100111 00 01 1111 00000111 01101110
255 701 39 0 1 7 110
1 28.2 56 low bat
11111111 01110111011100 1010101010 00111000 01 01 1111 11001000 11110100
255 682 56 1 1 200 244
В блокноте надо подровнять, чтобы на таблицу стало похоже
Буду расшифровывать свой, что получится напишу....если что-то получится.
Пока удалось расшифровать последние 8 бит пакета. Подозрение, что это влажность. Во всех случаях зачение последних восьми бит совпадает со значением влажности на диспее. Есть подозрение на местоположение информации о канале, и пока подозрение на местоположение показателя состояния батареи. Так же во всех случаях четыре бита совпадают со значением после запятой в значении температуры. Целое значение температуры выловить не удалось. Не понимаю, в каком формате оно передается. Диапазон должен быть от минусовых до плюсовых значений.
Попробовал сегодня получить пакет по радиомодулю. В общем нормально получилось. Сначала шум, потом немного зашумленное начало пакета на первом импульсе, но потом все хорошо. Видимо, поэтому данные повторяются 12 раз в пакете.
Скорей всего как и у меня. Передается целое число 3 знака. Минимальное показание 0. Если диапазон от -40 до 40 то значения будут от 0 до 800. Надо узнать пределы измерения. Бит будет 10, младшие уже найдены
Вот, собственно из-за чего вся бодяга. Это моя метеостанция с выносными датчиками. Хотелось бы к ней сделать хороший уличный датчик, а эти два можно будет поставить в других комнатах (а может и не нужно).
Прогноз дает в большинстве случаев достоверный. А с уличным датчиком может еще точнее будет.....
https://wiki.pilight.org/auriol_protocol_v20.pdf не этот протокол часом??
https://wiki.pilight.org/auriol_protocol_v20.pdf не этот протокол часом??
@Joiner, судя по вашим картинкам, это очень похоже на манчестерский код, весьма неприятная штука для обработки
http://arduino.ru/forum/programmirovanie/manchesterskoe-kodirovanie-real...
есть готовая библиотека.. так-что не особо..
Спасибо. Я до сих пор не разобрался. Когда-то отложил в долгий ящик, и забыл. оказывается сколько времени уже прошло! Надо бы вернуться и попробовать разобраться.
Спасибо.
есть готовая библиотека.. так-что не особо..
дадите ссылочку?
https://github.com/mchr3k/arduino-libs-manchester
Спасибо. Я до сих пор не разобрался. Когда-то отложил в долгий ящик, и забыл. оказывается сколько времени уже прошло! Надо бы вернуться и попробовать разобраться.
Спасибо.
Это не манчестерский код, я ошибся. Это похоже на обычный код, который генерируют большинство RF-датчиков. Разница в длительности импульсов и алгоритмах кодировании информации.
В вашем случае это:
1. Импульс синхронизации, показывает старт передачи данных
2. Данные: 1000 0111 0000 0000 1110 0101 1111 0001 0101 - всего 36 бит или 9 полубайт.
Всего в передаваемом пакете может быть 3-4 повтора набора данных, разделяемых импульсом синхронизации.
Первые 3 полубайта кодируют идентификатор датчика, номер радиоканала, состояние батареи
Следующие 3 полубайта кодируют данные о температуре
Следующие 2 полубайта кодируют данные о влажности
Последний полубайт - контрольная сумма.
Подробнее здесь - https://soltau.ru/index.php/arduino/item/526-chtenie-dannykh-datchika-po...
Для приема похожего сигнала я использовал библиотеку RCSwitch - https://github.com/sui77/rc-switch
Для корректного приема и обработки сигнала в вашем случая придется добавить описание протокола в виде длительностей сигналов, а также дописать код для расшифровки и обработки принятых данных.
Будут вопросы - обращайтесь, постараюсь помочь.
https://github.com/mchr3k/arduino-libs-manchester
Спасибо, буду пробовать. А то я уже все мозги сломал, как его принять.
удачи, поделитесь тогда результатом :))
........ Это похоже на обычный код, который генерируют большинство RF-датчиков. Разница в длительности импульсов и алгоритмах кодировании информации.
........................
Будут вопросы - обращайтесь, постараюсь помочь.
удачи, поделитесь тогда результатом :))
У меня с этой библиотекой не заработало, поэтому пришлось писать прием манчестер-кода самостоятельно. Подробности моих изысканий в соседней ветке, посвященной теме манчестер-кода, http://arduino.ru/forum/programmirovanie/manchesterskoe-kodirovanie-realizatsiya
У меня с этой библиотекой не заработало, поэтому пришлось писать прием манчестер-кода самостоятельно. Подробности моих изысканий в соседней ветке, посвященной теме манчестер-кода, http://arduino.ru/forum/programmirovanie/manchesterskoe-kodirovanie-realizatsiya
Попался и мне такой датчик в составе домашней погодной станции под названием Garin WS-2 (https://www.garin-tm.ru/product/13223).
Протокол передачи датчика действительно очень похож на 36-битный протокол датчика BL999 (https://soltau.ru/index.php/arduino/item/526-chtenie-dannykh-datchika-pogody-bl999-s-pomoshchyu-arduino), но, судя по всему, китайцы как всегда немного подшаманили с кодированием передаваемых данных, хотя, в общем, ничего нового.
По таймингам у меня получилось следующее: SyncBit - 3850мкс, "0" - 550+850мкс, "1" - 550+1900мкс.
По декодированию передаваемых данных мне удалось медотом тыка распознать следующее:
Первые два полубайта - ID датчика, случайное число, присваемое при включении питания датчика.
Третий полубайт: старший бит судя по всему состояние батареи (1 - нормальное, 0 - низкий уровень), два младших бита - номер радиоканала (0,1,2).
Следующие три полубайта это значение температуры, умноженное на 10.
Следующий полубайт всегда передает b1111 (0xF), смысл его мне не известен.
Последние два полубайта это тупо значение влажности.
Данные о температуре и влажности передаются без всяких выкрутасов с инверсией битов и дополнительным кодом, как в протоколе датчика BL999, и даже без контрольной суммы. Зато я насчитал 12 одинаковых пакетов в одной посылке. О как!
Таким образом, в вашем случае:
Данные: 1000 0111 0000 0000 1110 0101 1111 0001 0101 или 0x8700E5F15, которые можно интерпретировать как:
ID датчика = 0x87, батарея = Low, канал = 0, температура = 22.9, влажность = 21.
Доработанный вариант библиотеки RCSwitch для приема и декодирования данного протокола можно найти в моем репозитории на Gihub - https://github.com/miksumin/RCSwitch
Будут вопросы - обращайтесь.
Обязательно обращусь! Эта погодная станция выдаёт прогноз гораздо точнее чем МЧС и Яндекс погода. Хотелось бы узнать её алгоритм.
Обязательно обращусь! Эта погодная станция выдаёт прогноз гораздо точнее чем МЧС и Яндекс погода. Хотелось бы узнать её алгоритм.
А алгоритм прогнозирования вы можете узнать только непосредственно у китайцев, которые ее программировали.
Завышает на 1 градус - это такая мелочь! Главное сделать правильный прогноз. Моя жена верит только этой метеостанции.
Завышает на 1 градус - это такая мелочь! Главное сделать правильный прогноз. Моя жена верит только этой метеостанции.
Ну я бы так не сказал. Для совеременных цифровых датчиков нормальная погрешность не более 0.5 градуса.
Вообще совеременные алгоримты расчета погодных прогнозов достаточно сложны и требуют много исходных статистических данных и больших вычислительных мощностей. Для домашнего прогноза лучше всего использовать барометр с историей изменений давления. Раньше это были аналоговые(механические) настенные барометры, теперь это цифровые погодные станции с датчиками давления и отображением истории за последние несколько часов. При очень большом желании сделать свой прогноз на основе данных со своих датчиков можно воспользоваться готовыми алгоритмами модели WRF, доступной для использования в домашних условиях (https://habr.com/ru/post/117140/).
................(https://habr.com/ru/post/117140/).
При очень большом желании сделать свой прогноз на основе данных со своих датчиков можно воспользоваться готовыми алгоритмами модели WRF, доступной для использования в домашних условиях (https://habr.com/ru/post/117140/).
Только ты забыл упомянуть, что модель работает с огромной сетью географически распределенных датчиков, а не с игрушкой с окна
Только ты забыл упомянуть, что модель работает с огромной сетью географически распределенных датчиков, а не с игрушкой с окна
Умеющий читать прочитает. А к незнакомым людям культурные люди обращаются на ВЫ.