Пришло время сделать себе свой персональный дубликатор домофонных ключей, да такой, чтобы не только копировать ключи, а и записывать свой индивидуальный код.
Для минимальной сборки дубликатора понадобится:
Arduino NANO, кнопка, 2 сопротивления 1 - 2.2 кОм, и немного проводов.
Для сборки более полноценного дубликатора, я еще использую:
2 медные пластинки, 2 куска от разъема IDE шины и баночка от каких то таблеток.
Прежде чем приступить к сборке, загрузите этот скетч на плату.
//Начало скетча
#include "OneWire.h"
#define pin 11
OneWire ibutton (pin); // Пин D11 для подключения iButton (Data)
byte addr[8];
byte ReadID[8] = { 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F };
// Свой ключ. Прошивается последовательность 01:FF:FF:FF:FF:FF:FF:2F
const int buttonPin = 12; // Пин D11
const int ledPin = 13;
int buttonState = 0;
int writeflag = 0;
int readflag = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
Serial.begin(115200);
Serial.println("---------- Start ----------");
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
readflag = 1; writeflag = 1;
digitalWrite(ledPin, HIGH);
}
if (!ibutton.search (addr)) {
ibutton.reset_search();
delay(50);
return;
}
digitalWrite(ledPin, HIGH); delay(50);
for (byte x = 0; x < 8; x++) {
Serial.print(addr[x], HEX);
if (readflag == 0) {
ReadID[x] = (addr[x]);
} Serial.print(":");
}
byte crc; // Проверка контрольной суммы
crc = ibutton.crc8(addr, 7);
Serial.print("CRC: ");
Serial.println(crc, HEX);
digitalWrite(ledPin, LOW);
if ((writeflag == 1) or (Serial.read() == 'w')) {
ibutton.skip(); ibutton.reset(); ibutton.write(0x33);
Serial.print(" ID before write:");
for (byte x = 0; x < 8; x++) {
Serial.print(' '); Serial.print(ibutton.read(), HEX);
}
// send reset
ibutton.skip();
ibutton.reset(); // send 0xD1
ibutton.write(0xD1); // send logical 0
digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60);
pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);
Serial.print('\n');
Serial.print(" Writing iButton ID:\n ");
byte newID[8] = { (ReadID[0]), (ReadID[1]), (ReadID[2]), (ReadID[3]), (ReadID[4]), (ReadID[5]), (ReadID[6]), (ReadID[7]) };
ibutton.skip(); ibutton.reset(); ibutton.write(0xD5);
for (byte x = 0; x < 8; x++) {
writeByte(newID[x]);
//Или int writeByte(newID[x]); если будет выдавать ошибку!
Serial.print('*');
}
Serial.print('\n');
ibutton.reset(); // send 0xD1
ibutton.write(0xD1); //send logical 1
digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(10);
pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);
writeflag = 0; readflag = 0; digitalWrite(ledPin, LOW);
}
}
int writeByte(byte data) {
int data_bit;
for (data_bit = 0; data_bit < 8; data_bit++) {
if (data & 1) {
digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
delayMicroseconds(60);
pinMode(pin, INPUT); digitalWrite(pin, HIGH);
delay(10);
} else {
digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
pinMode(pin, INPUT); digitalWrite(pin, HIGH);
delay(10);
} data = data >> 1;
} return 0;
}
//Конец скетча
После загрузки скетча соберите все согласно этой схемы.
О том как собрать дубликатор, и о том как им пользоваться смотрите это видео.