Прием данных кейлок
- Войдите на сайт для отправки комментариев
Ср, 17/02/2021 - 23:45
Здравствуйте! Помогите разобраться написать скетч, бошка уже кругом идет а толку нет
задача принимать данный с HCS412 наподобии скетча с HCS300:
// борд "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; // счетчик считанных бит данных
uint8_t HCS_bit_array[66]; // массив считанных бит данных
#define HCS_TE 400 // типичная длительность имульса 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; // сбрасываем счетчик пойманных импульсов преамбулы
}
}
}
скетч не мой, хотел его поправить но разобраться не получилось
С обычным приемником все работает а с приемником на микросхеме UAA3220TS не работает хотелось бы это то же понять и подружить



Получается так же надо понять архитектуру команды, XSER записан или нет
будем надеяться что XSER=0
в 301 передача 82 бита (66 бит полезной информации) в 412 69
или я что то не понимаю?
не правильную картинку вставил
Начни со светлодиодика.
Моргал уже, это понятно и достаточно просто.
А вот с приемом и обработкой данных не очень
О том и речь: если не знаешь, как сделать желаемую задачу, возьми для начала задачу попроще.
Так вот и прошу помощи на форуме разобраться, что бы понять.
SWiTChm, Вы просто явно не с той стороны заходите.
Основная Ваша проблема в "скетч не мой".
Пишите свой скетч и разобраться в нем будет гораздо проще.