SD config file e Dallas iButton DS1990 lettura unsigned char

Salve ragazzi e grazie in anticipo dell'aiuto.

Dunque sto sbattendo la testa da una settimana su questo benedetto problema e ho provato diversi codici e librerie ma nessuno mi funziona

cosa vorrei ottenere

su una scheda SD ( collegata già e legge tranquillamente ) c'è un file chiamato " config.txt" strutturato in questo modo:

number_of key= 3
key1=1234567890
key2=2345678901
key3=3456789012

ora ovviamente se sono qui è perché questi benedetti dati non vengono caricati !

veniamo all'errore

ibutton_v3:472: error: incompatible types in assignment of 'String' to 'unsigned char [8]'

dunque G-addr è definita all'inizio in questo modo

unsigned char G_addr[10][8]; //qui memorizzo fino a 10 indirizzi da 8 bytes (64bit)

ora io ho ipotizzato nel file 3 chiavi ma facendolo funzionare con 3 poi a farlo da 10 sarà facile !!!

ora il problema credo sia qui

void applySetting(String settingName, String settingValue ) {
if(settingName == "number_of_key") {
number_of_key=settingValue.toInt();
}
if(settingName == "key1") {
G_addr [1] = settingValue;
}

io ho una stringa e un unsigned char che litigano tra loro...

come ne esco ?

in allegato il codice completo

grazie mille

ibutton_v3.ino (10.9 KB)

diciamo che potremmo sintetizzare con

inserire una stringa dentro un unsigned char

ragazzi possibile ? sto cercando come un pazzo su Google ma non ne vengo a capo

ho una stringa con valori esadecimali da mettere dentro una variabile unsigned char

che mi invento ?

strncpy (G_addr[1], settingValue.c_str (), 10);

Ma secondo me ci sono altri problemi, ora non posso guardare con attenzione.

intanto grazie mille per la risposta più tardi farò alcune prove che ci siano altri errori è sicuro ma risolto questo credo che il resto sia superabile

il codice originale della lettura del codicechiave iButton usa questo comando per "riempire" l'unsigned char

    for(int aa=0;aa<8;aa++) G_addr[G_Devices][aa]=address[aa]; // copia l'indirizzo
    G_Devices++; // incrementa il numero di devices memorizzati

ora la variabile G_Devices viene impostata leggendo dal configfile il numerochiavi

mentre G_addr viene "riempita" col codice qui sopra

come si vede qui sopra G_addr viene riempita da address[aa]

come faccio a mettere dentro G_addr quello che è presente invece nella stringa settingValue ?

questo è il punto esatto di errore

grazie per chi mi aiuterà

inserendo la conversione che è stata suggerita qui sopra ecco l'errore

ibutton_v3.ino: In function 'void applySetting(String, String)':
ibutton_v3:472: error: invalid conversion from 'unsigned char*' to 'char*'
ibutton_v3:472: error: initializing argument 1 of 'char* strncpy(char*, const char*, size_t)'
ibutton_v3:476: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
ibutton_v3:477: error: 'exBoolean' was not declared in this scope
ibutton_v3:480: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
ibutton_v3:481: error: 'exLong' was not declared in this scope

Il problema principale è che G_addr non è fatta per contenere l'indirizzo in versione stringa, bensì in versione "byte". Perché devi fare questa copia?

Forse non ho capito io, ma quando leggi da SD hai già dei char, non potresti copiarli direttamente sul tuo chararray?
Perchè hai delle stringhe? da dove arrivano?

Dunque come potete vedere dallo sketch che ho allegato non è che voglio String o voglio charter a piacimento il problema è che sto unendo due sketch diversi per cercare di farlo funzionare. Dalla lettura del file config presente su scheda sd la lettura finisce sul String per questo chiedo la conversione. Come fare altrimenti a leggere e mettere dal file sd su unsigned char ?

Ripeto che secondo me quell'unsigned char non serve a quello che pensi tu, altrimenti sarebbe char e basta. Non puoi tenerlo in formato String?

char character;
character = myFile.read();

come vedi "character" è un char

ora devi trovare il numero dopo l'= key1=1234567890

if(character == '=') salva nell'array tutti i char che arrivano e fermati quando trovi '\n'
sull'idice 0 troverai anche il char '=' .... o lo salvi lo stesso e poi lo scarti o metti un flag che inizia a registrare al ciclo successivo

dunque grazie mille intravedo poca luce alla fine del tunnel

  void readSDSettings(){
   
 char character;
 String settingName;
 String settingValue;
 char addr;
 
 myFile = SD.open("settings.txt");
 if (myFile) {
 while (myFile.available()) {
 character = myFile.read();
 while((myFile.available()) && (character != '[')){
 character = myFile.read();
 }
 character = myFile.read();
 while((myFile.available()) && (character != '=')){
 settingName = settingName + character;
 character = myFile.read();
 }
 character = myFile.read();
 while((myFile.available()) && (character != ']')){
 settingValue = settingValue + character;
 character = myFile.read();
 }
 if(character == ']'){
 
 /*
 //Debuuging Printing
 Serial.print("Name:");
 Serial.println(settingName);
 Serial.print("Value :");
 Serial.println(settingValue);
 */
 
 // Apply the value to the parameter
 applySetting(settingName,settingValue,addr);
 // Reset Strings
 settingName = "";
 settingValue = "";
 }
 }
 // close the file:
 myFile.close();
 } else {
 // if the file didn't open, print an error:
 lcd.print("error opening settings.txt");
 delay(1000);
 lcd.clear();
 }
 }
 
 /* Apply the value to the parameter by searching for the parameter name
 Using String.toInt(); for Integers
 toFloat(string); for Float
 toBoolean(string); for Boolean
 toLong(string); for Long
 */
 void applySetting(String settingName, String settingValue , char addr) {
 if(settingName == "number_of_key") {
 number_of_key=settingValue.toInt();
 }
 if(settingName == "key1") {
 G_addr [1] = addr;                                   [color=red]<===== ora dovrebbe funzionare[/color]
 }

ed invece ecco l'errore

ibutton_v3.ino: In function 'void applySetting(String, String, char)':
ibutton_v3:473: error: incompatible types in assignment of 'char' to 'unsigned char [8]'
ibutton_v3:476: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
ibutton_v3:477: error: 'exBoolean' was not declared in this scope
ibutton_v3:480: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
ibutton_v3:481: error: 'exLong' was not declared in this scope

ma se elimino dalla struttura del file il nome della variabile si semplifica ?

ovvero

3
1234567890
2345678901
3456789012

sto diventando cretino

del resto a me il file serve per configurare le chiavi e i rispettivi codici quindi la spiegazione del file o meglio

numero_chiavi=3
chiave1=12345678899
ec
ecc

se serve per semplificarla certo era meglio

il problema è che a livello logico è chiarissimo quello che dice pablos

leggo carattere dopo carattere dall' = finchè non arrivo a ]
poi metto tutto dentro G_addr [numero chiave]

il problema è farlo !

mi si sta intrecciando tutto !

Ma perché non li tieni come String???

ho provato a cambiare qui

String G_addr[10][8]; //qui memorizzo fino a 10 indirizzi da 8 bytes (64bit)
byte G_Devices; // variabile usata per tenere traccia del numero di sensori riconosciuti nel bus
OneWire ow(1); // inizializza il bus onewire sulla porta n°8 (se avete collegato i sensori su un'altro pin dovete modificare qui)

ma poi l'errore lo presenta qui

   for (int i=0;i<G_Devices;i++) if(CheckAddress(G_addr[i],address)) {old=true;break;} // se trovo l'indirizzo imposto old a true ed esco dal for

ecco l'errore

ibutton_v3.ino: In function 'void lookUpKeys()':
ibutton_v3:140: error: cannot convert 'String*' to 'unsigned char*' for argument '1' to 'bool CheckAddress(unsigned char*, unsigned char*)'
ibutton_v3:148: error: invalid conversion from 'byte' to 'const char*'
ibutton_v3:148: error: initializing argument 1 of 'String& String::operator=(const char*)'
ibutton_v3.ino: In function 'void applySetting(String, String, char)':
ibutton_v3:473: error: incompatible types in assignment of 'char' to 'String [8]'
ibutton_v3:476: error: incompatible types in assignment of 'String' to 'String [8]'
ibutton_v3:477: error: 'exBoolean' was not declared in this scope
ibutton_v3:480: error: incompatible types in assignment of 'String' to 'String [8]'
ibutton_v3:481: error: 'exLong' was not declared in this scope

Va bene tieni lo string ... fai conto che non ti abbia detto nulla, sono 8 anni che diciamo "le stringhe sono la morte degli AVR", ma fa nulla .... tieni la stringa in definitiva è più semplice

Se vuoi espandere però lo studio sui char e file di inizializzazione presi da SD ti consiglio di consultare questa lib, io non l'ho utilizzata per intero, mi sono limitato a prenderne delle parti e a fonderle nello sketch, è molto intelligente ed educativa ... ho impiegato un po' di tempo agli inizi per studiarla e capirla quando era uscita 5 anni fa, ma non è poi così complicata.GitHub - stevemarple/IniFile: Arduino library to parse ini files.

pablos grazie mille tra poco provo comunque uso String perchè nello sketch del dallas ibutto ho trovato quello

sto continuando a sbattermici sopra

dunque vediamo se ho capito

l'unsigned char è una variale composta dalla "somma" ovvero dall'affiancamento di diversi caratteri ottenuti leggendo ciclicamente qualcosa

allora ecco come avrei modificato il codice

 void readSDSettings(){
   
 char character;
 String settingName;
 String settingValue;
 
 unsigned char temp [1][8];
 
 myFile = SD.open("settings.txt");
 if (myFile) {
 while (myFile.available()) {
 character = myFile.read();
 while((myFile.available()) && (character != '[')){
 character = myFile.read();
 }
 character = myFile.read();
 while((myFile.available()) && (character != '=')){
 settingName = settingName + character;
 character = myFile.read();
 }
 character = myFile.read();
 while((myFile.available()) && (character != ']')){
 
       for(int aa=0;aa<8;aa++) temp[1][aa]=character[aa]; // copia l'indirizzo

//   settingValue = settingValue + character;
 character = myFile.read();
 }

visto che legge i char character che faccio ?

per un ciclo di for gestito da aa faccio mettere nella variabile temp[1] quello che viene letto da characte[aa]

ma non funziona di nuovo

vi prego aiutatemi tra poco mi ricoverano alla neuro

ecco l'errore

ibutton_v3.ino: In function 'void readSDSettings()':
ibutton_v3:434: error: invalid types 'char[int]' for array subscript
ibutton_v3.ino: In function 'void applySetting(String, String)':
ibutton_v3:477: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
ibutton_v3:480: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
ibutton_v3:481: error: 'exBoolean' was not declared in this scope
ibutton_v3:484: error: incompatible types in assignment of 'String' to 'unsigned char [8]'
ibutton_v3:485: error: 'exLong' was not declared in this scope

ho provato a fare nuove prove con un altra libreria ( allego il file comuqnue)

    char temp[8]; // Since the SD functions expect a character array and not a string we have to temporarily store the string in a character array.
   
    fname.toCharArray(temp,8); // Convert the string to a character array
    G_addr[1] = temp;
    // Check to see if the file exists

ma perchè non funziona ???????????

ibutton.ino: In function 'bool does_file_exist(String)':
ibutton:450: error: incompatible types in assignment of 'char [8]' to 'unsigned char [8]'

ibutton_test.ino (11.4 KB)