Радиопульт с динамическим KeeLoq кодом на Arduino, код из видео

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



 

Так все было подключено:

IMG_1752

Суть ошибки:

При расшифровки не правильного шифра или с неправильными ключами, функция возвращает огромное число, больше двух байт (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
или архивом.