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