buongiorno a tutto il forum.
cercando qua e la sono riuscito a mettere insieme un voltmetro per una batteria al litio da3,7volt
con una barra progressiva, funziona,pero' chiedo la vostra supervisione per valutare se e'necessaria qualche modifica.
vi ringrazio in anticipo
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
double percent = 100.0;
float somma = 0.0;
float media = 0.0;
int i = 0;
#define led_pin 13
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int LCD_NB_ROWS = 1;
const int LCD_NB_COLUMNS = 6;
byte START_DIV_0_OF_1[8] = {
B11111,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B11111
};
byte START_DIV_1_OF_1[8] = {
B11111,
B10000,
B10011,
B10011,
B10011,
B10011,
B10000,
B11111
};
byte DIV_0_OF_2[8] = {
B11111,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111
};
byte DIV_1_OF_2[8] = {
B11111,
B00000,
B11000,
B11000,
B11000,
B11000,
B00000,
B11111
};
byte DIV_2_OF_2[8] = {
B11111,
B00000,
B11011,
B11011,
B11011,
B11011,
B00000,
B11111
};
byte END_DIV_0_OF_1[8] = {
B11100,
B00100,
B00111,
B00001,
B00001,
B00111,
B00100,
B11100
};
byte END_DIV_1_OF_1[8] = {
B11100,
B00100,
B11111,
B11111,
B11111,
B11111,
B00100,
B11100
};
float voltage;
void setup() {
pinMode(A0, INPUT);
pinMode(led_pin, OUTPUT);
lcd.init();
lcd.backlight();
setup_progressbar();
lcd.clear();
}
void loop() {
{
for (i = 0; i < 100; i++)
{
voltage = analogRead(A0) * (4.87 / 1023.00) ;
somma = (somma + voltage);
delay(20); //ritardo tra due campionature successive
}
media = (somma / 100); //calcolo del valore medio di 8 rilievi
percent = media / 4.5 * 100.0; //calcola la percentuale
somma = 0; // riazzeramento della variabile somma
if (media < 3.00) //set the voltage considered low battery here
{
digitalWrite(led_pin, HIGH);
}
else {
digitalWrite(led_pin, LOW);
}
draw_progressbar(percent);
}
}
void setup_progressbar() {
lcd.createChar(0, START_DIV_0_OF_1);
lcd.createChar(1, START_DIV_1_OF_1);
lcd.createChar(2, DIV_0_OF_2);
lcd.createChar(3, DIV_1_OF_2);
lcd.createChar(4, DIV_2_OF_2);
lcd.createChar(5, END_DIV_0_OF_1);
lcd.createChar(6, END_DIV_1_OF_1);
}
void draw_progressbar(byte percent)
{
lcd.setCursor(0, 0);
lcd.print(media);
lcd.print(F(" V "));
lcd.setCursor(11, 0);
lcd.print(percent);
lcd.setCursor(0, 1);
byte nb_columns = map(percent, 0, 100, 0, LCD_NB_COLUMNS * 2 - 2);
for (byte i = 0; i < LCD_NB_COLUMNS; ++i) {
if (i == 0) {
if (nb_columns > 0) {
lcd.write(1);
nb_columns -= 1;
} else {
lcd.write((byte) 0);
}
} else if (i == LCD_NB_COLUMNS - 1) {
if (nb_columns > 0) {
lcd.write(6);
} else {
lcd.write(5);
}
} else {
if (nb_columns >= 2) {
lcd.write(4);
nb_columns -= 2;
} else if (nb_columns == 1) {
lcd.write(3);
nb_columns -= 1;
} else {
lcd.write(2);
}
}
}
}