В первой и второй частях статьи рассмотрены варианты кодирования и передачи данных с использованием простейших радиомодулей с модуляцией OOK. Способ кодирования данных, описанный во второй статье позволяет легко организовать передачу небольшого (три байта) объема информации на не слишком большие (десятки метров) расстояния. 
В этой статье рассмотрено создание приемника системы дистанционного управления несколькими каналами. Передатчиком служит готовый пульт (серенький на фото сверху) от системы управления «розеткой» (на фото сверху). Метод кодирования тот же, что в предыдущей статье. Но библиотека Arduino для приема используется иная.
Библиотека RCSwitch взята с этого сайта. В работе она оказалась удобнее, чем та, которая использована в предыдущей статье. В скетче, приведенном ниже, описан приемник-декодер, где выход радиомодуля подключен к pin3 (вход прерываний Int1), а каналы управляемой нагрузки — к выводам 7, 8, 9 и 10.
#include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); int ch1 = 7; //номера pin управляемых каналов int ch2 = 8; int ch3 = 9; int ch4 = 10; byte mch1 = 0; //программное состояние каналов byte mch2 = 0; //используется для отказа от чтения портов byte mch3 = 0; //при переключении byte mch4 = 0; int stat = 13; //контроль начала работы и признак приема void setup() { Serial.begin(9600); Serial.println("Start receive... "); mySwitch.enableReceive(1); // Receiver on inerrupt 1 is pin #3 pinMode(ch1, OUTPUT); pinMode(ch2, OUTPUT); pinMode(ch3, OUTPUT); pinMode(ch4, OUTPUT); pinMode(stat, OUTPUT); digitalWrite(stat, HIGH); // мигнем 13 pin-ом чтоб знать, что delay(500); // все хорошо при включении digitalWrite(stat, LOW); } void loop() { if (mySwitch.available()) { //проверим готов ли прием digitalWrite(stat, HIGH); //если что-то принято включим 13 long value = mySwitch.getReceivedValue(); //заберем принятый код if (value == 0) { //если принято не пойми что - выходим без исполнения Serial.print("Unknown RF encoding"); } else { Serial.print("RF 433 received : "); Serial.println( value ); //индикация принятого кода для настройки прогр. if (value == 8696671) { // CH1 ON digitalWrite(ch1, HIGH); mch1 = 1;} // turn the LED on if (value == 8696663) { // CH1 OFF digitalWrite(ch1, LOW); mch1 = 0;} // turn the LED off if (value == 8696667) { // CH2 ON digitalWrite(ch2, HIGH); mch2 = 1;} // turn the LED on if (value == 8696659) { // CH2 OFF digitalWrite(ch2, LOW); mch2 = 0;} // turn the LED off if (value == 8696669) { // CH3 ON digitalWrite(ch3, HIGH); mch3 = 1;} // turn the LED on if (value == 8696661) { // CH3 OFF digitalWrite(ch3, LOW); mch3 = 0;} // turn the LED off if (value == 8696670) { // CH4 ON digitalWrite(ch4, HIGH); mch4 = 1;} // turn the LED on if (value == 8696662) { // CH4 OFF digitalWrite(ch4, LOW); mch4 = 0;} // turn the LED off if (value == 8696664) { // ALL OFF digitalWrite(ch1, LOW); mch1 = 0; // turn the LED off digitalWrite(ch2, LOW); mch2 = 0; // turn the LED off digitalWrite(ch3, LOW); mch3 = 0; // turn the LED off digitalWrite(ch4, LOW); mch4 = 0; // turn the LED off } mySwitch.resetAvailable(); //сбрасываем признак готовности приемника } delay(100); digitalWrite(stat, LOW); // turn the LED off }
Arduino с такой программой распознает 9 кодов в радиоканале. 8 из них управляют четырьмя каналами, 9-ый выключает их все сразу. Программа не самообучаемая (как принято), а «настраиваемая». На первом этапе на подключенное к компьютеру устройство подаем команды с передатчика (команда — это три байта (24 бита), структура кодировки которых описана в предыдущей статье). Полученные в мониторе последовательного порта значения записываем в условиях операторов if() скетча, аналогично приему статьи про IR.
Надо отметить, что алгоритм декодирования принятого сигнала, используемый в библиотеке RCSwitch очень ресурсоемкий. По сути, весь принимаемый сигнал записывается в ОЗУ микроконтроллера, а затем анализируется на предмет поиска синхробита (Sync. Bit). После его обнаружения, определяется длительность короткого импульса (того, что используется при кодировании «0») и далее «вычисляется» весь принятый код. Потребности в ОЗУ так велики, что для работы уже не хватает ресурсов ATmega88!