ibutton как победить?

romiras
Offline
Зарегистрирован: 12.07.2015

На просторах инета нашел скетч для считывания (записи) домофонных даласовских ключей. Работает по принципу: приложил донорский ключ - в серал отобразился код, затем в этот же скетч вбиваем отобразившийся код донорского ключа, копилируем, подносим чистый ключ и записываем. Как сделать, чтобы можно было приложить сначала донорский ключ, затем болванку, не правя все это дело в 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]. Опыта у меня мало, здесь задача для меня тяжелая. Помогите, пожалуйста!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Уважаемый, romiras здесь помогают тем, кто делает сам. Если Вы сами не хотите или не можете начать делать самостоятельно, то обратитесь в профильный раздел, там Вам помогут.

Здесь, же Вы должны начать делать сами и только если не получится, обратиться за помощью, выложив свой код, а не скачанный.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

romiras пишет:

На просторах инета нашел скетч для считывания (записи) домофонных даласовских ключей. Работает по принципу: приложил донорский ключ - в серал отобразился код, затем в этот же скетч вбиваем отобразившийся код донорского ключа, копилируем, подносим чистый ключ и записываем. Как сделать, чтобы можно было приложить сначала донорский ключ, затем болванку, не правя все это дело в arduino ide каждый раз.

я так понимаю надо данные из addr[8] переместить в newID[8]. Опыта у меня мало, здесь задача для меня тяжелая. Помогите, пожалуйста!

Я тут уже выкладывал такое решение. Там всё примерно так как ты и подумал. Но проверить возможности не было: лень было болванку искать.

Вот скетч заточеный под шилд "2.4 TFT SD Touch". Всё что тебе нужно это только поменять строки работы с дисплеем под свой, если по счастливой случайности, конечно, он у тебя не такой же точно как у меня: "Mucufriend". Отзывается на:

tft.begin(0x9341);
//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
//▬▬▬▬▬       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;
}

Отпишись если удастся адаптировать его под своё железо и, конечно, если удастся записать на болванку. Схему собрал же? Какой резюк использовал? Пишут что пофиг какой, но я взял побольше, на всякий случай. Читает на ура, а вот писать - некуда...

 

romiras
Offline
Зарегистрирован: 12.07.2015

Спасибо большое! Сейчас на работу ухожу на сутки, завтра обязательно проверю , отпишусь. Резистор ставил  на 4.7 кОм. 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

romiras пишет:

Спасибо большое! Сейчас на работу ухожу на сутки, завтра обязательно проверю , отпишусь. Резистор ставил  на 4.7 кОм.

А я свои ардуины на работу таскаю, что б не скучно было)))

MacSim
Offline
Зарегистрирован: 28.11.2012

на сколько мне помниться для этого примера юзается библиотека ванваре подправленная и со стандартной вообще не работает.

используя подправленную библиотеку и этот код считать сможете. записать нет. надо править в этом коде "ошибки".

готовьте десяток болванок для опытов, одной может не хватить. народ писал, что 5 штук "попалили"а результата 0.

болванок разных много и писать их соответственно надо по-разному. изучайте протокол записи конкретной болванки, переписывайте прогу под нее и заработает.

 

romiras
Offline
Зарегистрирован: 12.07.2015

Код выложенный мной, рабочий, проверял. Arduino Ide стоит давно, что я только не делал с его библиотеками)) вполне возможно Onewire был заменен, честно говоря не помню. Болванка у меня многоразовая, так что стерпит еще много издевательства над собой. Теперь я даже не знаю, что проще: пытаться добивать код, выложенный мной или заняться адаптацией под lcd1602 кода, любезно предоставленным Buzzer2010 (спасибо, что откликнулся!) . Если там ошибки, то мне тяжелее будет с этим разобраться, нежели со своим, там я знаю, куда примерно копать.

romiras
Offline
Зарегистрирован: 12.07.2015

У меня же проблема, не могу понять, как вставить сохраненный массив данных считанного ключа 

byte addr[8]; //array to store the Ibutton ID.

В массив записи данных записываемого ключа 

byte newID[8] = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F};//здесь вводим код нового ключа

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

или сразу из первого массива читай, или сделай цикл и каждый элемент массива newid приравняй addr,а потом соответственноо записывай

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

romiras пишет:

У меня же проблема, не могу понять, как вставить сохраненный массив данных считанного ключа 

byte addr[8]; //array to store the Ibutton ID.

В массив записи данных записываемого ключа 

byte newID[8] = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F};//здесь вводим код нового ключа

Бабки у подъезда надысь судачили, что у функции memcpy ограниченный ресурс вызовов в день, и его уже не хватает на всех программистов, использующих её. Так что выход, очевидно, один: кто рано встаёт, того и тапки. Встали часика в 4 утра, глядишь, останется ещё пару свободных вызовов memcpy на сегодня.

romiras
Offline
Зарегистрирован: 12.07.2015

Первый вариант пробовал - вместо донорского кода болванка перепрошивалась своим. Второй вариант не знаю как осуществить(

romiras
Offline
Зарегистрирован: 12.07.2015

memcpy(adrr1,newID,8); вроде так?

romiras
Offline
Зарегистрирован: 12.07.2015

как его вставить грамотно в код, чтобы компилятор не ругался?

romiras
Offline
Зарегистрирован: 12.07.2015

пардон, сам косипарнул, компилятор съел

romiras
Offline
Зарегистрирован: 12.07.2015

проверил, опять сам себя перзаписывает(

 

romiras
Offline
Зарегистрирован: 12.07.2015

Нужно остановить считывание ключа во время получение команды через сериал монитор: if ( Serial.read() == 'w' ){ , чтобы следом сразу шла запись. Как это прописать программно?

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
for(byte i=0;i<8;i++){
  newID[i]=addr[i];
}

 

romiras
Offline
Зарегистрирован: 12.07.2015
   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('*');

Спасибо, но результат тот же (

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

тогда если можно указать конкретный массив смысл делать еще один

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

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

приложи код который сейчас используешь. явно же не как в первом посте уже

romiras
Offline
Зарегистрирован: 12.07.2015
// Based on <a href="https://danman.eu/blog/cloning-ibutton-using-rw1990-and-avr/" title="https://danman.eu/blog/cloning-ibutton-using-rw1990-and-avr/" rel="nofollow">https://danman.eu/blog/cloning-ibutton-using-rw1990-and-avr/</a>
// and: <a href="http://elimelecsarduinoprojects.blogspot.com/2013/06/read-dallas-ibutton-arduino.html" title="http://elimelecsarduinoprojects.blogspot.com/2013/06/read-dallas-ibutton-arduino.html" rel="nofollow">http://elimelecsarduinoprojects.blogspot.com/2013/06/read-dallas-ibutton...</a>
// 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' ) {
    byte newID[8] = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F};//здесь вводим код нового ключа
    memcpy(addr, newID, 8);
    ibutton.write(0x33);
    ibutton.skip(); ibutton.reset();
    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


    ibutton.skip();
    ibutton.reset();
    ibutton.write(0xD5);
    for (byte x = 0; x < 8; x++) {
      writeByte(newID[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;
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

проверять нужно по частям. для начала чтение, вроде работает, затем запись и чтением проверяем пишется ли, причем цифры надо менять так как может записи не было, а это предыдущее что то

также зачем постояно считывать? один раз считал, ну два три для проверки что считали правильно

да и считывать по команде. например пару кнопок добавить или из терминала

по команде считать считываем в 3 массива, затем сравниваем между собой, если они одинаковые шлем в терминал данные и что чтение успешно

по команде записать записываем и считываем. сравниваем между собой, если все правильно отправляем в терминал что запись успешная

romiras
Offline
Зарегистрирован: 12.07.2015

Буду ковырять дальше, спасибо большое за помощь!