(RISOLTO) Convertire un numero in BigNumber!

Salve a tutti! Sto utilizzando una sd card da cui leggere alcuni valori memorizzati con molte cifre dopo la virgola. In pratica ogni volta che arduino viene spento e riacceso ho la necessità di leggere l'ultimo valore in memoria per proseguire i calcoli. La mia necessità è convertire il valore letto in BigNumber prima di utilizzarlo nei calcoli. Lo sketch per recuperare il valore è mostrato di seguito. Il mio problema è nel passaggio in cui ho messo "?????????" dove cerco di convertire inString in BigNumber ma non riesco a trovare una soluzione visto che arduino mi da errore. Esiste una soluzione? :~

#include "BigNumber.h"
#include <SPI.h>
#include <SD.h>
File myFile;


void printBignum (BigNumber n){
  char * s = n.toString ();
  Serial.println (s);
  free (s);
}  // end of printBignum


void setup(){
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  pinMode(10, OUTPUT);
  digitalWrite(10, 1);
  BigNumber::begin (20);  // initialize library

  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
  }

  char c; 
  String inString = String();  
  
  myFile = SD.open("valori.txt");
  if (myFile) {
    while (myFile.available()) {
                  
       while(c != -1) {
          c = myFile.read();
       
          if(!myFile.available()) break;                   
          if (c == '\n') inString = "";          
          inString += c;   
      }           
    }
    myFile.close();
  } 
  
  // -----------questa è la tua ultima riga ----------
  Serial.println(inString); //debug
  //-------------------------------------------------- 

//???????????
BigNumber valore = inString;
Serial.print ( " valore: " );  
printBignum (valore);

}

void loop(){  
}

Un esempio di valori memorizzati è il seguente:

0.00000069004655222191
0.00000138009310444382
0.00000207013965666573
0.00000276018620888764
0.00000345023276110955
0.00000414027931333146
0.00000483032586555337
0.00000552037241777528
0.00000621041896999719
0.00000690046552221910
0.00000759051207444101
0.00000828055862666292
0.00000897060517888483
0.00000966065173110674

Hai guardato questo?
http://forum.arduino.cc/index.php/topic,85692.0.html

probabilmente bignumber vuole che il numero sia contenuto in un char array

pablos:
probabilmente bignumber vuole che il numero sia contenuto in un char array

Non specifica che tipo di errore ottiene, però è molto probabile che sia proprio l'incompatibilità del tipo dato tra bignumber e String.

astrobeed:

pablos:
probabilmente bignumber vuole che il numero sia contenuto in un char array

Non specifica che tipo di errore ottiene, però è molto probabile che sia proprio l'incompatibilità del tipo dato tra bignumber e String.

Penso tu abbia ragione infatti l'errore che mi da è questo:

sketch_sep30a.ino: In function 'void setup()':
sketch_sep30a.ino:48:20: error: conversion from 'String' to non-scalar type 'BigNumber' requested

Matteo90:
sketch_sep30a.ino:48:20: error: conversion from 'String' to non-scalar type 'BigNumber' requested

Infatti è un errore di incompatibilità tipo dato, non uso la bignumber quindi non so esattamente come lavora e a che tipo dato si appoggia, di sicuro tocca prima convertire la String in altra forma.
Meglio ancora sarebbe non usare la String, che è una classe del core di Arduino e non un vero tipo dato del C/C++, e lavorare con gli array di char che molto probabilmente sono la forma con cui la bignumber lavora (da verificare).

Che palle!!! :smiley: Quindi conviene farlo subito quando vai a leggere l'ultima linea del file.

Non caricare più i char letti dal file su una stringa "inString " ma prendere c = myFile.read(); e metterli in un buffer char array temporaneo

pablos:
Che palle!!! :smiley: Quindi conviene farlo subito quando vai a leggere l'ultima linea del file.

Non caricare più i char letti dal file su una stringa "inString " ma prendere c = myFile.read(); e metterli in un buffer char array temporaneo

Vediamo che riesco a combinare :~

Uno sketch fresco che non serve a niente :slight_smile:
Ma i records che memorizzi sono sempre della stessa lunghezza o possono cambiare?
quello 0.nnnnnnnnnnnn sarà sempre 0 o potrebbe cambiare?

pablos:
Non caricare più i char letti dal file su una stringa "inString " ma prendere c = myFile.read(); e metterli in un buffer char array temporaneo

Qualcosa mi dice che per Matteo il tutto viene percepito in questo modo : :grin:

"No, mi permetta. No, io... scusi, noi siamo in quattro. Come se fosse antani anche per lei soltanto in due, oppure in quattro anche scribài con cofandina? Come antifurto, per esempio."

pablos:
Uno sketch fresco che non serve a niente :slight_smile:
Ma i records che memorizzi sono sempre della stessa lunghezza o possono cambiare?
quello 0.nnnnnnnnnnnn sarà sempre 0 o potrebbe cambiare?

I numeri avranno sempre la stessa lunghezza e il valore massimo che posso ottenere è 1 dopo di che il processo di calcolo deve fermarsi ... anche fosse 0,999999999999999999 andrebbe bene lo stesso.

astrobeed sei molto vicino alla giusta interpretazione della mia reazione!!! :stuck_out_tongue:

astrobeed:
"No, mi permetta. No, io... scusi, noi siamo in quattro. Come se fosse antani anche per lei soltanto in due, oppure in quattro anche scribài con cofandina? Come antifurto, per esempio."

ahahahahahaha ... ma lui ha 24 anni, non so ha visto "amici miei" :slight_smile: :slight_smile:

Visto che sono entrato in discoteca ieri, finisco di ballare :slight_smile:

#include <SPI.h>
#include <SD.h>
File myFile;

void setup(){
  delay(1500);
  Serial.begin(19200);
  Serial.println("Initializing SD card...");
  pinMode(4, OUTPUT);
  digitalWrite(4, 1);
  pinMode(10, OUTPUT);
  digitalWrite(10, 1);
  
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
  }
  
  char c; 
  byte i; 
  char temp_arr[22];
  
  myFile = SD.open("file.txt");
  if (myFile) {
    while (myFile.available()) {
                  
       while(c != -1) {
          c = myFile.read();
          i++;
          if(!myFile.available()) break;                   
          if (c == '\n') {
              temp_arr[i] = NULL;
              i=0;
          }
              
          temp_arr[i] = c;   
      }           
    }
    myFile.close();
  } 
  
  // -----------questa è la tua ultima riga ----------
  Serial.println(String(temp_arr)); //debug
  //-------------------------------------------------- 
}

void loop(){  
}

se con Serial.begin(19200); ti da caratteri strani non è necessario ricompilare cambiando con 9600, quando apri il serial dell'IDE vai in basso a DX e cambi la velocità della seriale in 19200, se hai un file molto lungo fai prima a leggerlo

per il resto cambiati gli altri parametri, lo lascio così perchè il 99% degli utenti hanno uno shield con quei pin

PS:
Per curiosità, a cosa ti servono valori di precisione così alti .. per cosa li usi? devi mandare una sonda su Marte? :smiley: :smiley:

ciao

Pablos lo sketch funziona come l'altro che mi avevi scritto per leggere i valori come stringa.
Solo che si ripete la solita storia: quando faccio il passaggio scritto di seguito per convertirlo in BigNumber me lo legge come 0.
Sto per lanciare arduino fuori dalla finestra :slight_smile:

 BigNumber::begin (20);  // initialize library
 BigNumber valore;
valore = BigNumber (temp_arr); 
Serial.print ( " valore: " );  
printBignum (valore);

Comunque il mio scopo è quello di calcolare un parametro chiamato danno che indica la "vita consumata" di un qualsiasi meccanismo di sollevamento. Quando arriva all'unità vuol dire che il meccanismo è giunto a fine vita. Lo si può calcolare misurando i carichi sollevati ma io ovviamente lo sto facendo tramite un semplice potenziometro.
P.S. Non so più dove sbattere la testa!!! XD

Mi spiace, non conosco la lib e non ho la più pallida idea di come si usa, sta sera ci guardo giusto per sapere se è qualcosa che può servirmi in futuro, nel frattempo non buttare arduino :smiley: :smiley: rilassati e guardati questo video ahahahahahahha

Se c'è qualcuno che può aiutarti, sicuramente interverrà

pablos:
Mi spiace, non conosco la lib e non ho la più pallida idea di come si usa, sta sera ci guardo giusto per sapere se è qualcosa che può servirmi in futuro, nel frattempo non buttare arduino :smiley: :smiley: rilassati e guardati questo video ahahahahahahha

Se c'è qualcuno che può aiutarti, sicuramente interverrà

https://www.youtube.com/watch?v=Lt0EYxImhI8

ahahhahahahhaha! ok cercherò di non buttare aduino... ma non so fino a quando resisterò XD

Ho dato un occhiata alla lib, qualche funzione l'ho capita, ma quello che vorrei capire è:
tu adesso che hai preso questo numero 0.00000966065173110674 che ci devi fare? cioè cosa vuoi ottenere sul serial visto che hai scritto printBignum (valore);

Vedo che lo scopo della lib è di ottenere numeri con molti decimali da un semplice calcolo tipo

1/3 = 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333

specificando quanti decimali vuoi visualizzare in questo caso 100

oppure radice quadrata di 2 sempre con 100 decimali

sqrt(2) = 1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727

Quindi, con un potenziometro su analog dai un valore da 0 a 1023 e lo dividi per qualcosa ottenedo un numero dove hai impostato 20 decimali dopo la virgola ... dico bene o dico giusto?

Se vuoi visualizzare il contenuto dell'array o ti fai un for da 0 a 22 e ti vedi tutti i numeri uno a uno o fai uno String(array), per il resto non ho ben chiaro qual'è il risultato che vuoi

ciao

pablos:
Ho dato un occhiata alla lib, qualche funzione l'ho capita, ma quello che vorrei capire è:
tu adesso che hai preso questo numero 0.00000966065173110674 che ci devi fare? cioè cosa vuoi ottenere sul serial visto che hai scritto printBignum (valore);

Vedo che lo scopo della lib è di ottenere numeri con molti decimali da un semplice calcolo tipo

1/3 = 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333

specificando quanti decimali vuoi visualizzare in questo caso 100

oppure radice quadrata di 2 sempre con 100 decimali

sqrt(2) = 1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727

Se vuoi visualizzare il contenuto dell'array o ti fai un for da 0 a 22 e ti vedi tutti i numeri uno a uno o fai uno String(array), per il resto non ho ben chiaro qual'è il risultato che vuoi

ciao

Voglio prendere l'ultimo valore per utilizzarlo nei calcoli successivi che devo fare.

Ciao Pablos, ecco lo sketch funzionante!!! Non so se può interessarti ma visto lo sforzo che hai fatto per aiutarmi te lo posto! XD

#include <SPI.h>
#include <SD.h>
#include "BigNumber.h"
File myFile;

void printBignum (BigNumber n){
  char * s = n.toString ();
  Serial.println (s);
  free (s);
} 

void setup() {
  Serial.begin(19200);
  Serial.println("Initializing SD card...");
  pinMode(10, OUTPUT);
  digitalWrite(10, 1);

  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    while (1);
  }

  char temp_arr[23];
  temp_arr[22] = 0; 

  myFile = SD.open("valori.txt");
  if (myFile) {
    do {
      myFile.readBytes(temp_arr, 22);
      Serial.println(temp_arr); 
      myFile.read();  myFile.read(); 
    } while (myFile.available());
  }
  myFile.close();


  BigNumber::begin (20); 
  BigNumber valore;
  valore = BigNumber (temp_arr) ;
  Serial.print ( " valore: " );
  Serial.println(valore); 
}

void loop() {
}

Ti ringrazio per il pensiero, metto il link di questo treadh in archivio di quelli potenzialmente utili, però mi sono permesso di caricarlo aggiungendo qualche bebug qua e la per provarlo .... a me non sembra tanto funzionante, se va bene a te io non discuto :slight_smile:

il mio file.txt è questo

0.00000966065173110674
0.00000000004234432344
0.45455435435345345345
0.00045435376776878888
0.00434424237658996765
0.34235666756678600089

il mio sketch che ricava l'ultima linea del file in formato char array da come uscita questo

Initializing SD card...
Ultima linea file :
0.34235666756678600089

il tuo mi da questo

0000000000423443234
0
545543543534534534
0.
04543537677687888
0.0
3442423765899676
0.34
566675667860008

0.34
ultima linea file 566675667860008

0.34
 valore: 0
  1. ti perdi l'ultimo char delle linee
  2. l'ultima linea è mozzata in cima e in fondo

Comunque se ti è servito va bene così ... buon lavoro

ciao

Ciao Pablos! A me funziona bene lo sketch... non capisco perchè a te no :roll_eyes:
Vorrà dire che ognuno si tiene lo sketch suo XD
Ti saluto! :wink: