Прием данных кейлок

SWiTChm
Offline
Зарегистрирован: 17.02.2021

Здравствуйте! Помогите разобраться написать скетч, бошка уже кругом идет а толку нет

задача принимать данный с 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
Offline
Зарегистрирован: 17.02.2021

не правильную картинку вставил

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Начни со светлодиодика. 

SWiTChm
Offline
Зарегистрирован: 17.02.2021

Моргал уже, это понятно и достаточно просто.
А вот с приемом и обработкой данных не очень

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

О том и речь: если не знаешь, как сделать желаемую задачу, возьми для начала задачу попроще.

SWiTChm
Offline
Зарегистрирован: 17.02.2021

Так вот и прошу помощи на форуме разобраться, что бы понять.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

SWiTChm, Вы просто явно не с той стороны заходите.

Основная Ваша проблема в "скетч не мой". 

Пишите свой скетч и разобраться в нем будет гораздо проще.