ibutton как победить?
- Войдите на сайт для отправки комментариев
Пт, 24/06/2016 - 14:50
На просторах инета нашел скетч для считывания (записи) домофонных даласовских ключей. Работает по принципу: приложил донорский ключ - в серал отобразился код, затем в этот же скетч вбиваем отобразившийся код донорского ключа, копилируем, подносим чистый ключ и записываем. Как сделать, чтобы можно было приложить сначала донорский ключ, затем болванку, не правя все это дело в arduino ide каждый раз.
сам код:
// Based on https://danman.eu/blog/cloning-ibutton-using-rw1990-and-avr/ // and: http://elimelecsarduinoprojects.blogspot.com/2013/06/read-dallas-ibutton... // By Swift Geek 28-08-2015 // TODO: danger to atmega328! Use OpenCollector logic! // Used 4.8kΩ Pull-up and 3.1 Vcc for arduino/pull-up #include <OneWire.h> #define pin 10 OneWire ibutton (pin); // I button connected on PIN 2. byte addr[8]; //array to store the Ibutton ID. void setup(){ Serial.begin(115200); } void loop(){ if (!ibutton.search (addr)){//read attached ibutton and asign value to buffer ibutton.reset_search(); delay(200); return; } Serial.print(millis()/1000); Serial.print("> "); for (byte x = 0; x<8; x++){ Serial.print(addr[x],HEX); //print the buffer content in LSB. For MSB: for (int x = 8; x>0; x--) Serial.print(" "); } //compute crc// byte crc; crc = ibutton.crc8(addr, 7); Serial.print("CRC: "); Serial.println(crc,HEX); if ( 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(10, LOW); pinMode(10, OUTPUT); delayMicroseconds(60); pinMode(10, INPUT); digitalWrite(10, HIGH); delay(10); Serial.print('\n'); Serial.print(" Writing iButton ID:\n "); // Hardcode here your desired ID // // 01 D5 9F DC 02 00 00 96 byte newID[8] = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F};//здесь вводим код нового ключа ibutton.skip(); ibutton.reset(); ibutton.write(0xD5); for (byte x = 0; x<8; x++){ writeByte(addr[x]); Serial.print('*'); } Serial.print('\n'); ibutton.reset(); // send 0xD1 ibutton.write(0xD1); //send logical 1 digitalWrite(10, LOW); pinMode(10, OUTPUT); delayMicroseconds(10); pinMode(10, INPUT); digitalWrite(10, HIGH); delay(10); } } 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; }
я так понимаю надо данные из addr[8] переместить в newID[8]. Опыта у меня мало, здесь задача для меня тяжелая. Помогите, пожалуйста!
Уважаемый, romiras здесь помогают тем, кто делает сам. Если Вы сами не хотите или не можете начать делать самостоятельно, то обратитесь в профильный раздел, там Вам помогут.
Здесь, же Вы должны начать делать сами и только если не получится, обратиться за помощью, выложив свой код, а не скачанный.
На просторах инета нашел скетч для считывания (записи) домофонных даласовских ключей. Работает по принципу: приложил донорский ключ - в серал отобразился код, затем в этот же скетч вбиваем отобразившийся код донорского ключа, копилируем, подносим чистый ключ и записываем. Как сделать, чтобы можно было приложить сначала донорский ключ, затем болванку, не правя все это дело в arduino ide каждый раз.
я так понимаю надо данные из addr[8] переместить в newID[8]. Опыта у меня мало, здесь задача для меня тяжелая. Помогите, пожалуйста!
Я тут уже выкладывал такое решение. Там всё примерно так как ты и подумал. Но проверить возможности не было: лень было болванку искать.
Вот скетч заточеный под шилд "2.4 TFT SD Touch". Всё что тебе нужно это только поменять строки работы с дисплеем под свой, если по счастливой случайности, конечно, он у тебя не такой же точно как у меня: "Mucufriend". Отзывается на:
//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ //▬▬▬▬▬ Dallas RW1990 Key Rewriter ▬▬▬▬▬▬ //▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ // Используется шилд 2.4 TFT с SD-ридером на чипе 9341 // Объявляем библиотеки #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; }Отпишись если удастся адаптировать его под своё железо и, конечно, если удастся записать на болванку. Схему собрал же? Какой резюк использовал? Пишут что пофиг какой, но я взял побольше, на всякий случай. Читает на ура, а вот писать - некуда...
Спасибо большое! Сейчас на работу ухожу на сутки, завтра обязательно проверю , отпишусь. Резистор ставил на 4.7 кОм.
Спасибо большое! Сейчас на работу ухожу на сутки, завтра обязательно проверю , отпишусь. Резистор ставил на 4.7 кОм.
на сколько мне помниться для этого примера юзается библиотека ванваре подправленная и со стандартной вообще не работает.
используя подправленную библиотеку и этот код считать сможете. записать нет. надо править в этом коде "ошибки".
готовьте десяток болванок для опытов, одной может не хватить. народ писал, что 5 штук "попалили"а результата 0.
болванок разных много и писать их соответственно надо по-разному. изучайте протокол записи конкретной болванки, переписывайте прогу под нее и заработает.
Код выложенный мной, рабочий, проверял. Arduino Ide стоит давно, что я только не делал с его библиотеками)) вполне возможно Onewire был заменен, честно говоря не помню. Болванка у меня многоразовая, так что стерпит еще много издевательства над собой. Теперь я даже не знаю, что проще: пытаться добивать код, выложенный мной или заняться адаптацией под lcd1602 кода, любезно предоставленным Buzzer2010 (спасибо, что откликнулся!) . Если там ошибки, то мне тяжелее будет с этим разобраться, нежели со своим, там я знаю, куда примерно копать.
У меня же проблема, не могу понять, как вставить сохраненный массив данных считанного ключа
byteaddr[8];//array to store the Ibutton ID.В массив записи данных записываемого ключа
bytenewID[8] = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F};//здесь вводим код нового ключаили сразу из первого массива читай, или сделай цикл и каждый элемент массива newid приравняй addr,а потом соответственноо записывай
У меня же проблема, не могу понять, как вставить сохраненный массив данных считанного ключа
byteaddr[8];//array to store the Ibutton ID.В массив записи данных записываемого ключа
bytenewID[8] = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F};//здесь вводим код нового ключаБабки у подъезда надысь судачили, что у функции memcpy ограниченный ресурс вызовов в день, и его уже не хватает на всех программистов, использующих её. Так что выход, очевидно, один: кто рано встаёт, того и тапки. Встали часика в 4 утра, глядишь, останется ещё пару свободных вызовов memcpy на сегодня.
Первый вариант пробовал - вместо донорского кода болванка перепрошивалась своим. Второй вариант не знаю как осуществить(
memcpy(adrr1,newID,8); вроде так?
как его вставить грамотно в код, чтобы компилятор не ругался?
пардон, сам косипарнул, компилятор съел
проверил, опять сам себя перзаписывает(
Нужно остановить считывание ключа во время получение команды через сериал монитор: if ( Serial.read() == 'w' ){ , чтобы следом сразу шла запись. Как это прописать программно?
for(byte i=0;i<8;i++){ newID[i]=addr[i]; }Serial.print('\n'); Serial.print(" Writing iButton ID:\n "); // Hardcode here your desired ID // // 01 D5 9F DC 02 00 00 96 byte newID[8] = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x22};//здесь вводим код нового ключа for (byte x = 0; x < 8; x++) { newID[x] = addr[x]; } ibutton.skip(); ibutton.reset(); ibutton.write(0xD5); for (byte x = 0; x < 8; x++) { writeByte(newID[x]); Serial.print('*');Спасибо, но результат тот же (
тогда если можно указать конкретный массив смысл делать еще один
Serial.print('\n'); Serial.print(" Writing iButton ID:\n "); // Hardcode here your desired ID // // 01 D5 9F DC 02 00 00 96 ibutton.skip(); ibutton.reset(); ibutton.write(0xD5); for (byte x = 0; x < 8; x++) { writeByte(addr[x]); Serial.print('*'); }приложи код который сейчас используешь. явно же не как в первом посте уже
проверять нужно по частям. для начала чтение, вроде работает, затем запись и чтением проверяем пишется ли, причем цифры надо менять так как может записи не было, а это предыдущее что то
также зачем постояно считывать? один раз считал, ну два три для проверки что считали правильно
да и считывать по команде. например пару кнопок добавить или из терминала
по команде считать считываем в 3 массива, затем сравниваем между собой, если они одинаковые шлем в терминал данные и что чтение успешно
по команде записать записываем и считываем. сравниваем между собой, если все правильно отправляем в терминал что запись успешная
Буду ковырять дальше, спасибо большое за помощь!