Aiutatemi: lettura e confronto IButtonDS1971

--------concluso :smiley: :smiley: :D-------->Ciao a tutti, ho cercato dappertutto, ma non ho trovato nulla che possa servirmi =( =( .
Ho trovato su un sito un bel progetto che avrei potuto realizzare perchè avevo tutto a portata di mano. Ho copiato lo sketch sul programma, in 5 minuti ho ostruito il circuito, ho connesso il mio ArduinoUNO al computer, ho caricato lo sketch e, non possedendo l' alloggio per il mio iButton lo ho connesso con due cavetti e ho letto sul display "not DS1990A" :frowning: :frowning: , cioè non lo riconosceva perchè non era un ds1990a. ho letto con precisione che il mio IButton è un DS1971. mi sono informato e ho letto che il DS1990A è una chiave di accesso elettronico, mentre il DS1971 è un EEPROM con 265 bit, utilizzabile, per esempio, per contenere crediti (infatti n questo momento sono chiavi per utilizzare le docce nello stabilimento balneare dove vado in estate), e volevo sapere se si può usare (e come) solo come chiave di accesso che arduino, riconoscendolo, permetta di fare un' azione(come pilotare un led, un servo, ma questo non importa, mi basta sapere come usare quel Ibutton come chiave elettronica). <-------- :smiley: :smiley: :smiley: concluso------

------- nuovo problema :frowning: :frowning: :(------->Sono riuscito a far riconoscere ad arduino l' ibutton e il codice arriva perfettamente sul monitor seriale. a questo punto devo riuscire a fare una lista di codici che , nel caso siano compatibili con quello appena letto da arduino facciano per esempio accendere un led, comandare un servo etc, etc... come posso fare<------ :frowning: :frowning: :frowning: nuovo problema ------

----------info--------------
la pagina col progetto iniziale:www.google.it/url?sa=t&rct=j&q=arduino+ibutton&source=web&cd=1&ved=0CC8QFjAA&url=http://tushev.org/articles/electronics/35-reading-ibutton-with-arduino&ei=aexxUM6nBYT-4QSx3IHQDQ&usg=AFQjCNGwXv_QnmmUqNKfibEHDXJ7pFt4ew
gli info su i due Ibutton:
-http://www.maximintegrated.com/datasheet/index.mvp/id/2823
-http://www.maximintegrated.com/datasheet/index.mvp/id/2829

lo sketch che uso per vedere i codici sul monitor seriale:

#include <OneWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);

void PrintBytes(uint8_t* addr, uint8_t count, bool newline=0) {
for (uint8_t i = 0; i < count; i++) {
Serial.print(addr*>>4, HEX);*
_ Serial.print(addr*&0x0f, HEX);_
_
}_
_
if (newline)_
_ Serial.println();_
_
}_
void ReadAndReport(OneWire net, uint8_t* addr){

}
*OneWire net(12); *
void setup(void) {
_ Serial.begin(9600);_
* lcd.begin(16, 2);*
* lcd.print("Inserire IButton");*
}
void loop(void) {
* byte i;*
* byte present = 0;*
* byte addr[8];*

* if (!net.search(addr)) {*

* net.reset_search();
_
delay(1000);_
_
return;_
_
}*_

* lcd.clear();*
* lcd.print("Lettura Dati");*
* delay(1000);*
* lcd.clear();*
* lcd.print("Lettura Dati=");*
* delay(1000);*
* lcd.clear();*
* lcd.print("Lettura Dati==");*
* delay(1000);*
* lcd.clear();*
* lcd.print("Lettura Dati===");*
* delay(1000);*
* lcd.clear();*
* lcd.print("Lettura Dati====");*
* delay(1000);*
* lcd.clear();*
* lcd.print("Lettura Eseguita");*
* PrintBytes(addr, 8 );*
_ Serial.print("\n");_
* delay(2000);*
* lcd.clear();*
* lcd.print("Buona Giornata");*
* delay(3000);*
* lcd.clear();*
* lcd.print("Inserire Ibutton");*

}
[/quote]
Come posso fare in modo che arduino legga il codice e lo confronti con uno nel suo sketch?
XD XD XD Grazie mille, Gamer3500 XD XD XD

se po fa :slight_smile:

secondo me si puo' fare, perche' il dato che a te interessa e' il seriale a 48bit che hanno tutti gli iButton, indifferentemente dalla funzione.
probabilmente c'e' da cambiare solo il codice identificativo presente nello sketch, confronta i due datasheet.

Adesso tento, in teoria devo trovare il seriale ne nuovo datasheet e inserirlo al posto di quello vecchio;
a quelo punto, memorizzato il codice del chip li inserisco nello sketch e li metto a confronto: se il codice corrisponde con uno di quelli nella lista dela programmazione ad esempio accende un led verde, altrimenti quello rosso.
:smiley: :smiley: :smiley: :smiley: :smiley: :smiley:

Funziona! XD XD XD XD XD a questo punto devo solo tovare il modo di comparare il codice letto da arduino con uno inserito nello sketch e, se fosse quello compatibile, accendere per esempio un led.

Vi prego, aiutatemiiiiiiii

Ottimo, quindi il discorso dei seriali utilizzabili si tutti gli ibutton è confermato, fa sempre piacere avere ragione :slight_smile:

Ora devi solo usare un IF per gestire tutti gli ibutton.
Posta il codice che hai tentato di scrivere, sarà un errore banale

/*Aggiungere questo pezzo sotto allo sketch principale e
inserire nel void setup() 'pinMode(13, OUTPUT);'
e 'pinMode(12,OOUTPUT);' */

if( **** == '140E745B030000C6') {
digitalWrite(13, HIGH); //se il codice letto corrisponde accendi un led verde
delay(1000); //aspetta 1 secondo
digitalWrite(13, LOW); //spengi i led verde

}

else( **** != '140E745B030000C6') {
digitalWrite(12, HIGH); //se il codice letto è diverso accendi un led rosso
delay(1000); //aspetta un secondo
digitalWrite(12, LOW); //spengi il led rosso

}

Il problema del mio codice sta nell' if e nell' else: non so cosa mettere per comparare al codice dell' iutton infatti ho scritto soltanto ****. cosa devo mettere a quel posto????

Il codice finale sarebbe quindi:

#include <OneWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);

void PrintBytes(uint8_t* addr, uint8_t count, bool newline=0) {
for (uint8_t i = 0; i < count; i++) {
Serial.print(addr>>4, HEX);
Serial.print(addr&0x0f, HEX);
}
if (newline)
Serial.println();
}

void ReadAndReport(OneWire* net, uint8_t* addr){
}

OneWire net(12);

void setup(void) {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.print("Inserire IButton");
}

void loop(void) {
byte i;
byte present = 0;
byte addr[8];

if (!net.search(addr)) {

net.reset_search();
delay(1000);
return;
}

PrintBytes(addr, 8 );
Serial.print("\n");

if( **** == '140E745B030000C6') {
digitalWrite(13, HIGH); //se il codice letto corrisponde accendi un led verde
delay(1000); //aspetta 1 secondo
digitalWrite(13, LOW); //spengi i led verde

}

else( **** != '140E745B030000C6') {
digitalWrite(12, HIGH); //se il codice letto è diverso accendi un led rosso
delay(1000); //aspetta un secondo
digitalWrite(12, LOW); //spengi il led rosso

}

}

poi con calma ci adatterò anche il display con le diverse procedure...
(anche se "lettura dati" scritto sul display è finto: serve solo per far "scena" XD XD XD XD )

Quando hai detto FUNZIONA come e' IL CODICE ?
Devi dichiarare una variabile dove svrivi il seriale ibutton e poi fai il confronting con quella variabile

è semplicemente questo:

#include <OneWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);



void PrintBytes(uint8_t* addr, uint8_t count, bool newline=0) {
  for (uint8_t i = 0; i < count; i++) {
    Serial.print(addr>>4, HEX);
    Serial.print(addr&0x0f, HEX);
  }
  if (newline)
    Serial.println();
}

void ReadAndReport(OneWire* net, uint8_t* addr){
}

OneWire net(12);  

void setup(void) {
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.print("Inserire IButton");
}

void loop(void) {
  byte i;
  byte present = 0;
  byte addr[8];
  
  if (!net.search(addr)) {
    
    net.reset_search();
    delay(1000);
    return;
  }

Serial.print("\n");
    delay(2000);

 }

funziona nel senso che legge il codice, ma non può ancora confrontarlo...

mi e' alquanto ostico questo codice,
cosa ti stampa ?
in continuazione il tuo seriale ?
incolla quello che ti esce sul serial monitor

esattamente il codice "140E745B030000C6"

nel tuo loop c'e' solo un [code]Serial.print("\n");
che significa vai a capo, come fa a stamparti il codice dell'ibutton ? :fearful:[/code]