arduino_rw1990/arduino_rw1990.ino

128 lines
2.9 KiB
Arduino
Raw Permalink Normal View History

2021-09-11 18:58:49 +03:00
/*
* NOTE: Button center is positive wire. Borders eq. ground
*/
#include "OneWire.h"
#define used_pin 10
#define _DEBUG
// KEY_TO_WRITE. SET KEY YOU WANNA WRITE RIGHT HERE
byte key_to_write[] = { 0x01, 0x5F, 0x69, 0xB, 0x1, 0x0, 0x0, 0xEA };
OneWire ds(used_pin); // pin 10 is 1-Wire interface pin now
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte read_data[8];
delay(1000); // 1 sec
read_key(read_data);
if (print_key_connected_status(read_data))
return;
print_key(read_data, 8);
if (validate_key(read_data))
return;
if (!checkTypeRW1990()){
Serial.println("Not RW1990. Not supported.");
return;
}
// UNCOMMENT THIS SECTION FOR FLASHING KEY
/*
flash();
read_key(read_data);
print_key(read_data, 8);
*/
}
void read_key(byte* read_data){
ds.reset();
ds.write(0x33); // "READ" command
ds.read_bytes(read_data, 8);
}
boolean print_key_connected_status(byte read_data[]){
// Check if FF:FF:FF:FF:FF:FF:FF:FF . MOST LIKELY (but not always) NOTHING IS PLUGGED IN
if (read_data[0] & read_data[1] & read_data[2] & read_data[3] & read_data[4] & read_data[5] & read_data[6] & read_data[7] == 0xFF){
Serial.print(".");
return true;
}
return false;
}
void print_key(byte *key_array, int size){
Serial.println();
Serial.print("[");
for(int i = 0; i < size; i++) {
Serial.print(key_array[i], HEX);
if (i != 7)
Serial.print(":");
}
Serial.println("]");
}
boolean validate_key(byte read_data[]){
// Check if read key is equal to one that has to be programmed
for (int i = 0; i < 8; i++){
if (read_data[i] != key_to_write[i])
return false;
}
Serial.print(" programmed to KEY requested");
return true;
}
boolean checkTypeRW1990(){
ds.reset();
ds.write(0xD1); // attend to remove write flag
ds.write_bit(1);
delay(10);
pinMode(used_pin, INPUT);
ds.reset();
ds.write(0xB5); // Request write flag stat
byte reply = ds.read();
#ifdef DEBUG
Serial.print("Reply RW-1990.1: ");
Serial.println(reply, HEX);
#endif
if (reply == 0xFE) // 0xFE eq. RW-1990, RW-1990.1, ТМ-08, ТМ-08v2
return true;
return false;
}
void flash(){
ds.reset();
ds.write(0xD1); // write command
ds.write_bit(0);
delay(10);
pinMode(used_pin, INPUT);
ds.reset();
ds.write(0xD5);
for (byte i = 0; i < 8; i++){
BurnByte(~key_to_write[i]); // invert 4 RW1990.1
Serial.print('+');
}
ds.write(0xD1); // write flag
ds.write_bit(1); // stop
pinMode(used_pin, INPUT);
delay(10);
}
void BurnByte(byte data){
for(byte n_bit = 0; n_bit < 8; n_bit++){
ds.write_bit(data & 1);
delay(5); // даем время на прошивку каждого бита до 10 мс
data = data >> 1; // переходим к следующему bit
}
pinMode(used_pin, INPUT);
}