Ceas cu Big Font si LCD 20x4
Daca tot au fost Sarbatorile Pascale si cumulate cu acest Covid 19, iar daca tot stam acasa (asa cum am indemnat pe toti cei care imi viziteaza blogul), am zis sa mai "cochetez" putin cu Arduino.
Asa am testat un "mic" cod pentru Ceas cu Big Font si LCD 20x4, tot aveam cele necesare la indemana si ca sa testez/invat si afisarea cu Big Font pe un LCD 20x4.
Despre Big Font am gasit informatii pe blogul lui Niq_ro, aici:
http://nicuflorica.blogspot.com/
Am preluat din caracterele Big Font create de el, decat cateva care m-au interesat pentru afisare ceas, adica cifrele de la 0-9, semnele plus, minus, doua puncte pe care le-am mai bibilit/stricat eu ca sa arate cum vroiam eu sa fie afisate cifrele.
Pentru partea de ceas am folosit un modul cu DS1307, modul achizitionat acum ceva timp de pe Aliexpress, afisarea informatiilor am realizat-o pe un LCD cu 20x4 caractere.
Pe prima linie am afisat data (ziua, luna, anul) precum si ziua curenta.
Pe linia 2 a afisajului am afisat : lcd.print("--------------------"); ca sa fac o "separare" intre ce era afisat pe prima linie de la LCD si ceasul cu Big Font care este afisat pe liniile 3 si 4 ale LCD-ului.
Ceasul cu Big Font care este afisat pe liniile 3 si 4 ale LCD-ului.
Asa arata ceasul cu Big Font si afisare pe LCD 20x4:
Ceva mici imbunatatiri-modificari in cod , fata de codul postat, pentru alt aspect.
Atasez si codul care se "ocupa" cu acest Ceas cu Big font si LCD 20x4 pentru cei interesati:
//===============================================//
// //
// Ceas cu Big Font si LCD V-1, 2o2o //
// //
// https://hobby-geomar.blogspot.com/ //
// //
//===============================================//
//---- Biblioteci necesare ----------------------------------
#include <LiquidCrystal.h> //Biblioteca LCD
#include "RTClib.h" //Biblioteca RTC-Ceas
//-- variabila pentru afisare luna ---------------------------------
const char* Months[] =
{"Dec", "Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sep", "Oct", "Nov" };
// ---- Variabile pentru meniu Ceas -------------------------
int ora;
int minut;
int secunda;
int x = 0;
// cele 8 caractere care formează fiecare segment al numerelor personalizate
byte LT[8] = {B00111, B01111, B11111, B11111, B11111, B11111, B11111, B11111};
byte UB[8] = {B11111, B11111, B00000, B00000, B00000, B00000, B00000, B00000};
byte RT[8] = {B11100, B11110, B11111, B11111, B11111, B11111, B11111, B11111};
byte LL[8] = {B11111, B11111, B11111, B11111, B11111, B11111, B01111, B00111};
byte LB[8] = {B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111};
byte LR[8] = {B11111, B11111, B11111, B11111, B11111, B11111, B11110, B11100};
byte UMB[8] = {B00000, B00000, B11111, B11111, B11111, B00000, B00000, B00000};
byte LMB[8] = {B11111, B11111, B00000, B00000, B00000, B00000, B11111, B11111};
//---- Definire pini pentru conectare LCD ---------------------
LiquidCrystal lcd (7, //RS no digital 7
6, //EN no digital 6
5, //D4 no digital 5
4, //D5 no digital 4
3, //D6 no digital 3
2); //D7 no digital 2
RTC_DS1307 RTC; //Tip de DS folosit la RTC - ceas
//-----------------------------------------------------------
void setup()
{
lcd.begin(20, 4); // Initializare tip LCD 20x4
RTC.begin();
//---- Citire Valori din DS1307 pentru functionare ceas ------
DateTime now = RTC.now();
now = RTC.now();
ora = now.hour();
minut = now.minute();
secunda = now.second();
if ( !RTC.isrunning()) {
// Sters ! RTC NU rulează
// linia următoare stabilește RTC la data și ora la care a fost compilată această schiță
// daca se sterge ! de la RTC.isrunning()
RTC.adjust(DateTime(__DATE__, __TIME__));
}
//--- crearea celor 8 caractere personalizate
lcd.createChar(1, UB);
lcd.createChar(2, RT);
lcd.createChar(3, LL);
lcd.createChar(4, LB);
lcd.createChar(5, LR);
lcd.createChar(6, UMB);
lcd.createChar(7, LMB);
lcd.createChar(8, LT);
}
//-------------------------------------------
void loop()
{
x = 0;
afisare(ora / 10);
x = x + 4;
afisare(ora % 10);
x = x + 4;
custom2puncte();
x = x + 2;
afisare(minut / 10);
x = x + 4;
afisare(minut % 10);
DateTime now = RTC.now();
now = RTC.now();
ora = now.hour();
minut = now.minute();
secunda = now.second();
lcd.setCursor(0, 0);
if (now.day() < 10)
lcd.print(' ');
lcd.print(now.day(), DEC);
lcd.print('-');
lcd.print(Months[now.month()]);
lcd.print('-');
lcd.print(now.year(), DEC);
lcd.print(' ');
lcd.setCursor(0, 1);
lcd.print("--------------------");
lcd.setCursor(18, 3);
if (now.second() < 10)
lcd.print('0');
lcd.print(secunda);
lcd.setCursor(12, 0);
int dayofweek = now.dayOfTheWeek();
switch (dayofweek) {
case 1:
lcd.print(" Luni ");
break;
case 2:
lcd.print(" Marti ");
break;
case 3:
lcd.print("Miercuri");
break;
case 4:
lcd.print(" Joi ");
break;
case 5:
lcd.print(" Vineri ");
break;
case 6:
lcd.print(" Sambata");
break;
case 0:
lcd.print("Duminica");
break;
}
}
//--------------------------------------------
//------ creare cifre personalizate ----------
void custom0O()
{ // uses segments to build the number 0
lcd.setCursor(x, 2);
lcd.write(8);
lcd.write(1);
lcd.write(2);
lcd.setCursor(x, 3);
lcd.write(3);
lcd.write(4);
lcd.write(5);
}
//---------------------------------------
void custom1()
{
lcd.setCursor(x, 2);
lcd.write(1);
lcd.write(2);
lcd.write(' ');
lcd.setCursor(x , 3);
lcd.write(4);
lcd.write(255);
lcd.write(4);
}
//---------------------------------------
void custom2()
{
lcd.setCursor(x, 2);
lcd.write(1);
lcd.write(1);
lcd.write(2);
lcd.setCursor(x, 3);
lcd.write(8);
lcd.write(7);
lcd.write(7);
}
//---------------------------------------
void custom3()
{
lcd.setCursor(x, 2);
lcd.write(1);
lcd.write(1);
lcd.write(2);
lcd.setCursor(x, 3);
lcd.write(7);
lcd.write(7);
lcd.write(5);
}
//---------------------------------------
void custom4()
{
lcd.setCursor(x, 2);
lcd.write(8);
lcd.write(' ');
lcd.write(255);
lcd.setCursor(x, 3);
lcd.write(1);
lcd.write(1);
lcd.write(255);
}
//---------------------------------------
void custom5()
{
lcd.setCursor(x, 2);
lcd.write(255);
lcd.write(7);
lcd.write(7);
lcd.setCursor(x, 3);
lcd.write(4);
lcd.write(4);
lcd.write(5);
}
//---------------------------------------
void custom6()
{
lcd.setCursor(x, 2);
lcd.write(8);
lcd.write(1);
lcd.write(1);
lcd.setCursor(x, 3);
lcd.write(3);
lcd.write(7);
lcd.write(5);
}
//---------------------------------------
void custom7()
{
lcd.setCursor(x, 2);
lcd.write(1);
lcd.write(1);
lcd.write(2);
lcd.setCursor(x , 3);
lcd.write(' ');
lcd.write(8);
lcd.write(' ');
}
//---------------------------------------
void custom8()
{
lcd.setCursor(x, 2);
lcd.write(8);
lcd.write(1);
lcd.write(2);
lcd.setCursor(x, 3);
lcd.write(3);
lcd.write(7);
lcd.write(5);
}
//---------------------------------------
void custom9()
{
lcd.setCursor(x, 2);
lcd.write(8);
lcd.write(7);
lcd.write(2);
lcd.setCursor(x, 3);
lcd.write(4);
lcd.write(4);
lcd.write(5);
}
//---------------------------------------
void customqm()
{
lcd.setCursor(x, 2);
lcd.write(1);
lcd.write(6);
lcd.write(2);
lcd.setCursor(x, 3);
lcd.write(254);
lcd.write(7);
}
//---------------------------------------
void customsm()
{
lcd.setCursor(x, 2);
lcd.write(255);
lcd.setCursor(x, 3);
lcd.write(7);
}
//---------------------------------------
void customplus() // made by niq_ro
{
lcd.setCursor(x, 2);
lcd.write(4);
lcd.write(255);
lcd.write(4);
lcd.setCursor(x, 3);
lcd.write(1);
lcd.write(255);
lcd.write(1);
}
//---------------------------------------
void customminus() // made by niq_ro
{
//lcd.setCursor(x, 2);
//lcd.write(4);
//lcd.write(4);
//lcd.write(4);
lcd.setCursor(x, 3);
lcd.write(1);
lcd.write(1);
lcd.write(1);
}
//---------------------------------------
void customgrad()
{
lcd.setCursor(x, 2);
lcd.write(1);
lcd.write(8);
lcd.write(1);
// lcd.write(1);
lcd.setCursor(x, 3);
lcd.write(254);
lcd.write(3);
lcd.write(4);
//lcd.write(4);
}
//---------------------------------------
void custom2puncte()
{
lcd.setCursor(x, 2);
lcd.write(6);
lcd.setCursor(x, 3);
lcd.write(6);
}
//---------------------------------------
void custom1punct()
{
lcd.setCursor(x, 3);
lcd.write(4);
}
//---------------------------------------
// subrutina de afisare a numerelor
void afisare(int numar)
{
switch (numar)
{
case 0:
custom0O();
break;
case 1:
custom1();
break;
case 2:
custom2();
break;
case 3:
custom3();
break;
case 4:
custom4();
break;
case 5:
custom5();
break;
case 6:
custom6();
break;
case 7:
custom7();
break;
case 8:
custom8();
break;
case 9:
custom9();
break;
}
}
//--------------- Sfarsit Program ---------------
Pentru a putea functiona si cu LCD cu 16x2 caractere,
sunt necesare ceva modificari in cod, DAR nu vor mai afisate toate informatiile afisate pe un LCD 20x4, se poate afisa DOAR: data, ziua, luna, an, sau ora curenta, aceste modificari le voi posta dupa ce voi face modificarile necesare si dupa testarea codului.
Am sa testez afisarea informatiilor de pe LCD 16x2, prin doua meniuri (meniuri testate in alt proiect) care vor afisa ciclic informatiile utile, unul va afisa ziua, data, luna, anul si altul va afisa ceasul cu caracterele Big Font.
Voi reveni cat de curand si cu un Ceas cu Big Font afisat pe un LCD 16x2 ...