• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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.
 
Сверху Снизу