arduino_rw1990/arduino_rw1990.ino

128 lines
2.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* 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);
}