О безопасной передачи команд по радио с одной ардуины на другую при помощи динамического кода или делаем аналог защищенного брелка автосигнализации.
код из видео, в видео (в коде и его описании) допущена ошибка, пояснение и правильный код ниже.
Так все было подключено:

Суть ошибки:
При расшифровки не правильного шифра или с неправильными ключами, функция возвращает огромное число, больше двух байт (65535), поэтому от счетчика нужно отнимать единицу и в приемнике, сверять счетчик из EEPROM (oldCount) с расшифрованным, как меньше или равно. это видно меня рассуждения о работе пульта сбили. (оправдываюсь)
Код:
TX - Передатчик
//// передатчик/пуль
#include <Keeloq.h>
#include <EEPROM.h>
#include <SoftEasyTransfer.h>
#include <SoftwareSerial.h>
//#include "LowPower.h"
#define LED 13
Keeloq k(0x01320334,0x05063708); /// ключи
unsigned int count = 65535;
SoftwareSerial radio(6, 7);
SoftEasyTransfer ET;
struct SEND_DATA{
unsigned long enc; // счетчик
byte id = 1; // id
byte cmd = 1; // команда
};
SEND_DATA data;
void setup(){
delay(200); // ждем немного
Serial.begin(9600);
radio.begin(9600);
pinMode(LED, OUTPUT);
digitalWrite(LED, HIGH);
ET.begin(details(data), &radio);
EEPROM.get(0, count); // достаем из EEPROM int
count--; // отнимаем 1
data.enc = k.encrypt(count); // кодируем
ET.sendData(); // отправляем
EEPROM.put(0, count); // сохраняем int в EEPROM
digitalWrite(LED, LOW);
}
void loop(){
// LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); // SLEEP_FOREVER
}
RX - Приемник
#include <Keeloq.h>
#include <EEPROM.h>
#include <SoftwareSerial.h>
#include <SoftEasyTransfer.h>
Keeloq k(0x01320334,0x05063708); /// ключи
SoftwareSerial radio(6, 7); // RX, TX
SoftEasyTransfer ET;
#define LED 13
unsigned int oldCount = 65535;
unsigned int count;
struct RECEIVE_DATA{
unsigned long enc; // счетчик
byte id = 1; // id
byte cmd = 1; // команда
};
RECEIVE_DATA data;
void setup(){
Serial.begin(9600);
radio.begin(9600);
ET.begin(details(data), &radio);
pinMode(LED, OUTPUT);
}
void loop(){
if(ET.receiveData()){ // если пришел пакет
if (data.id = 1){ // и совпал id
EEPROM.get(0, oldCount); // достаем из EEPROM счетчик
count = k.decrypt(data.enc); // декодируем
if (count <= oldCount){ // если счетчик больше или равен сохраненного
count--; // отнимаем 1
EEPROM.put(0, count); // пишим в еепром
digitalWrite(LED, !digitalRead(LED));
Serial.println("OK"); //
}
else Serial.println("ALARM!!!"); // или пытаются отправить сохраненный пакет
}
// выдаем переменные для отладки
Serial.println(" data:");
Serial.print("enc:"); Serial.println(data.enc);
Serial.print("id:"); Serial.println(data.id);
Serial.print("count:"); Serial.println(count);
Serial.print("oldCount:"); Serial.println(oldCount);
Serial.println( );
}
}
Библиотеки:
Keeloq.h
EasyTransfer
или архивом.