Tramite un chip LoRa SX1276 trasmetto dati meteo ad una stazione fissa. Avendo utilizzato un Arduino Mini Pro 3.3 volt riesco con una batteria da 6 volts tipo allarme ad avere una durata di 6 mesi. Ma volendo monitorare lo stato della batteria ho inserito anche la libreria Vcc.h che mi restituisce i valori in volts e la percentuale di carica. Quando arrivano i dati però sono tutti sballati. Sicuramente è un problema di strasformazione dei valori float in una stringa che segue questo schema:
float v = vcc.Read_Volts();
float p = vcc.Read_Perc(minVcc, maxVcc);
String Datastring = ("V= ") + String (v) + + (" Perc= ") +
String(p)
![]()
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.
Prova questo
String Datastring = String("V = ") + String(v) + String(", Perc = ") + String(p);
la classe String può portare a problemi di memoria, questo sarebbe un codice migliore (ma idealmente non usare affatto la classe String)
String Datastring;
Datastring.reserve(40);
Datastring = "V = ";
Datastring += String (v);
Datastring += ", Perc =";
Datastring += String (p);
Perché usi una libreria?...
long readVcc() {
long result;
// Read 1.1V reference against AVcc
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Convert
while (bit_is_set(ADCSRA,ADSC));
result = ADCL |= ADCH<<8;
result = 1126400L / result; // Back-calculate AVcc in mV
return result;
}
Il risultato è un intero in millivolt. Lo trasmetti, lo ricevi e poi:
lcd.print("Tensione: "); lcd.print(valore_ricevuto); lcd.print("mV (");
lcd.print((int)((valore_ricevuto-Vcc_min) / (Vcc_max-Vcc_min) * 100)); lcd.print('%)');
con Vcc_min e Vcc_max in mV, ottenendo, per esempio:
Tensione: xxxxmV (yy%)
Però non capisco che cosa misuri... Tu non devi misurare i 3,3V di alimentazione, ma i 6V della batteria! Fai un partitore con due resistenze e misura la tensione con analogRead(). Per esempio, con 100k//100k e 10k verso massa (con 100nF in parallelo) ottieni 1/6 della tensione, quindi 1V con 6V:
analogRead (A0); // Trucco per ottenere una seconda lettura affidabile.
an_read_Vcc=analogRead(A0);
Trasmetti an_read_Vcc, ricevi e poi:
uint16_t Vcc=an_read_Vcc/1024*1.1*6000;
lcd.print("Tensione: "); lcd.print(Vcc); lcd.print("mV (");
lcd.print((int)((Vcc-Vcc_min) / (Vcc_max-Vcc_min) * 100)); lcd.print('%)');
Scusa ma sono da poco dil forum e sono un po impacciato. Comunque grazie provo il tuo suggerimento
GRAND FUNZIONA Mi piacerebbe sapere il significato di reserve e in quali casi si usa.
Grazie ancora
Guarda che NON è il .deserve(40) che ti ha risolto.
Inoltre fare tutto su una riga come avevi fatto tu o in più accodamenti come ha fatto JML non cambia nulla.
Probabilmente nella riga unica che avevi fatto avevi un errore; già nella riga che riportavi nel primo post non ha senso quel + + , immagino non hai riportato esattamente la riga dal tuo sketch.
String Datastring = ("V= ") + String (v) + + (" Perc= ") + String(p);
Continuo a non capire come possa leggere la tensione della batteria...
Tramite una libreria apposta
La libreria apposita si limita a misurare la Vref di 1.1 volt usando come riferimento Vcc
Ipotizzando di conoscere esattamente la tensione Vref (che varia da chip a chip, ma si può condiderare costante per il singolo chip) sapendo la lettura di Vref puoi calcolare Vcc
Credo che sia quello che chiamano: " voltmetro segreto di arduino"
La vera questione è che il tutto funziona solo se la batteria è collegata a Vcc, invece se ci fosse di mezzo un regolatore avremmo letture grosso modo costanti
Qui risponderà lo OP: come è lo schema? Come è collegata la batteria?
PS: Anche con pile alcaline e/o nicd o nimh le letture non sarebbero indicazioni affidabili dello stato di carica delle pile
Peggio che peggio col piombo/acido
Si la batteria è su Vcc
Si, infatti, è una cosa che funziona credo solo con le MCU AVR (non credo con la nuova generazione, ma non ho verificato) dato che si può selezionare un ingresso del MUX del ADC sull'alimentazione.
Con le LiPo, che hanno una curva di caduta abbastanza netta, può essere un mediocre indicatore (sufficiente per fare l'iconcina a segmenti della batteria su un display) ... usato più volte su svariati progetti con soddisfazione.
Guglielmo
Ma misurano i 7...12V della batteria?...
Misurano sempre la tensione di alimentazione della MCU, che non è la tensione della batteria.
Se la batteria è connessa direttamente alla mcu misurano la batteria
Altrimenti "ciuffa"
LiPo ... circa 3.7V quando è scarica, circa 4.2V quando è carica ... ricorda che gli AVR lavorano anche a 1.8V ... dipende a che frequenza fai lavorare la MCU.
Guglielmo
Grazie
Il trasmettitore che uso è un Mini Pro a 3.3 volts in realtà non so a che frequenza di clock lavora.Anzi per me ridurre il clock al minimo mi permetterebbe di ridurre il consumo e dato che lavora all'esterno più dura la batteria meglio è.
Ho visto che lavora a 8Mhz Pensi che si possa ridurre ulteriormente ?
A 3.3V gli 8Mhz sono supportati ... per ridurre ancora devi lavorare sul registro che opera la divsione sul clock ... cerca CLKPR (clock prescaler) nel datasheet.
Guglielmo