• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Подружить ESP8266 и приемник 433МГц

Sr.FatCat

Member
Не очень надеюсь, что кто-то сможет чем-то помочь, поэтому скетч пока выкладывать не буду. Опишу словами:
Есть NodeMCU к выводу D1 (GPIO5) которого подключен примитивный приемник 433МГц (сейчас RXB6, как самый хваленый, но картина не сильно отличается и с SRX882 и даже с RF-5V) - задача принять и расшифровать сигналы от стандартного RC_Switch устройства и датчиков Oregon Scientific.
Реализация довольно примитивная: сигнал с приемника вызывает прерывание на D1 - там определяется его длинна (от предыдущего прерывания) и по известным алгоритмам переводится в байты RCSwitch или манчестерский код.
Велосипед не изобретался. была взята известная библиотека RCSwitch и в ее процедуру обработки прерывания вкостылена еще и функция обсчета манчестерского кода известным классом DecodeOOK.

Вся математика в прерывании. В теле loop проверяется только флаг прочитанного кода и если он выставлен - результат выводится в Serial.

Теперь интрига.
Сначала все это опробывал на Arduino UNO (с подключением к 2-му цифровому, прерывание 0) - работает как часы. Просто отлично.
Поменял в скетче только номер прерывания. Загрузил в ESP и облом. RCSwitch - все так же выдает как часы, данные от Oregon получаются расшифровать в среднем в 1 из 7-10 посылок. При этом еще и куча ложняков приходит (это при том, что 6/8 байт манчестерского кода проверяются по CRC !!!)
Погрешил на шумность ESP - смонтировал UNO и NodeMCU на одной макетке c одним приемником, выход которого подключил без всякой развязки к 2 и D1 выводов МК сответственно. Питание пробывал подавать и от уны и от ноды. Запускаю скетчи одновременно - смотрю в разных терминалах. Результат - тот же. Все прекрасно работает на уне, но на esp только RCSwitch работает отлично, по Орегону очень редко и ложняки.
Хотя бы понять с чем это связано может быть? Аппаратно или программно?
 

kab

New member
Вся математика в прерывании
Сразу пишу - это мои "домыслы":
- в книжках советуют наоборот, в функции прерывания прочесть датчик, выставить флаг и сразу вернуть прочитанные данные в основную программу - и там, обнаружив флаг, обрабатывать их. Но! не думаю, что причина описанных проблем в этом...
 

Sr.FatCat

Member
Сразу пишу - это мои "домыслы":
- в книжках советуют наоборот, в функции прерывания прочесть датчик, выставить флаг и сразу вернуть прочитанные данные в основную программу - и там, обнаружив флаг, обрабатывать их. Но! не думаю, что причина описанных проблем в этом...
Изначально так по Орегону и было. RC_Switch - он в библиотеке в прерывании, а Орегон получал запомненную длительность в loop и обрабатывал. На Arduino UNO было без разницы и так и так хорошо работало, а вот на ESP с обработкой в loop еще хуже было, поэтому и перенес в прерывание
 

roiksv

Member
Тоже интересует подключение приемника в связке с rc-switch на D1 Wi-Fi Uno. К любому из пинов подключаю-нет входящего сигнала. На обыкновенной Uno на 2 все получает. На каком пине подключать к esp?
 

Sr.FatCat

Member
А что именно было хуже?
Достоверных пакетов от Орегона почти не получалось. 1 из 100 может быть...
Тоже интересует подключение приемника в связке с rc-switch на D1 Wi-Fi Uno. К любому из пинов подключаю-нет входящего сигнала. На обыкновенной Uno на 2 все получает. На каком пине подключать к esp?
Что такое "D1 Wi-Fi Uno" не понял напрочь. RC-switch работает на любом не специализированом пине ESP-шки на отлично. Вопрос у меня не в этом.
 

kab

New member
@Sr.FatCat
Какое-то смутное ощущение, что проблемы из-за того, что тактовая ESP выше, чем у Arduino:(
И что-то там на ESP не успеваем за цикл loop...
Delay`ев понаставить, что ли...
 

Sr.FatCat

Member
@kab, вот и у меня какое-то такое ощущение. Но поскольку loop у меня сейчас точно не при чем, то у меня была мысль что у ESP-шки мелкий шум вызывает паразитные прерывания, но ставил счетчик обращений к обработчику - смотрел: примерно одинаковое число, что у ESP, что у UNO. К тому же смущает идеальная работа RC-switch, паразитные прерывания и ему бы мешали...
Но самое забавное в наличии ложных данных. Ведь получается, что приходит некий белый шум, у которого при расшифровке манчестерским кодирование, мало того, что совпадает некая последовательность байт, так еще и у 6 или 8 байт получается верный CRC. Вот как так то?
 

kab

New member
@kab, вот и у меня какое-то такое ощущение. Но поскольку loop у меня сейчас точно не при чем, то у меня была мысль что у ESP-шки мелкий шум вызывает паразитные прерывания, но ставил счетчик обращений к обработчику - смотрел: примерно одинаковое число, что у ESP, что у UNO. К тому же смущает идеальная работа RC-switch, паразитные прерывания и ему бы мешали...
Но самое забавное в наличии ложных данных. Ведь получается, что приходит некий белый шум, у которого при расшифровке манчестерским кодирование, мало того, что совпадает некая последовательность байт, так еще и у 6 или 8 байт получается верный CRC. Вот как так то?
Я имел в виду несколько другое. Извиняюсь за сумбурность, но похоже, что за цикл (неважно где исполняется Ваш код), ESP не успевает доделывать какие-то "фоновые" задачи - и их "охвостья" выступают своеобразным цифровым мусором. Согласен, что теория достаточно идиотская...
 

roiksv

Member
Видно я туплю, но, если не ошибаюсь, на Uno RC-switch работает на 2 или 3 пине (mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2). Я не знаю как это называется, наверное что-то типа переадресации. Ну не могу я запустить на esp. Отсюда вопрос-какой должна быть строка в коде для подключения приемника к esp-01 (mySwitch.enableReceive(ЧТО ЗДЕСЬ?);)
 

tretyakov_sa

Moderator
Команда форума
Не очень надеюсь, что кто-то сможет чем-то помочь, поэтому скетч пока выкладывать не буду.
Хотя бы понять с чем это связано может быть? Аппаратно или программно?
В первую очередь возьмите другой блок питания. Если блок питания импульсный и шумит, например зарядник для телефона, то так и будет.
 

sharikov

Active member
В первую очередь возьмите другой блок питания. Если блок питания импульсный и шумит, например зарядник для телефона, то так и будет.
Таких сейчас половина если не больше.
Втыкаешь зарядку марки noname в планшет и тач начинает дурить. Меряю тестером минус БП и землю розетки - 80V, смотрю осциллом - там 80V 50Hz промодулировано 40 kHz 150V.
 

Sr.FatCat

Member
Видно я туплю, .... Отсюда вопрос-какой должна быть строка в коде для подключения приемника к esp-01 (mySwitch.enableReceive(ЧТО ЗДЕСЬ?);)
Здесь должен быть номер прерывания вызываемого при изменение сигнала на пине, к которому подключен приемник. В UNO таких пинов мало и они вызывают, кажется всего 2 адресных прерывания: в частности 2-й пин вызыват 0-вое. В Esp почти все пины вызывают соответствующее их номеру прерывание типа GPIO5 -> INT_5, GPIO4 -> INT_4 и т.д. У 01 очень мало пинов выведено, я бы только на GPIO2 рискнул бы попробывать.
В первую очередь возьмите другой блок питания. Если блок питания импульсный и шумит, например зарядник для телефона, то так и будет.
Я тестирую все питаясь от USB компа. Не может быть там шумов таких. Да и были бы - это слабо бы объясняло почему UNO работает на отлично, а в ESP глючит только декодирование манчестера
 

roiksv

Member
Ну хорошо, может тогда подскажите как будет выглядеть для esp данный код (ну не понимаю что именно нужно изменить):
Код:
/*
  Example for receiving
 
  https://github.com/sui77/rc-switch/
 
  If you want to visualize a telegram copy the raw data and
  paste it into http://test.sui.li/oszi/
*/

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2
}

void loop() {
  if (mySwitch.available()) {
    output(mySwitch.getReceivedValue(), mySwitch.getReceivedBitlength(), mySwitch.getReceivedDelay(), mySwitch.getReceivedRawdata(),mySwitch.getReceivedProtocol());
    mySwitch.resetAvailable();
  }
}
 

Sr.FatCat

Member
Ну хорошо, может тогда подскажите как будет выглядеть для esp данный код (ну не понимаю что именно нужно изменить):
Может подскажите тогда, к какому пину у вас приемник подключен, а то как водится, ясновидящие на форуме редкость
 

roiksv

Member
Ясновидящие редкость это понятно, как и внимательно читающие. От D1 Wi-Fi Uno до обычной esp.
У 01 очень мало пинов выведено, я бы только на GPIO2 рискнул бы попробывать.
Так может рискнете уже написать правильный код для какого-нибудь пина, а такой нуб как я уже просто изменит одну циферку или буковку, или ручками воткнет датчик в нужный пин
 

tretyakov_sa

Moderator
Команда форума
Ну хорошо, может тогда подскажите как будет выглядеть для esp данный код (ну не понимаю что именно нужно изменить):
mySwitch.enableReceive(2); <- Вот эта циферка 2 говорит, что нужно подключить приемник на GPIO2. У вас там 0. И это значит что приемник нужно подключить к GPIO0.
Можно подключится к любому свободному GPIO кроме 16.
Точно так и будет выглядеть. Без изменений. Потому, что все изменения нужно сделать в
RCSwitch.h и/или RCSwitch.c(pp).
Уж точно не нужно лезть в RCSwitch.h и/или RCSwitch.c(pp)
Так что возьмите пример измените эту самую циферку на правильную и будет вам счастье. Помните, что GPIO5 не равно D5.
И еще если вы подключаете к GPIO 2 или 0 вероятность, что плата не стартует очень велика. Так как на выходе приемника постоянный шум.
 

Сергей_Ф

Moderator
Команда форума
точно не нужно лезть в RCSwitch.h и/или RCSwitch.c(pp)
Абсолютно согласен, но с одной оговоркой. Если есть 100% уверенность в работоспособности данной библиотеки на esp8266.
В противном случае, лезть придется.
 

tretyakov_sa

Moderator
Команда форума
Абсолютно согласен, но с одной оговоркой. Если есть 100% уверенность в работоспособности данной библиотеки на esp8266.
В противном случае, лезть придется.
Вот эта библиотека работает:
GitHub - sui77/rc-switch: Arduino lib to operate 433/315Mhz devices like power outlet sockets.
 
Сверху Снизу