Voltmetro 0-5V con Arduino

Ciao a tutti,
vorrei poter far misurare ad Arduino una tensione variabile 0-5V sul suo pin analogico 1 e fargli riportare il valore su un lcd Hitachi HD44780.

Ho già collegato l’LCD con Arduino in configurazione a 4bit in questo modo:
RS al pin 7 di Arduino
EN al pin 8 di Arduino
DB4 al pin 9 di Arduino
DB5 al pin 10 di Arduino
DB6 al pin 11 di Arduino
DB7 al pin 12 di Arduino
La libreria usata è LiquidCrystal.h
Il pin RW l’ho collegato a GND dato che l’LCD lo uso in sola scrittura.
Pertanto la funzione è LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

Qualcuno è così misericordioso da darmi qualche dritta sulla stesura del codice?
Grazie mille :slight_smile:

vedi se può servirti questo

http://www.arduino.cc/playground/Main/LCDVoltmeter

Grazie per il link ma cercavo qualcosa di semplice.
Dopo vari tentativi sono riuscito a scrivere il codice di programma per misurare una tensione 0-5V e leggerla sull’LCD.
Ecco il codice:

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
#define ANA_IN_0 0
float misura_di_tensione = 0.0;
void setup() {
lcd.begin(16, 2);
}
void loop() {
misura_di_tensione = analogRead(ANA_IN_0);
lcd.println(misura_di_tensione);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(misura_di_tensione*5/1024);
lcd.print(“V”);
delay(1000);
}
Ho due problemi però:

  1. la lettura non è affidabile:
    se misuro una pila stilo, con Arduino mi dà 1,76V mentre con il mio multimetro mi dà 1,48V.
  2. appena stacco la pila, sull’LCD mi compaiono valori casuali.

Qualcuno sa aiutarmi a risolvere questi problemi?
Grazie mille :slight_smile:

ciao symon 1) lcd.print(misura_di_tensione*5/1024); devi dividere per 1023. Il fonoscala non é 1024 ma 1023. Questo errore é piccolo e sicuramente non é la causa del valore letto. Controlla se la tensione 5V é veramente 5V. è la tensione di riferimento che il ATmega attribuisce al valore 1023. Se é tanto diversa usa la tensione di riferimento interna di 1,1V e metti un partitore di tensione che diminuisce la tensione da misurare da 5V a 1,1V. In questo modo risolvi anche il problema di 2) perché senza entrata la resistenza tira l' entrata a massa. http://arduino.cc/en/Reference/AnalogReference 2) é normale; un entrata libera legge disturbi perché ha un impedenza alta. Ciao Uwe

devi dividere per 1023. Il fonoscala non é 1024 ma 1023.

Ok corretto! Grazie per la dritta!

Controlla se la tensione 5V é veramente 5V. è la tensione di riferimento che il ATmega attribuisce al valore 1023.

Ho misurato il fondoscala e alla tensione di 5V mi riporta un valore che va da 1021 a 1023, quindi è abb giusto.

Ho misurato il fondoscala e alla tensione di 5V mi riporta un valore che va da 1021 a 1023, quindi è abb giusto.

È una misura che non da nessun risultato significativo. Confronti il valore di riferimento con se stesso. Avresti lo stresso risultato quando alimenteresti l' arduino con 4V.

Devi misurare l'alimentazione 5V con un multimetro.

Ciao Uwe

Devi misurare l'alimentazione 5V con un multimetro.

L'alimentazione è quella della porta usb del portatile e, misurata col multimetro, è di 5,13V. La tensione di AREF invece risulta essere di 4,24V.

aha :-?

non é significante misurare Vref avendo selezionato ( come di default) il riferimento interno da 5V. Hai collegato qualcosa al pin Vref?

Ciao Uwe

Hai collegato qualcosa al pin Vref?

No non ho collegato nulla.

Gli unici collegamenti che ho fatto sono: ho collegato l'lcd a 4 bit ai pin 7,8,9,10,11,12 di Arduino ed ho preso dal pin 5V di Arduino la tensione di 5V per alimentare l'lcd e al GND di Arduino ho riportato la massa comune. I collegamenti sono giusti? Dove sbaglio?

Ciao a tutti. Usando questo sketch i valori di misurazione della tensione si avvicinano alla realtà.

int analogPin = 3;                           
float val = 0.00;         
float val2 = 0.00;
void setup()
{
  Serial.begin(9600);          
}

void loop()
{
val = analogRead(analogPin); //leggo il valore sul pin3
val2 = (val*5)/1023;  //lo trasformo in valore di tensione

  Serial.println(val2);            
  delay (1000);
}

Però comunque la precisione non è buona. Una pila stilo, misurata con due multimetri diversi danno entrambi 1,48V contro 1,52V restituito da Arduino Due pile ricaricabili in serie, misurate con due multimetri diversi danno entrambi 2,53V contro 2,61V restituito da Arduino. La risoluzione di Arduino è di 4,9mV (0,0049). Sono normali queste imprecisioni? Se non lo sono, come posso avere maggiore precisione? Grazie a tutti e Buon anno nuovo!!! :)

Ciao symon io ho caricato lo scketch che hai postato ho solo portato la velocità della seriale a 115200.

Con due pile ricaricabili poste in serie il multimetro legge: 2.80, 2.81 Arduino : 2.90, 2.91, 2.94, 2.92.

Quini sembra patologico di arduino questo errore. C'è da vedere sul datasheet dell'atmel e sulle aplication note se c'è un modo per migliorare la precisione senza modificare vref.

Io non ho idea di come l'atmel ricavi la tensione interna di 5 volts, però posso essere sicuro che se si fornisce meno tensione dei 5 volts previsti qualcosa non deve funzionare correttamente, ammenochè il riferimento interno sia minore di 5volts.

Prova ad alimentare arduino dallo spinotto. In alternativa c'è la possibilità per l'atmel di essere alimentato con due tensioni separate una per la sezione analogica e una per quella digitale.

Poi si potrebbe anche fornire un riferimento esterno Aref di 5 volts precisi sempre se tollerati.

Ciao.

Penso che la causa sia perché il PC non da 5V ma 5,1V come avevi misurato:

L'alimentazione è quella della porta usb del portatile e, misurata col multimetro, è di 5,13V.

Ciao Uwe

Ciao ragazzi, grazie per le risposte. Ora mi sorgono spontanee due domande: 1) se la tensione usb non è perfettamente 5,00V, ma 5,01V Arduino non la rende stabile a 5,00V e sballa i risultati di lettura? 2) perchè anche i risultati di Mauro sono sballati? perchè anche lui ha qualche millivolt in più sull'usb?

Ho dimenticato di dire che misuro 4.7volts, occhio a non misurare tensioni senza interporre una restistenza nel mezzo.

Io penso a questo punto che con l'alimentazione da spinotto si risolve.

Ciao Buon 2011.

occhio a non misurare tensioni senza interporre una restistenza nel mezzo.

ma se interponi una resistenza non modifichi anche il valore di tensione reale? inoltre le entrate analogiche non hanno già una resistenza intrinseca dell’ordine di Mohm?

posso collegare lo spinotto ad una pila 9v mentre è collegata la porta usb per la programmazione?

Grazie e buon 2011 a tutti!! :wink:

Ciao symon

L'arduino comuta automaticamente tra le 2 alimentazioni. non ci sono problemi se colleghi tutte due contemporanemente.

Un alternativa ai 5V non precisi sarebbe usare la tensione di riferimento interna da 1,1V e ridurre la tensione da misurare con un partitore resistivo.

1) se la tensione usb non è perfettamente 5,00V, ma 5,01V Arduino non la rende stabile a 5,00V e sballa i risultati di lettura?

no, l' arduino non stabilizza i 5V riferimento.

2) perchè anche i risultati di Mauro sono sballati?

non so rispondere.

Pensandoci: se la tenssione 5V é piú grande dovrei misurare di meno non di piú. 4,7 V di MauroTec spiegano meglio le tensioni misurate piú alte.

Ciao Uwe

ma se interponi una resistenza non modifichi anche il valore di tensione reale? inoltre le entrate analogiche non hanno già una resistenza intrinseca dell'ordine di Mohm?

Si anche io pensavo così e infatti ho collegato direttamente la tensione su AI3, poi ho tolto alimentazione ad arduino staccando l'usb, e il led power di arduino risultava debolmente acceso, per questo dicevo di interporre una resistenza da 1k o più non eccedendo i 10k.

@uwefed

devi dividere per 1023. Il fonoscala non é 1024 ma 1023.

Però nel datasheet usa 1024, adc = vin * 1024 / Vref.

@Tutti Ho alimentato arduino con 9Volts ho fatto girare il programmino e adesso il tester legge 2.70 arduino 2.71 dopo un po 2.72.

Scommetto che se avessi aspettato ancora 10 minuti sarebbe salita ancora un pò.

Entrando con 9Volts entra in funzione lo stabbilizzatore mc33erotti, che stabilizza a 5volts. Questi stabbilizzatori però non sono pensati come riferimenti di tensione, quanto occorre un riferimento stabbile si usano integrati compensati in temperatura che forniscono un riferimento stabbile e preciso.

Nel caso la precisione non dovesse essere considerata sufficiente le possibilià come si è detto sono due:

1)Usare il riferimento interno sperando sia stabile nel caso non lo sia ho scoperto che dentro l'atmel c'è un sensore di temperatura la si potrebbe leggere e corregere l'errore ADC.

2(Usare un circuito esterno come riferimento di tensione con le richiesta precisione, da fornire al pin Aref, quando si vuole anche una certa immunità ai disturbi allora separare anche le alimentazioni (si deve progettare un nuovo circuito a tal fine).

Ciao.