Прошивка ключей от домофона Dallas RW1990
- Войдите на сайт для отправки комментариев
Доброе всем утро.
Вот решил "усовершенствовать" скетч для прошивки ключей от домофона. Сделал вывод на TFT и избавил от необходимости прописывать вручную новый код с последующей перезаливкой.
Вот "исходник", а вот мои доработки:
//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬ Dallas RW1990 Key Rewriter ▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ // Объявляем библиотеки #include <Adafruit_GFX.h> #include <Adafruit_TFTLCD.h> #include <TouchScreen.h> #include <OneWire.h> #define pin 10 // Устанавливаем пины для тачскрина. Что куда - не знаю. Содрал)) #define YP A1 // must be an analog pin, use "An" notation! #define XM A2 // must be an analog pin, use "An" notation! #define YM 7 // can be a digital pin #define XP 6 // can be a digital pin // Устанавливаем диапазон считывания в омах наверно. Точно не скажу #define TS_MINX 150 #define TS_MINY 120 #define TS_MAXX 920 #define TS_MAXY 940 // Устанавливаем цвета для элементов меню #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define REDD 0xF422 #define GREEN 0x07E0 #define LGREEN 0x17E1 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define PINK 0xF273 #define LGREY 0x836A #define LLGREY 0xEED2 #define SPEC1 0x28E2 #define SPEC2 0x23F3 #define SPEC3 0x5273 #define SPEC4 0x0551 // Windows 98 default color #define SPEC5 0x2A20 // Устанавливаем диапазон усилия нажатия на тачскрин // For better pressure precision, we need to know the resistance // between X+ and X- Use any multimeter to read it // For the one we're using, its 300 ohmode_flag across the X plate #define MINPRESSURE 1 #define MAXPRESSURE 1200 // Инициализируем дисплей Adafruit_TFTLCD tft(A3, A2, A1, A0, A4); // Инициализируем тачскрин TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); boolean mode_flag, id_flag = false; OneWire ibutton (pin); // I button connected on PIN 10. byte addr[8], hex_data[8], crc; //array to store the Ibutton ID. //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ S E T U P ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ void setup(void) { // запускаем экран: tft.begin(0x9341); // переворачиваем на 90град. и заливаем черным цветом tft.setRotation((tft.getRotation() - 1)); tft.fillScreen(BLACK); // устанавливаем размер текста, цвет, перемещаем курсор вниз экрана // и пишем X: и Y: , куда будем помещать координаты нажатого тача tft.setTextSize(2); tft.setTextColor(WHITE, BLACK); tft.setCursor(0, 5); tft.print("Insert Key to read ID"); tft.drawRoundRect(12, 160, 290, 60, 30, GREEN); tft.setTextColor(GREEN, BLACK); tft.setCursor(100, 185); tft.print("READ mode"); } //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ L O O P ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ void loop() { //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ Init Touch Screen ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ // в целях отладки я рисую зеленый квадратик в правом нижнем углу экрана // который при считывании координат нажатия - мигает красным // tft.fillRect(tft.width() - 20, tft.height() - 20, tft.width(), tft.height(), GREEN); // Объявляем класс для считывания координат TSPoint p = ts.getPoint(); // Тут непонятно что делается, я просто скопировал, но - работает //pinMode(XP, OUTPUT); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); //pinMode(YM, OUTPUT); // Переделываем омы в пиксели, // хотя в данном случае это непринципиально. // Содрано с примера рисования, а там координаты // нажатия нужны именно в пикселях, что бы под // стиком сразу оставался след p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0); p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0); // Если элемент класса "р.z" укладывается в диапазон нажатия, // будем считать что на тачскрин-таки нажали. // Проверяем координаты нажатой точки //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬ If Touch Was Pressed Call mode() ▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ if (p.z > MINPRESSURE && p.z < MAXPRESSURE) { delay (10); mode(p.x, p.y); } //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ If Key ID Was Read ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ if (!ibutton.search (addr)) { //read attached ibutton and asign value to buffer ibutton.reset_search(); delay(200); return; } for (byte a = 0; a < 8; a++) { hex_data[a] = addr[a], HEX; //print the buffer content in LSB. For mode_flagB: for (int x = 8; x>0; x--) } crc = ibutton.crc8(addr, 7); //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ Display Key ID HEX ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //----------------------------------- tft.setTextColor(LGREY, BLACK); tft.setCursor(0, 5); tft.print("ID was recieved: "); tft.drawRect(0,27,tft.width(),35,LGREY); //----------------------------------- tft.setCursor(270, 5); tft.setTextColor(SPEC4, BLACK); tft.print("crc"); tft.setTextColor(LGREY, BLACK); tft.setCursor(1, 36); //tft.setTextSize(2); if (!mode_flag){ for (int b = 0; b < 8; b++) { tft.print(" "); tft.print(hex_data[b], HEX); } tft.print(" "); tft.setTextColor(SPEC4, BLACK); tft.print(crc, HEX); tft.setTextColor(WHITE, BLACK); tft.setCursor(2,70); tft.print(" "); tft.setCursor(2,70); tft.print("hex_data"); id_flag=true; } else{ for (int b = 0; b < 8; b++) { tft.print(" "); tft.print(addr[b], HEX); } tft.print(" "); tft.setTextColor(SPEC4, BLACK); tft.print(crc, HEX); tft.setTextColor(WHITE, BLACK); tft.setCursor(2,70); tft.print(" "); tft.setCursor(2,70); tft.print("addr"); id_flag=true; } switch (mode_flag) { case true: tft.setTextColor(RED, BLACK); tft.setCursor(1, 100); ibutton.skip();ibutton.reset();ibutton.write(0xD1); digitalWrite(10, LOW); pinMode(10, OUTPUT); delayMicroseconds(60); pinMode(10, INPUT); digitalWrite(10, HIGH); delay(10); ibutton.skip();ibutton.reset();ibutton.write(0xD5); tft.print("Write: "); byte newID[8] = {0x01, 0x77, 0x36, 0xC6, 0x00, 0x00, 0x00, 0x08}; for (byte a = 0; a<8; a++){ writeByte(newID[a]); tft.print('*'); } ibutton.reset();ibutton.write(0xD1); digitalWrite(10, LOW); pinMode(10, OUTPUT); delayMicroseconds(10); pinMode(10, INPUT); digitalWrite(10, HIGH); delay(10); tft.print(" Done!"); tft.setCursor(1, 100); delay(1000); tft.print(" "); mode_flag = false; tft.fillRoundRect(12, 160, 290, 60, 30, BLACK); tft.drawRoundRect(12, 160, 290, 60, 30, GREEN); tft.setTextColor(GREEN, BLACK); tft.setCursor(100, 185); tft.print("READ mode"); }//End of switch mode_flag } //End of Void loop() //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ Mode Flag Check ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ void mode(int x, int y) { if (y > 38 && y < 190 && x > 200 && x < 290) { // if mode button was pressed switch (id_flag) // if data ID was recieved { case false: tft.fillRoundRect(12, 160, 290, 60, 30, RED); tft.setTextColor(WHITE, RED); tft.setCursor(40, 185); tft.print("Nothing 2 WRITE !!!"); delay(1000); tft.fillRoundRect(12, 160, 290, 60, 30, BLACK); tft.drawRoundRect(12, 160, 290, 60, 30, GREEN); tft.setTextColor(GREEN, BLACK); tft.setCursor(100, 185); tft.print("READ mode"); break; case true: switch (mode_flag) { case false: // switch mode WRITE tft.fillRoundRect(12, 160, 290, 60, 30, SPEC2); tft.drawRoundRect(12, 160, 290, 60, 30, RED); tft.setTextColor(YELLOW, SPEC2); tft.setCursor(100, 185); tft.print("WRITE mode"); mode_flag=true; break; case true: // switch mode READ tft.fillRoundRect(12, 160, 290, 60, 30, BLACK); tft.drawRoundRect(12, 160, 290, 60, 30, GREEN); tft.setTextColor(GREEN, BLACK); tft.setCursor(100, 185); tft.print("READ mode"); mode_flag=false; break; } //switch (mode_flag) } //switch (id_flag) } //if } //void mode //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ Write Data Byte ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ 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; }
Используется дисплей 2.4" TFT с тачем. 10-й пин задействован под контакт. Вот схема:
У меня не получается запись: как оказалось надо именно RW1990, потому что он перезаписываемый, а у меня обычные, одноразовые.
Принцип работы:
1. Считать код
2. Перевести программу в режим записи
3. Записать считанный ранее код на новую болванку
Может у кого есть под рукой такая болванка и желание поэксперементировать - отпишитесь пожалуста о результатах!
----------------------------------------------
В скетче присутсвуют неиспользуемые переменные (цвет) и лишний, на мой взгляд, массив (byte hex_data[8]), но я на всякий случай его оставил для более уверенного хранения считанных байтов.
Ну и как всегда - первый пост очень напрасно не редактируется.
Пытаясь переписать одноразовый ключ, я сделал как в исходнике: вручную прописал какие-то данные.
На самом деле 204 строку надо закомментировать, а в 206-й, вместо: "writeByte(newID[a]);" написать: "writeByte(hex_data[a]);" Тогда, наверно, будут записываться считанные с предидущего ключа значения.
код плохо работает на запись .- на экране вместо данных высвечиваеться просто словом hex_data
ключ записывает не из прочитанного а из каких то кусков