Hola Chicos/as.
Tras varios meses jugando con mandos a distancia de 433, librerias RadioHead, Virtualwire y Rc_switch y mandos de garaje del tipo código fijo y código rolling code keeloq, todo funciona.
Consigo leer los datos transmitidos por estos mandos con las librerías citadas y retransmitirlos desde arduino.
Mi problema actual es que tengo un tercer mando que me gustaría incorporar pero debe ser de otro tipo que las librerías y codigos utilizados no reconocen.
Con el código para los keeloq rolling code, de algun ruso de internet,que me funciona bien, veo que quizás podría variar valores de largo del pulso, numero de bits y quizás adaptarlo para que reciba e interprete los datos de este nuevo mando raro.
El codigo que uso para keeloq es este:
// борд "LOLIN(WEMOS) D1 mini lite"
#define LED_PIN 13
#define HCS_RECIEVER_PIN 2 // пин к которому подключен приемник для брелков
class HCS301 {
public:
unsigned BattaryLow : 1; // На брелке села батарейка
unsigned Repeat : 1; // повторная посылка
unsigned BtnNoSound : 1;
unsigned BtnOpen : 1;
unsigned BtnClose : 1;
unsigned BtnRing : 1;
unsigned long SerialNum;
unsigned long Encript;
void print();
};
volatile boolean HCS_Listening = true;
byte HCS_preamble_count = 0;
uint32_t HCS_last_change = 0;
uint8_t HCS_bit_counter; // leer el contador de bits
uint8_t HCS_bit_array[66]; // conjunto de bits de datos leídos
#define HCS_TE 400 // duración típica del pulso Te
#define HCS_Te2_3 600 // HCS_TE * 3 / 2
bool bPreamble = false;
bool bHeader = false;
bool bData = false;
bool bInv = false;
HCS301 hcs301;
void setup()
{
Serial.begin(9600);
// Брелки
pinMode(HCS_RECIEVER_PIN, INPUT);
attachInterrupt(0, HCS_interrupt, CHANGE);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
Serial.println("Setup OK");
}
void loop()
{
long CurTime = millis();
// проверяем наличие команды брелка
if (HCS_Listening == false) {
HCS301 msg;
memcpy(&msg, &hcs301, sizeof(HCS301));
// включаем слушанье брелков снова
HCS_Listening = true;
//Serial.println(String("KeyFb#") + String(msg.SerialNum));
msg.print();
Serial.println("Data >>>>>>>>>>>>>>>>>>>>>>>");
for (int i = 0; i < 66; i++) {
if ((i - 2) % 8 == 0) {
Serial.print(" ");
}
Serial.print(HCS_bit_array[i]);
}
Serial.println("");
}
}
// Функции класса HCS301 для чтения брелков
void HCS301::print() {
String btn;
if (BtnRing == 1) btn += "Ring";
if (BtnClose == 1) btn += "Close";
if (BtnOpen == 1) btn += "Open";
if (BtnNoSound == 1) btn += "NoSound";
String it2;
it2 += "Encript ";
it2 += Encript;
it2 += " Serial ";
it2 += SerialNum;
it2 += " ";
it2 += btn;
it2 += " BattaryLow=";
it2 += BattaryLow;
it2 += " Rep=";
it2 += Repeat;
Serial.println(it2);
}
void HCS_interrupt() {
if (HCS_Listening == false) {
return;
}
uint32_t cur_timestamp = micros();
uint8_t cur_status = digitalRead(HCS_RECIEVER_PIN);
uint32_t pulse_duration = cur_timestamp - HCS_last_change;
HCS_last_change = cur_timestamp;
if (bPreamble) {
// начало преамбулы обнаружено - ждем заголовок
if (pulse_duration > 3000 && pulse_duration < 6000) {
// обнаружен заголовок
bHeader = true;
HCS_bit_counter = 0;
bPreamble = false;
bInv = cur_status == LOW; // получаем инверсные значения импульсов - заголовок должен быть 0
} else if (pulse_duration < 300 && pulse_duration > 600) {
// упс - уже не преамбула но какой-то мусор - начнем сначала
bPreamble = false;
digitalWrite(LED_PIN, HIGH);
} else {
// иначе ждем заголовок...
}
} else if (bHeader) {
// заголовок найден - читаем данные
if ((pulse_duration > 300) && (pulse_duration < 1100)) { // поставил верхнюю границу 1100 т.к. иногда ESP8266 "неуспевает" обработать прерывание до 200мксек
// ловим переход с высокого в низкий и анализируем длительность импульса
if (cur_status == bInv ? HIGH : LOW) {
HCS_bit_array[65 - HCS_bit_counter] = (pulse_duration > HCS_Te2_3) ? 0 : 1; // импульс больше, чем половина от Те * 3 поймали 0, иначе 1
HCS_bit_counter++;
if (HCS_bit_counter == 66) {
// поймали все биты данных
bHeader = false;
digitalWrite(LED_PIN, HIGH);
HCS_Listening = false; // отключем прослушку приемника, отправляем пойманные данные на обработку
HCS_preamble_count = 0; // сбрасываем счетчик пойманных импульсов преамбулы
hcs301.Repeat = HCS_bit_array[0];
hcs301.BattaryLow = HCS_bit_array[1];
hcs301.BtnNoSound = HCS_bit_array[2];
hcs301.BtnOpen = HCS_bit_array[3];
hcs301.BtnClose = HCS_bit_array[4];
hcs301.BtnRing = HCS_bit_array[5];
hcs301.SerialNum = 0;
for (int i = 6; i < 34; i++) {
hcs301.SerialNum = (hcs301.SerialNum << 1) + HCS_bit_array[i];
};
uint32_t Encript = 0;
for (int i = 34; i < 66; i++) {
Encript = (Encript << 1) + HCS_bit_array[i];
};
hcs301.Encript = Encript;
}
}
} else {
// попался мусор
bHeader = false;
digitalWrite(LED_PIN, HIGH);
}
} else {
// ловим преамбулу
if (pulse_duration > 300 && pulse_duration < 600) {
// поймали импульс преамбулы
if (++HCS_preamble_count > 10) {
// убедились что это преамбула - начинаем искать заголовок около 4000мксек
// анализируем 10 переходов - хочу поймать первый пакет - когда нет несущей, приемник отдает сплошной мусор,
// скорее всего всю длину преамбулы получить не удасться.
bPreamble = true;
digitalWrite(LED_PIN, LOW); // зажгем LED - начало пакета найдено
HCS_preamble_count = 0;
}
} else {
// поймали какую то фигню, неправильная пауза между импульсами
HCS_preamble_count = 0; // сбрасываем счетчик пойманных импульсов преамбулы
}
}
}
El nuevo mando transmite a 433.92 MHz, lleva un PIC, con lo cual poca info me da.
Consigo ller la trama con RTL y editarlo en Audacity. Esto es lo que veo y como creo que hay que interpretar los bits recibidos:
He seguido muchos tutoriales de como interpretar la trama recibida pero no le encuentro sentido para hallar un codigo de unos y ceros logica. Desde mi forma de contar son 74 bits que en diferentes pulsaciones, los primeros se repiten. El resto no pero porque debe ser algun tipo de codigo cambiante tipo hopping code o rolling code...Lo que pretendo es poder leer los unos y ceros con cierta certeza.
Pongo aquí algunas imagenes de un codigo escuchado con RTL, grabado como wav y editado con audacity:
La de arriba es amplida para que se pueda ver la duración....Creo que cada bit es de 0.8ms...creo.
La cuarta es completa con preambulo antes de la trama.
La segunda igual pero sin preambulo
La tercera es solo un trozo ampliado....
Como interpretaríais esos bits para convertirlos en unos y ceros ???
Agradecería ayuda sobre como modificar el código y de como interpretar la trama para convertirla en unos y ceros.
El codigo de arriba muestra esta info cuando se trata de un mando rolling code keeloq:
Encript 4129995690 Serial 8629364 NoSound BattaryLow=0 Rep=0
Data >>>>>>>>>>>>>>>>>>>>>>>
00 10000000 10000011 10101100 01110100 11110110 00101010 10111011 10101010
Eso es lo que pretendo pero con este otro mando desconocido.
Gracias y saludos cordiales