// Ускоренное аналоговое чтение ключа Метаком без транзистора
// Резистор 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); // Пауза после успешного чтения
}
}
}