lettura tensione batteria

Vorrei leggere la tensione di un pacco batterie stabilizzato in uscita a 5 volt tramite un pin analogico di arduino.
Tramite breadboard collego i 5 volt sul pin 5V di arduino e il GND, poi collego i 5V sul pin A1, dopo un pò
se misuro sulla breadboard la tensione con un multimetro digitale leggo circa 4.80 / 4.75 ma l'ADC
mi segna sempre 1023 /1022 e una tensione di 5V. Mentre se alimento arduino dalla presa jack oppure dall'USB e collego solo il pacco batteria con uscita stabilizzata a 5V a GND e al pin A1 leggo valori corretti
di ADC e volt (tipo ADC = 936 Volt = 4.57).
Allora credo che non posso controllare la tensione del pacco batteria che allo stesso tempo alimenta arduino? Oppure sbaglio io?

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); 

float volt = 0;
void setup() {
  Serial.begin(9600);
  lcd.init();                     
}

void loop() {
  float media = 0;
  int sensorValue = analogRead(A1);
  for (int i = 0; i < 10; i++) { 

    media = media + analogRead(A1); 
    delay (2);
  }


  media = media / 10; 
  volt = 4.887  * media / 1000;   
 
  Serial.print(sensorValue);
  Serial.print("   ");

  Serial.println(volt);


  
  lcd.backlight();
  lcd.clear();
  lcd.print("Volt = ");
  lcd.print(volt);
  lcd.setCursor(0, 1);
  lcd.print("ADC = ");
  lcd.print(sensorValue);


  delay (1000);



}

Grazie in anticipo per l'aiuto.

format:
Vorrei leggere la tensione di un pacco batterie stabilizzato in uscita a 5 volt tramite un pin analogico di arduino.

Non puoi controllare la tensione di alimentazione di Arduino tramite un pin analogico perché ottieni sempre 1023 dato che la tensione di alimentazione è al tempo stesso il riferimento del ADC.
Soluzione, usare come riferimento per l'ADC i 3.3V, ridurre la tensione in ingresso sul ADC entro questo valore con un partitore, in questo modo puoi misurare il reale valore del 5V che alimenta Arduino.

Quindi se ho ben capito (facendo qualche ricerca con google)
devo ponticellare il pin AREF con il pin 3.3 e nel setup dichiarare analogReference(EXTERNAL);
in questo modo tutti i pin analogici lavorano a 3.3 volt?
Siccome al pin A0 ho collegato una cella di carico, a 3.3 volt aumenta la precisione?

Per ridurre la tensione devo fare un partitore con 2 resistenze, procedo così:
da 5 volt abbasso a 2,5 volt con 2 resistenze da 330 kohm ed entro al pin A1?

Altra possibilitá senza dover usare dei Pin, resistenze o fare dei collegamenti:

https://code.google.com/p/tinkerit/wiki/SecretVoltmeter

Ciao Uwe

Allora ho fatto il partitore di tensione, il ponticello tra il pin AREF e pin 3.3
ho usato questa funzione analogReference(EXTERNAL); e riesco ad alimentare arduino con il pacco batteria e allo stesso tempo leggo la tensione, quindi tutto ok...
mi confermate che comunque tutti i pin lavorano a 3,3 volt?

uwefed:
Altra possibilitá senza dover usare dei Pin, resistenze o fare dei collegamenti:

Google Code Archive - Long-term storage for Google Code Project Hosting.

Ho visto il codice del link, ma questa funzione long readVcc()
come la richiamo? Oppure devo solo copiare tutto il codice così come lo vedo?
Quindi solo alimentando arduino con il pacco batteria riesco a leggere la tensione?

Grazie ancora per l'aiuto.

Con questo sketch leggo la tensione senza partitore, pin, ecc...

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
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;
  result |= ADCH << 8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  return result;
}

void setup() {
  Serial.begin(9600);
  lcd.init();                      // initialize the lcd
}

void loop() {
  int mv = readVcc();
  lcd.backlight();
  lcd.clear();
  lcd.print(mv / 1000, DEC); // print the integer value of the voltage
  lcd.print("."); // print the decimal place
  lcd.print(mv % 1000, DEC); // print the rest of the voltage in millivolts
  delay(1000);
}

in output ho come valore tipo 4.855, ma se volessi leggere 4.85 come devo fare?

format:
Con questo sketch leggo la tensione senza partitore, pin, ecc...

#include <Wire.h>

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
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;
  result |= ADCH << 8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  return result;
}

void setup() {
  Serial.begin(9600);
  lcd.init();                      // initialize the lcd
}

void loop() {
  int mv = readVcc();
  lcd.backlight();
  lcd.clear();
  lcd.print(mv / 1000, DEC); // print the integer value of the voltage
  lcd.print("."); // print the decimal place
  lcd.print(mv % 1000, DEC); // print the rest of the voltage in millivolts
  delay(1000);
}




in output ho come valore tipo 4.855, ma se volessi leggere 4.85 come devo fare?

lcd.print(((mv % 1000)+5)/10, DEC); //+5 per arrondondare e /10 per togleie una decimele.

Ciao Uwe

uwefed:
lcd.print(((mv % 1000)+5)/10, DEC); /5 per arrondondare e /10 per togleie una decimele.

Ciao Uwe

grazie mille... va alla grande.