Загрузка данных


// Ускоренное аналоговое чтение ключа Метаком без транзистора
// Резистор 1 кОм между 5V и A0. Ключ между A0 и GND.

const int analogPin = 0; // Пин A0
int threshold = 850;     // Порог срабатывания (подбирается экспериментально)

void setup() {
  Serial.begin(115200); // Скорость выше, чтобы не тормозить процесс
  
  // Разгоняем АЦП Arduino до максимальной скорости
  ADCSRA &= ~(1 << ADPS2);
  ADCSRA |= (1 << ADPS1);
  ADCSRA |= (1 << ADPS0); 
  
  Serial.println("Система готова. Очистите контакты и плотно прижмите ключ к A0 и GND...");
}

void loop() {
  // Нам нужно поймать стартовый длинный импульс Метакома
  unsigned long duration = 0;
  
  while(analogRead(analogPin) > threshold) {
    // Ждем, пока ключ прижмет линию к нулю
  }
  
  // Считаем длительность импульса
  unsigned long startTime = micros();
  while(analogRead(analogPin) < threshold) {
    if (micros() - startTime > 10000) return; // Выход по таймауту
  }
  duration = micros() - startTime;

  // Если импульс похож на стартовый маркер Метакома (~250-300 мкс)
  if (duration > 200 && duration < 400) {
    byte keyData[4] = {0, 0, 0, 0};
    bool error = false;

    // Считываем 32 бита данных
    for (int i = 0; i < 32; i++) {
      startTime = micros();
      while(analogRead(analogPin) > threshold) {
        if (micros() - startTime > 1000) { error = true; break; }
      }
      if(error) break;

      startTime = micros();
      while(analogRead(analogPin) < threshold) {
        if (micros() - startTime > 1000) { error = true; break; }
      }
      unsigned long bitTime = micros() - startTime;

      int byteIndex = i / 8;
      int bitIndex = 7 - (i % 8);
      
      // По соотношению времени определяем 0 или 1
      if (bitTime > 90) {
        bitSet(keyData[byteIndex], bitIndex); // Логическая 1
      }
    }

    if (!error) {
      Serial.print("Успешно считан код Метаком: ");
      for (int i = 0; i < 4; i++) {
        if (keyData[i] < 16) Serial.print("0");
        Serial.print(keyData[i], HEX);
        Serial.print(" ");
      }
      Serial.println();
      delay(3000); // Пауза после успешного чтения
    }
  }
}