#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int batteryPin = A0;
const int batteryPin9V = A1; // Pin aggiuntivo per la batteria da 9V
const int switchPin = 2; // Pin per lo switch
// Caratteri personalizzati
byte customChars[5][8] = {
{
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000
},
{
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
B11000
},
{
B11100,
B11100,
B11100,
B11100,
B11100,
B11100,
B11100,
B11100
},
{
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
B11110
},
{
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
}
};
void setup() {
lcd.init();
lcd.backlight();
pinMode(batteryPin, INPUT);
pinMode(batteryPin9V, INPUT); // Imposta il pin per la batteria da 9V come ingresso
pinMode(switchPin, INPUT_PULLUP); // Configura lo switch pin come input con pull-up
// Carica i caratteri personalizzati nell'LCD
for (int i = 0; i < 5; i++) {
lcd.createChar(i, customChars[i]);
}
analogReference(EXTERNAL); // Imposta la tensione di riferimento a quella fornita al pin AREF
}
void loop() {
// Leggi lo stato dello switch
bool switchState = digitalRead(switchPin);
float voltage;
if (switchState == LOW) { // Se lo switch è in una posizione
// Leggi la tensione della batteria standard
voltage = analogRead(batteryPin) * (3.3 / 1023.0);
} else {
// Leggi la tensione della batteria da 9V
voltage = analogRead(batteryPin9V) * (5.0 / 1023.0) * 2;
}
// Calcola i segmenti per la barra grafica
int barSegments = map(voltage * 1000, 0, (switchState == LOW) ? 3300 : 9000, 0, 80);
// Visualizza la barra grafica e la tensione
lcd.setCursor(0, 0);
for (int i = 0; i < 16; i++) {
if (barSegments > 5) {
lcd.write((uint8_t)4); // Carattere completamente pieno
barSegments -= 5;
} else {
if (barSegments > 0) {
lcd.write((uint8_t)(barSegments - 1));
} else {
lcd.print(" ");
}
barSegments = 0;
}
}
lcd.setCursor(0, 1);
lcd.print(" "); // Pulisci con spazi vuoti
// Stampa il nuovo valore di tensione
lcd.setCursor(0, 1);
lcd.print(voltage, 2); // Mostra il valore di tensione con 2 cifre decimali
lcd.print(switchState == LOW ? " V*[1,5V] " : " V*[ 9V]");
delay(1000);
}
/*
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int batteryPin = A0;
// Caratteri personalizzati
byte customChars[5][8] = {
{
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000
},
{
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
B11000
},
{
B11100,
B11100,
B11100,
B11100,
B11100,
B11100,
B11100,
B11100
},
{
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
B11110
},
{
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
}
};
void setup() {
lcd.init();
lcd.backlight();
pinMode(batteryPin, INPUT);
// Carica i caratteri personalizzati nell'LCD
for (int i = 0; i < 5; i++) {
lcd.createChar(i, customChars[i]);
analogReference(EXTERNAL); // Imposta la tensione di riferimento a quella fornita al pin AREF
}
}
void loop() {
// Prima di leggere il valore analogico, è importante dare un po' di tempo affinché la tensione di riferimento si stabilizzi
delay(10); // Attende 10 millisecondi
float voltage = analogRead(batteryPin) * (3.3 / 1023.0); // Usa 3.3V come tensione di riferimento per la conversione
int barSegments = map(voltage * 1000, 0, 3300, 0, 80); // 16 caratteri * 5 segmenti = 80 segmenti
lcd.setCursor(0, 0);
for (int i = 0; i < 16; i++) {
if (barSegments > 5) {
lcd.write((uint8_t)4); // Carattere completamente pieno
barSegments -= 5;
} else {
if (barSegments > 0) {
lcd.write((uint8_t)(barSegments - 1)); // Disegna segmenti parziali
} else {
lcd.print(" "); // Spazio vuoto
}
barSegments = 0;
}
}
lcd.setCursor(5, 1);
lcd.print(voltage, 2); // Mostra il valore di tensione con 2 cifre decimali
lcd.print(" V ");
delay(1000);
}
*/
/*
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Indirizzo I2C del display LCD (spesso è 0x27 o 0x3F, ma può variare in base al modulo)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin di ingresso analogico A0 per la misurazione della batteria
const int batteryPin = A0;
void setup() {
lcd.init(); // Inizializza il display
lcd.backlight(); // Accende la retroilluminazione
pinMode(batteryPin, INPUT);
}
void loop() {
float voltage = analogRead(batteryPin) * (5.0 / 1023.0); // Leggi e converti il valore in tensione
int barLength = map(voltage * 1000, 0, 5000, 0, 16); // Converti il valore di tensione in lunghezza della barra (0 a 16 caratteri)
lcd.setCursor(0, 0); // Posiziona il cursore all'inizio della prima riga
for(int i=0; i<16; i++) { // Aggiungi questo ciclo for
if(i < barLength) {
lcd.write(255); // Disegna un blocco pieno per rappresentare la barra
} else {
lcd.print(" "); // Pulisci i blocchi in eccesso
}
}
lcd.setCursor(5, 1); // Posiziona il cursore all'inizio della seconda riga
lcd.print(voltage); // Mostra il valore di tensione
lcd.print(" V "); // Aggiungi spazi per pulire eventuali caratteri in eccesso e l'unità di misura
delay(1000); // Aggiorna ogni secondo
}
*/