Leggere e Scrivere DS1971 (prima indicato come DS1990A) iButton

Ciao a tutti ragazzi ,
Premetto che sono un neofita di arduino e mi sto impegnando a cercare di far funzionare il mio ArduinoUno come lettore/scrittore di un ibutton ds1990a ...
ad oggi sono riuscito a leggere solamente il seriale ( ID ) del mio ibutton (collegando al pin 8 il + del ibutton con una resistenza da 2,2K) con uno sketch che ho recuperato su questo forum ...
Però il mio intento è quello di leggere tutto il contenuto del Ibutton , copiarlo, e riscriverlo su di un'altro Ibutton .

Mi aiutate please ?

Grazie! :slightly_smiling_face:

Posto lo sketch che mi fa leggere ID del iButton :

#include <OneWire.h>

OneWire ibutton (8); // 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);
    }
    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, 0xD5, 0x9F, 0xDC, 0x02, 0x00, 0x00, 0x96};
    ibutton.skip();
    ibutton.reset();
    ibutton.write(0xD5);
    for (byte x = 0; x<8; x++){
      writeByte(newID[x]);
      Serial.print('*');
    }
    Serial.print('\n');
    ibutton.reset();
  }
} 

int writeByte(byte data){
  int data_bit;
  for(data_bit=0; data_bit<8; data_bit++){
    if (data & 1){
      digitalWrite(8, LOW); pinMode(8, OUTPUT);
      delayMicroseconds(60);
      pinMode(8, INPUT); digitalWrite(8, HIGH);
      delay(10);
    } else {
      digitalWrite(8, LOW); pinMode(8, OUTPUT);
      pinMode(8, INPUT); digitalWrite(8, HIGH);
      delay(10);
    }
    data = data >> 1;
  }
  return 0;
}

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.

1 Like

... a quanto già detto da UKHeliBob aggiungo che:

essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti risponderà (eventuali risposte verrebbero temporaneamente nascoste), quindi ti consiglio di farla al più presto. :wink:

1 Like

Faccio riferimento alla tua presentazione, ed in particolare a questa frase:

... per evitare problemi e discussioni future, ti prego di leggere con molta attenzione il REGOLAMENTO ed in particolare il punto 15 (con tutti i suoi sottopunti) ed il punto 17.1 Grazie.

Guglielmo

1 Like

Ciao, grazie soprattutto per questo Tuo ultimo messaggio, non sono uno sprovveduto e l'impianto elettrico di casa mia, lho fatto io..... Vorrei solo sbizzarrirsi un po' con alcune idee che ho.
Saluti

... come avrai letto nel REGOLAMENTO NON ci interessa se ci pone domande è o meno qualificato, è la maggior parte dei lettori che non lo sono, per cui ... NON si parla di cose che operino oltre la bassissima tensione. :wink:

Guglielmo

Ciao,
Scusa.... Vorrei capire.... Non mi ha risposto nessuno perche ancora non è sbloccato il post oppure nessuno mi si è filato ??

alla fine è stata una chiaccherata tra me e te ....

Io non ho idea di cosa sia il device DS1990A, l'ho cercato online e mi stavo documentando. Puoi dirmi di più in breve su questo device?

Ciao.

... buona la seconda ... come vedi molto pochi conoscono di cosa stai parlando ... come ti chiede Maurotec occorrono più informazioni, link al datasheet del prodotto, ecc. ecc. altrimenti ... la gente legge e va oltre. :confused:

Guglielmo

Ho letto ora ora il datasheet e non possibile scrivere nulla, poiché il device ha una ROM di 64bit di cui 48 sono UID. Altre funzioni non ne ha.

Datasheet

Ciao.

Ho cercato e letto anche io il datasheet ... non c'è alcun altro contenuto, ma solo una ROM da 64 bit.

Quei bottoni sono appunto fatti per fornire un numero univoco e, ovviamente, NON sono scrivibili dato che NON ne devono esistere due uguali.

Quindi, ho stai parlando di un prodotto diverso o ti hanno dato delle informazioni errate.

Guglielmo

Ciao ragazzi,
Non vorrei sbagliarmi ma da come ho capito questo modello di iButton, cioè il ds1990a, ha all'interno più informazioni oltre al ID...
Su questo link c'è uno ragazzo che spiega un po' il tutto... Io vorrei il codice da utilizzare per leggere e scrivere....

https://furrtek-free-fr.translate.goog/index.php?p=crea&a=ibutton&i=2&_x_tr_sch=http&_x_tr_sl=auto&_x_tr_tl=it&_x_tr_hl=it&_x_tr_pto=wapp

Allora, bisogna che impariate a dare le sigle PRECISE ...

DS1990A : ha SOLO i 64 bit di sumero seriale

DS1992/DS1993: (di cui parla l'articolo citato) ha anche memoria scrivibile non volatile

... tu quale hai ESATTAMENTE ? ? ?

Guglielmo

P.S.: ... e devi anche imparare a cercare e studiare bene i datasheet ... da cui avresti visto le caratteristiche del prodotto che indichi. In elettronica tutto ciò è fondamentale.

Chievo venia ... scusate ho sbagliato io .... il mio IButton non è un DS1990A ma un DS1971 ...

grazie ad uno sketch ho recuperato queste info in allegato ...

Ricapitolando io vorrei leggere tutto il contenuto di questa chiavetta ,salvarlo e riscriverlo su di un'altra....

PS: Devo cambiare nome della discussione in quello corretto ?

Mah ... il datasheet è QUESTO ... dove dice che ha la stessa struttura del vecchio (obsoleto) DS2430A ...

... prova a guardare QUESTO esempio che è, appunto, per il DS2430A, ma che dovrebbe andare anche con il DS1971 ... se non va, mi sa che ti tocca studiare bene i datasheet e scrivere tu le routines per fare quello che vuoi.

Guglielmo

... ho sistemato io.

Guglielmo

Eccomi qui , sono riuscito grazie a questo sketch (che posterò qui sotto ) a leggere altre informazioni della mia key ...
Non riesco a capire se è tutto il contenuto della chiavetta oppure solo una parte ... e soprattutto come faccio a copiare questo e scriverlo su altro iButton ?

#include <OneWire.h>
OneWire ds(2);                    // OneWire bus on digital pin 2
void setup() {
  Serial.begin (115200);
}

void loop() {
  byte i;                         // This is for the for loops
  boolean present;                // device present var
  byte data[32];                  // container for the data from device

  present = ds.reset();           // OneWire bus reset, always needed to start operation on the bus, returns a 1/true if there's a device present.
  ds.skip();                      // Skip ROM search

  if (present == true){           // We only try to read the data if there's a device present 
    //Serial.println("DS1971 device present");
    ds.write(0xF0,1);        // Read data command, leave ghost power on
    ds.write(0x00,1);        // LSB starting address, leave ghost power on
    ds.write(0x00,1);        // MSB starting address, leave ghost power on

    Serial.print("Data: ");   // For the printout of the data 
    for ( i = 0; i < 32; i++) {    // Now it's time to read the EEPROM data itself, each page is 32 bytes so we need 32 read commands
      data[i] = ds.read();         // we store each read byte to a different position in the data array 
      Serial.print(data[i], HEX);       // printout in ASCII
      Serial.print(" ");           // blank space 
    }
    Serial.println();
    delay(1000);                    // Delay so we don't saturate the serial output
  }
  else {                           // Nothing is connected in the bus 
    //Serial.println("Non connesso");
    delay(1000);
  }
}

... provando l'esempio che ti ho già linkato o studandoti il datasheet e scrivendo tu tutti i comandi che occorrono.

Guglielmo

Gli iButton sono di diversi modelli (c'è anche un datalogger di temperatura a perdere quando si scarica la batteria) ma credo che il protocollo sia uguale ai DS18B20.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.