[RISOLTO]Problema con analogRead(); :)

Buongiorno,sto usando un sensore(allego foto) 0-25 volt per monitorare una batteria a 12 volt:

La Prima cosa strana che ho dovuto fare è stata modificare il codice base per la letture del pin analogico come mostro nel codice, se stacco la batteria i valori letti da Arduino non scendono .

[code]
// set the correction offset value double
void setup() {
  // Robojax.com voltage sensor
  Serial.begin(9600);
}

void loop() {
  // Robojax.com voltage sensor
  int volt = analogRead(A2);// read the input
  double voltage = map(volt,0,2046, 0, 2500);// map 0-1023 to 0-2500 and add correction offset
  
  voltage /=100;// divide by 100 to get the decimal values
  Serial.print("Voltage: ");
  Serial.print(voltage);//print the voltge
  Serial.println("V");

delay(500);
  
  
}

[/code]

Non riesco più a visualizzare il commento.

rispondo al commento :

sto usando un Arduino mkr1400 ho letto su arduino che queste schede possono arrivare da 0,4095.

https://www.arduino.cc/reference/en/language/functions/zero-due-mkr-family/analogreadresolution/

brunello22:
analogReadResolution() - Arduino Reference

Grazie per la risposta ,
ho già fatto delle prove ma non cambia nulla nella lettura .

Ora posterò lo sketch che sto facendo le prove con il risultato della seriale.

lettura 5v.txt (224 Bytes)

lettura (o) volt.txt (224 Bytes)

Scusa non avevo postato il codice :slight_smile:

[code]
// set the correction offset value double
void setup() {
  // Robojax.com voltage sensor
  Serial.begin(9600);
}

void loop() {
  // Robojax.com voltage sensor
   analogReadResolution(12);
  int volt = analogRead(A3);// read the input
  double voltage = map(volt,0,2046, 0, 2500);// map 0-1023 to 0-2500 and add correction offset
  
  voltage /=100;// divide by 100 to get the decimal values
  Serial.print("Volt: ");
  Serial.print(voltage);//print the voltge
  Serial.println("V");
 
delay(500);
  
  
}

[/code]

scusa, ma tu fai un map

double voltage = map(volt,0,2046, 0, 2500);

di un valore che va da 0 a 2046 (??)
Se non gli dici niente, per default ti funziona a 10bit ( da 0 a 1023 )
Se gli dici di andare a 12 bit ( da 0 a 4095)
Se gli dici a 8 bit ( da 0 a 255 )

Allora torniamo indietro se hai visto la foto del sensore dove sta collegata una batteria 12 V

con il tester ho visto che la tensione di uscita dal sensore arriva max ,5 volt ,ho provato ingresso con la
5 volt e poi con la 12 volt mi da sempre 2,5 volt, l 'altro problema e quando tolgo la tensione
il sensore in oscilla sui 2v.

Allora…
Quel sensore (!!!) è semplicemente composto da due resistenze che fanno un partitore il quale divide per 5 la tensione presente sui morsetti di ingresso

Quindi se vuoi misurare detta tensione o cambi i valori della map
esempio

   analogReadResolution(12);
  int volt = analogRead(A3);// read the input
  double voltage = map(volt,0,4095, 0, 2500);

oppure converti direttamente il valore in Volts

   analogReadResolution(12);
  int volt = analogRead(A3);// read the input
  float voltage = volt * (5.0/4095.0);
  Serial.print (voltage);
 analogReadResolution(12);
  int volt = analogRead(A3);// read the input
  float voltage = volt * (5.7 / 4095.0);
  Serial.println (voltage);
  delay(1500);

Impostando cosi legge bene il valore dei 5V, ma resta sempre il problema in assenza di tensione il valore scende di poco.
Aggiungo che a 12V non riesco a settare.
Il mio dubbio sul sensore come mai non viene collegato alla 5v?

Per la MKR la tensione di riferimento dell'ADC dovrebbe essere 3.3V anziché 5.0V, quindi,

float voltage = volt * (3.3/4095.0);

Maurotec:
Per la MKR la tensione di riferimento dell’ADC dovrebbe essere 3.3V anziché 5.0V, quindi,

float voltage = volt * (3.3/4095.0);

float voltage = volt * (4.0/1023.0)

cosi va +/- bene grazie .
Ora devo risolvere l’altro problema la caduta di tensione .

Era questione di collegamento la paura di bruciare la MKR che funziona 3.3 volt avevo collegato le uscite
analogiche su un convertitore logico .

Era questione di collegamento la paura di bruciare la MKR che funziona 3.3 volt avevo collegato le uscite
analogiche su un convertitore logico .

Non capisco, cosa è il convertitore logico e quali uscite analogiche?

Solitamente ci sono gli ingressi analogici che fanno capo ad un convertitore ADC, mentre le uscite analogiche fanno capo a un convertitore DAC.

Ho riletto anche tutto il thread per cercare di capire meglio.

Ricorda che se il riferimento di tensione è di 3.3V la massima tensione misurabile è 3.3 x 5 = 16.5V.

Ora non capisco perché hai messo 4V come riferimento di tensione.

Ciao.

Buongiorno,rispondo alle domande: come dicevo stavo usando un convertitore logico puoi vedere il modello in allegato,
che va benissimo per i pin digitali per ridurre la tensione da 5 v a 3.3 v cosi da non bruciare la MKR,
per quando riguarda l’impostazione dei 4 volt non ho capito bene come funziona ma solo cosi mi legge bene le tensioni.

per quando riguarda l’impostazione dei 4 volt non ho capito bene come funziona

Funziona così. Il partitore resistivo composta da due resistenze serie del valore 30000 ohm (30k) e 7500 ohm.
Il rapporto di attenuazione è dato da ra = (R1+R2)/R2 = (30000 + 7500) / 7500 = 5.

Se la tensione ai capi di R1-R2 vale 16.5 sul pin S ci sono 16.5/5 = 3.3V, se invece di 16.5 ci sono 5V 5/5=1V.

La conversione fatta da analogRead dipende dalla risoluzione configurata, la tua scheda ha una risoluzione massima di 4096 (12-bit) ad un riferimento di tensione di 3.3V. 3.3V/4096= 0,000805664V. Se analogRead legge il valore 2048 V = 2048 x 0,000805664V = 1,65V.

Quindi quel 4 dovrebbe essere 3.3.

Se alimenti il partitore con 12V dovresti avere su S 12/5=2.4V e analogRead dovrebbe leggere 2.4/0,000805664 = 2978.

2978x0,000805664 = 2,399267392V.

Ora dovrebbe essere chiaro che se al posto della tua board usi arduino uno (o in genere una board con atmega) devi sostituire 3.3 con 5.0, poiché il riferimento standard è di 5.0. Come riferimento si può selezionarne altri interni alla MCU e uno esterno di valore inferiore alla massima tensione di riferimento.

Ciao.

Grazie per la spiegazione dettagliata a micro volt. :slight_smile: