OneWire iButton

Cercando su Google ho trovato questo post ed altri sul forum di arduino riguardanti gli EEPROM della Dallas (oggi Maxim), ma niente che si avvicinasse al caso mio.
Necessito di immagazzinare dei dati in alcuni iButton DS1971, ma non so come scrivere nella EEPROM dei dispositivi.
Modificando un esempio della libreria OneWire sono riuscito a leggere il contenuto degli iButton (Collegando la parte esterna del contenitore di acciaio sul GND e il centro al pin 2 e a 5V con una PULLUP da 4.2k):

#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);
  }
}

Non ho trovato niente che possa aiutarmi nella scrittura di questi 32 bytes, qualche idea?

Grazie XD

Devi trovare da datasheet il command per la scrittura.
Prova questo da paragrafo 3.3:
https://www.spezial.com/commercio/dateien/produktbeitraege/1-wire-command-set.doc

Grazie nid69ita,
da quello che ho letto nel documento che hai allegato credo siano utili questi due paragrafi:

3.3.1 WRITE SCRATCHPAD [0Fh]
After issuing the Write Scratchpad command, the master must first provide a 1-byte address, followed by the data to be written to the scratchpad for the data memory. The DS1971A will automatically increment the address after every byte it received. After having received a data byte for address 1Fh, the address counter will wrap around to 00h for the next byte and writing continues until the master sends a Reset Pulse.

3.3.3 COPY SCRATCHPAD [55h]
After the data stored in the scratchpad has been verified the master may send the Copy Scratchpad
command followed by a validation key of A5h to transfer data from the scratchpad to the EEPROM
memory. This command will always copy the data of the entire scratchpad. Therefore, if one desires to
change only a few bytes of the EEPROM data, the scratchpad should contain a copy of the latest
EEPROM data before the Write Scratchpad and Copy Scratchpad commands are issued. After this
command is issued, the data line must be held at logic high level for at least 10ms.

Quindi il procedimento dovrà essere quello di scrivere i dati nello SCRATCHPAD e poi copiarli nella EEPROM.

void loop(){
ds.write(0x0F,1);  //Comando scrittura scratchpad

ds.write(bit_che_mi_interessano);

ds.write(0x55,1); //comando copia nella EEPROM

}

Ma il contenuto della eeprom rimane invariato =(

Qualche idea?

Grazie :stuck_out_tongue:

P.S. Lo sketch che ho utilizzato:

#include <OneWire.h>
OneWire ds(2);                    // OneWire bus on digital pin 6
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(0x0F,1);        //comando scrittura scratchpad      

    ds.write(0x0A); 
    ds.write(0x0A);
    ds.write(0x0A);
    ds.write(0x0A);
    ds.write(0x0A);
    ds.write(0x0A);
    ds.write(0x0A);
    ds.write(0x0A);
    ds.write(0x0A);
    ds.write(0x0A);
    ds.write(0x0A);
    ds.write(0x0A);
    
    
    ds.write(0x55,1);       //comando copia nella EEPROM
    
    delay(1000); 
    
  }
  else {                           // Nothing is connected in the bus 
    //Serial.println("Non connesso");
    delay(1000);
  }
}

Su datasheet c'è scritto

The DS1971 contains the same memory chip as the DS2430A

Prova con questa libreria
--> Google Code Archive - Long-term storage for Google Code Project Hosting.

Nella libreria al posto di

#include "WConstants.h"

devi mettere

#include "Arduino.h"

C'è anche questo articolo --> tushev.org // Simon Tushev

C'è anche questo articolo --> tushev.org // Simon Tushev

Grazie, avevo già visto quell' articolo e fa circa la stessa cosa del mio primo sketch per la lettura.

Proverò con la libreria che mi hai dato, però strano che la OneWire non abbia neanche un consiglio sulla scrittura (ci sono solo 3000 esempi su come leggere un termometro...)