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(){
}
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).
Uno sketch fresco che non serve a niente
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 :
"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
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!!!
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"
Visto che sono entrato in discoteca ieri, finisco di ballare
#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?
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
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 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 rilassati e guardati questo video ahahahahahahha
Se c'è qualcuno che può aiutarti, sicuramente interverrà
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
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
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
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.
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