различные пульты 433МГц

gonzales
Offline
Зарегистрирован: 13.07.2015

Доброе время суток, форумчане!

Может кто подскажет, как сделать следующий трюк:

Есть несколько пультов для радиоприемника 433МГц, но работают они с разными библиотеками. Один пульт понимает RCSwitch, второй NewRemoteSwitch. И та и другая библиотека используют прерывание 0 на pin2, говорящее о том, что приемник что-то поймал. Вопрос заключается в том, как заставить обе библиотеки работать одновременно на одном прерывании.

https://bitbucket.org/fuzzillogic/433mhzforarduino/wiki/Home

Вот здесь есть описание библиотеки InterruptChain, которая как раз этим и занимается, но я не понимаю, как ее подружить с RCSwitch, там разная система инициализации.

Буду рад любым комментариям

spc
Offline
Зарегистрирован: 09.06.2015

Во-первых, спасибо за такую клевую штуку. 

Во-вторых, судя по тому, что написано в описании, для ваших целей подойдет поддерживаемая InterruptChain библиотека RemoteSwitch. 

gonzales
Offline
Зарегистрирован: 13.07.2015

Я тоже так думал, но по непонятной мне причине не работает RemoteSwitch. Причем не с китайским пультом от люстры, ни с пультом от RBG-ленты. Попробую еще поколдовать, может чего не так сделал.

spc
Offline
Зарегистрирован: 09.06.2015

А RCSwitch с этими пультами работает? Я как-то столкнулся с какой-то RGB-штуковиной, так в итоге потом руками ее сигнал перерисовывал (нужно было имитировать передатчик), потому что RCSwitch эту штуку в упор не видел. 

gonzales
Offline
Зарегистрирован: 13.07.2015

работает только с RGB-пультом

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

то есть полезть внутрь библиотек и спарить их извращеным способом. сделать из 2 одну, не предлагать?

gonzales
Offline
Зарегистрирован: 13.07.2015

такое кунг-фу пока не для меня)))))

spc
Offline
Зарегистрирован: 09.06.2015

Кажется, небольшая варварская модификация RCSwitch позволяет вытворять, то что вы так хотели. Правда, после этого библиотека будет работать только в связке с InterruptChain, и никак иначе.

Если интересно, то технология такая:

1) Открываете RCSwitch.cpp

2) Ищете в нем строку 

#include "RCSwitch.h"

добавляете (выше или ниже, неважно)

#include "InterruptChain.h"
 
3) Ищете там же строку 
 
attachInterrupt(this->nReceiverInterrupt, handleInterrupt, CHANGE);
 
делаете ее комментарием или удаляете вообще, а вместо нее вставляете
 
InterruptChain::addInterruptCallback(0, handleInterrupt);
 
!!!Важно: Здесь 0 - это номер прерывания. Если нужно другое - ставите другое.
 
3) В скетче кроме #include обеих библиотек следует задать требуемый RCSwitch режим работы в начале секции
void setup():
 
InterruptChain::setMode(0, CHANGE);
 
Вот так, например:
 
void setup() {
  Serial.begin(115200);
  InterruptChain::setMode(0, CHANGE);
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2

}

4) В скетчах инициализация и работа с RCSwitch никак не меняется - как было в стандартных примерах библиотеки, так и остается все.

Что до секрета, то никакого секрета здесь нет. Просто автор InterruptChain так сам и пишет, что "The callback is of the same type as Arduino's standard attachInterrupt(). So, instead of attachInterrupt(0, callback, LOW); you can use InterruptChain::addInterruptCallback(0, callback);". 

Т.е. стандартная процедура вызова обработчика прерывания подменяется на таковую из InterruptChain. И этим можно спокойно пользоваться.

Ну и на случай, если я что-то не так написал или забыл, и вот библиотека и скетч-пример, которые были проверены на Arduino Mega 2560 с приемником на втором цифровом пине (прерывание 0).

Из имеющихся библиотек у меня только пульты под RCSwitch, но при нажатии кнопки скетч выводил интерпретацию сигнала пульта сразу по двум разным библиотекам (в том числе и RCSwitch), из чего я делаю вывод, что эта штука все же как-то работает.

Проверяйте.

 

gonzales
Offline
Зарегистрирован: 13.07.2015

spc - спасибо большое!!!!!!

буду пробывать, о результатах напишу!!!

gonzales
Offline
Зарегистрирован: 13.07.2015

Наконец руки дошли до модернизации моего проекта. Спасибо огромное spc за предоставленную модернизированную библиотеку. Все работает как часы. Использую два разных пульта, один от COCO второй NoName от светодиодной ленты, сигнал принимается от обоих пультов!!!

 

Еще раз спасибо!!!!

gonzales
Offline
Зарегистрирован: 13.07.2015

Доброе время суток!!!

Подниму опять тему, хотя уже немного в другом ключе

Библиотека RCSwitch использует прерывание 0 на pin2. У меня в проекте используется еще прерывание 1 на pin3 для организации диммирования переменного напряжения. В основном код взят отсюда http://cyber-place.ru/showthread.php?t=525

Заметил, что лампочка немного мигала при диммировании, но сначала не обратил на это внимание, но после того, как подключил в люстре - такой дребезг стал вымораживать, начал разбираться, и понял, что дребезг появляется после такой строки 

mySwitch.enableReceive(0);

Что делать, ума не приложу, вроде это разные прерывания, разные пины, но какая-то связь есть. Даже если отключаю pin2 дребезг сразу прекращается.

Может у кого есть мысли на этот счет?? 

satelit
Offline
Зарегистрирован: 12.12.2015

имеется пульт, кто знает с какой библиотекой она работает. бл... как сюда фото вставить и какое еще ctrl V. пульт универсальный перекодируемый. 4 кнопки.