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);
}
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?
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:
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?
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.