Официальный сайт компании Arduino по адресу arduino.cc
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". Отзывается на:
Отпишись если удастся адаптировать его под своё железо и, конечно, если удастся записать на болванку. Схему собрал же? Какой резюк использовал? Пишут что пофиг какой, но я взял побольше, на всякий случай. Читает на ура, а вот писать - некуда...
Спасибо большое! Сейчас на работу ухожу на сутки, завтра обязательно проверю , отпишусь. Резистор ставил на 4.7 кОм.
Спасибо большое! Сейчас на работу ухожу на сутки, завтра обязательно проверю , отпишусь. Резистор ставил на 4.7 кОм.
на сколько мне помниться для этого примера юзается библиотека ванваре подправленная и со стандартной вообще не работает.
используя подправленную библиотеку и этот код считать сможете. записать нет. надо править в этом коде "ошибки".
готовьте десяток болванок для опытов, одной может не хватить. народ писал, что 5 штук "попалили"а результата 0.
болванок разных много и писать их соответственно надо по-разному. изучайте протокол записи конкретной болванки, переписывайте прогу под нее и заработает.
Код выложенный мной, рабочий, проверял. Arduino Ide стоит давно, что я только не делал с его библиотеками)) вполне возможно Onewire был заменен, честно говоря не помню. Болванка у меня многоразовая, так что стерпит еще много издевательства над собой. Теперь я даже не знаю, что проще: пытаться добивать код, выложенный мной или заняться адаптацией под lcd1602 кода, любезно предоставленным Buzzer2010 (спасибо, что откликнулся!) . Если там ошибки, то мне тяжелее будет с этим разобраться, нежели со своим, там я знаю, куда примерно копать.
У меня же проблема, не могу понять, как вставить сохраненный массив данных считанного ключа
byte
addr[8];
//array to store the Ibutton ID.
В массив записи данных записываемого ключа
byte
newID[8] = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F};
//здесь вводим код нового ключа
или сразу из первого массива читай, или сделай цикл и каждый элемент массива newid приравняй addr,а потом соответственноо записывай
У меня же проблема, не могу понять, как вставить сохраненный массив данных считанного ключа
byte
addr[8];
//array to store the Ibutton ID.
В массив записи данных записываемого ключа
byte
newID[8] = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F};
//здесь вводим код нового ключа
Бабки у подъезда надысь судачили, что у функции memcpy ограниченный ресурс вызовов в день, и его уже не хватает на всех программистов, использующих её. Так что выход, очевидно, один: кто рано встаёт, того и тапки. Встали часика в 4 утра, глядишь, останется ещё пару свободных вызовов memcpy на сегодня.
Первый вариант пробовал - вместо донорского кода болванка перепрошивалась своим. Второй вариант не знаю как осуществить(
memcpy(adrr1,newID,8); вроде так?
как его вставить грамотно в код, чтобы компилятор не ругался?
пардон, сам косипарнул, компилятор съел
проверил, опять сам себя перзаписывает(
Нужно остановить считывание ключа во время получение команды через сериал монитор: if ( Serial.read() == 'w' ){ , чтобы следом сразу шла запись. Как это прописать программно?
Спасибо, но результат тот же (
тогда если можно указать конкретный массив смысл делать еще один
приложи код который сейчас используешь. явно же не как в первом посте уже
проверять нужно по частям. для начала чтение, вроде работает, затем запись и чтением проверяем пишется ли, причем цифры надо менять так как может записи не было, а это предыдущее что то
также зачем постояно считывать? один раз считал, ну два три для проверки что считали правильно
да и считывать по команде. например пару кнопок добавить или из терминала
по команде считать считываем в 3 массива, затем сравниваем между собой, если они одинаковые шлем в терминал данные и что чтение успешно
по команде записать записываем и считываем. сравниваем между собой, если все правильно отправляем в терминал что запись успешная
Буду ковырять дальше, спасибо большое за помощь!