// Marca: Freenove
// Modello: FNK0079
// Tipo: LCD blue back light, 20x4 chars, I2C interface
// https://github.com/Freenove/Freenove_LCD_Module
#include <LiquidCrystal_I2C.h>
#define LCD_COLUMNS 20 // Numero di colonne dello schermo LCD
#define LCD_ROWS 4 // Numero di righe dello schermo LCD
#define LCD_I2C_ADDRESS 0x27 // Indirizzo I2C seriale dello schermo LCD
LiquidCrystal_I2C lcd(LCD_I2C_ADDRESS, LCD_COLUMNS, LCD_ROWS);
// There are 6 byte arrays. In each array, there are 7 bytes and each byte has 5 bits (the 3 leading zeros dont count)
byte barZeroBar[] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte barOneBar[] =
{
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000
};
byte barTwoBar[] =
{
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
B11000
};
byte barThreeBar[] =
{
B11100,
B11100,
B11100,
B11100,
B11100,
B11100,
B11100,
B11100
};
byte barFourBar[] =
{
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
B11110
};
byte barFiveBar[] =
{
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte barSkeleton[] =
{
B01110,
B11111,
B10101,
B11111,
B01110,
B10101,
B01110,
B10001
};
byte barHeart[] =
{
0x00,
0x00,
0x0A,
0x1F,
0x1F,
0x0E,
0x04,
0x00
};
byte barSmiley[] =
{
B00000,
B01010,
B01010,
B01010,
B00000,
B10001,
B01110,
B00000
};
byte copyright[] =
{
B01110,
B10001,
B10111,
B11001,
B11001,
B10111,
B10001,
B01110
};
void setup()
{
lcd.begin(20, 4);
lcd.backlight();
lcd.createChar(0, barZeroBar);
lcd.createChar(1, barOneBar);
lcd.createChar(2, barTwoBar);
lcd.createChar(3, barThreeBar);
lcd.createChar(4, barFourBar);
lcd.createChar(5, barFiveBar);
lcd.createChar(6, barSkeleton);
lcd.createChar(7, barSmiley);
lcd.createChar(8, copyright);
lcd.setCursor(5, 0);
lcd.printstr("DHARP 1.0");
lcd.setCursor(6, 1);
lcd.write(8);
lcd.printstr(" 2024");
lcd.setCursor(2, 2);
lcd.printstr("Arroscia FabLab");
delay(3000);
lcd.clear();
lcd.setCursor(5, 0);
lcd.printstr("DHARP 1.0");
//lcd.setCursor(1, 2);
//lcd.printstr("PAUSA PER PIOGGIA");
//lcd.setCursor(3, 2);
//lcd.printstr("PAUSA NOTTURNA");
//lcd.setCursor(1, 2);
//lcd.printstr("PAUSA PROGRAMMATA");
//lcd.setCursor(3, 2);
//lcd.print("ARPA ARMATA ");
//lcd.write(6);
lcd.setCursor(3, 2);
lcd.print("ARPA PRONTA ");
lcd.write(7);
lcd.setCursor(0, 3);
lcd.printstr("Impostazioni");
lcd.setCursor(18, 3);
lcd.printstr(">>");
}
// This simple loop code prints a number from 0 to 100 on the top line and displays the progress bar on the bottom line.
// The loop counts up, pauses for 1 second, then counts down again.
void loop()
{
for(int i=0; i <= 100; i++)
{
ShowPartialProgressBar(i, 100, 1);
delay(200);
}
delay(1000);
for(int i=100; i >= 0; i--)
{
ShowPartialProgressBar(i, 100, 1);
delay(50);
}
delay(1000);
}
/*
Mostra la corretta porzione di proggress bar dati i seguenti parametri:
ulActualValue = valore corrente nell'avanzamento del conteggio
ulTotalAmmount = valore numero totale su cui contare
nlineToPrintOn = riga del display LCD su cui stampare
Ogni carattere ha 5 pixel verticali, pertanto avendo uno schermo LCD
20x4 e dovendo lasciare liberi gli ultimi 4 caratteri per scrivere il
numero max della percentuale, mi rimarranno 20 - 4 = i primi 16 caratteri
16 x 5 = 80.0 pixels verticali. E' necessario che il numero contenga .0.
In caso contrario, verrà trattato come un int e non verrà calcolato
correttamente. Funziona solo per un conteggio costante in avanti o indietro.
Questa funzione non funzionerà nel caso di ulActualValue fluttuanti, come
quelli provenienti da un ingresso analogico.
*/
void ShowPartialProgressBar(unsigned long ulActualValue, unsigned long ulTotalAmmount, int nlineToPrintOn)
{
// Adatto la larghezza massima della proggress bar allo spazio su schermo disponibile
double dReductionFactor = ulTotalAmmount / 80.0;
// Ottengo la percentuale attuale di spazio occupato dalla proggress bar
int nPercent = (ulActualValue + 1) / dReductionFactor;
// Calcolo se il carattere da stampare è composto almeno da un carattere completo (5 colonne)
int nColumnNumber = nPercent / 5;
// Eventuale parte in più di colonne oltre ad un carattere intero (5 colonne)
int nColumnsLeft = nPercent % 5;
// Se è almeno un carattere completo (5 colonne)
if (nColumnNumber > 0)
{
// Stampo un carattere intero (5 colonne)
lcd.setCursor(nColumnNumber - 1, nlineToPrintOn);
lcd.write(5);
}
// Stampo la parte in più di colonne oltre ad un carattere intero (da 0 a 4 colonne)
lcd.setCursor(nColumnNumber, nlineToPrintOn);
lcd.write(nColumnsLeft);
// Scrivo la il valore in percentuale al'estrema destra della proggress bar
if (ulActualValue < 10)
lcd.setCursor((LCD_COLUMNS - 2), 1);
else if ((ulActualValue >= 10) && (ulActualValue < 100))
lcd.setCursor((LCD_COLUMNS - 3), 1);
else
lcd.setCursor((LCD_COLUMNS - 4), 1);
lcd.print(ulActualValue);
lcd.print("%");
}
/*
Mostra la corretta porzione di proggress bar dati i seguenti parametri:
ulActualValue = valore corrente nell'avanzamento del conteggio
ulTotalAmmount = valore numero totale su cui contare
nlineToPrintOn = riga del display LCD su cui stampare
Ogni carattere ha 5 pixel verticali, pertanto avendo uno schermo LCD
20x4 e dovendo lasciare liberi gli ultimi 4 caratteri per scrivere il
numero max della percentuale, mi rimarranno 20 - 4 = i primi 16 caratteri
16 x 5 = 80.0 pixels verticali. E' necessario che il numero contenga .0.
In caso contrario, verrà trattato come un int e non verrà calcolato
correttamente. Funziona solo per un conteggio costante in avanti o indietro.
Questa funzione funzionerà nel caso di ulActualValue fluttuanti, come
quelli provenienti da un ingresso analogico.
*/
void ShowFullProgressBar(unsigned long ulActualValue, unsigned long ulTotalAmmount, int nlineToPrintOn)
{
// Adatto la larghezza massima della proggress bar allo spazio su schermo disponibile
double dReductionFactor = ulTotalAmmount / 80.0;
// Ottengo la percentuale attuale di spazio occupato dalla proggress bar
int nPercent = (ulActualValue + 1) / dReductionFactor;
// Calcolo se il carattere da stampare è composto almeno da un carattere completo (5 colonne)
int nColumnNumber = nPercent / 5;
// Eventuale parte in più di colonne oltre ad un carattere intero (5 colonne)
int nColumnsLeft = nPercent % 5;
// Se è almeno un carattere completo (5 colonne)
if (nColumnNumber > 0)
{
for (int j = 0; j < nColumnNumber; j++)
{
// Stampo un carattere intero (5 colonne)
lcd.setCursor(j, nlineToPrintOn);
lcd.write(5);
}
}
// Stampo la parte in più di colonne oltre ad un carattere intero (da 0 a 4 colonne)
lcd.setCursor(nColumnNumber, nlineToPrintOn);
lcd.write(nColumnsLeft);
if (nColumnNumber < 16)
{
for (int j = nColumnNumber + 1; j <= 16; j++)
{
lcd.setCursor(j, nlineToPrintOn);
lcd.write(0);
}
}
// Scrivo la il valore in percentuale al'estrema destra della proggress bar
if (ulActualValue < 10)
lcd.setCursor((LCD_COLUMNS - 2), 1);
else if ((ulActualValue >= 10) && (ulActualValue < 100))
lcd.setCursor((LCD_COLUMNS - 3), 1);
else
lcd.setCursor((LCD_COLUMNS - 4), 1);
lcd.print(ulActualValue);
lcd.print("%");
}