Ceas cu Big Font si LCD 20x4




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 ...


Termometru simplu cu DS18B20 si afisare pe LCD 16x2 V-1




   Termometru simplu cu DS18B20 si afisare pe LCD 16x2  V-1


   Pentru cei ce doresc sa inceapa sa studieze Arduino, m-am decis ca sa vin in ajutorul lor cu un mic proiect de termometru care citeste temperatura de la un senzor digital Dallas tip DS18B20 si afiseaza temperatura citita pe un LCD alfanumeric de 16x2 caractere.

    Pentru acest mic proiect avem nevoie de un modul Arduino (UNO, NANO, Etc), un afisaj alfanumeric de 16x2 caractere, un senzor digital de tip DS18B20 si codul postat putin mai jos.

    Codul este foarte simplu, pentru inceput trebuiesc instalate in Arduino  librariile necesare pentru functionarea codului scris:
  • <OneWire.h>, 
  • <DallasTemperature.h>, 
  • <LiquidCrystal.h>


    Libraria: <OneWire.h>    se ocupa de comunicatia pe un singur fir.
    Libraria: <DallasTemperature.h>    se ocupa de apelarea/setarea/citirea senzorului digital DS18B20
    Libraria: <LiquidCrystal.h>  se ocupa de setarea/afisarea informatiilor pe afisajul alfanumeric 16X2




    Asa cum se vede in poza atasata mai sus, sunt incluse in cod librariile necesare bunei functionari a termometrului



   Urmatoarele linii din cod se ocupa cu asignarea pinilor de la LCD la pinii digitali Arduino la care este conectat LCD-ul 16x2.



    Urmeaza apoi in urmatoarele linii, setarile necesare pentru senzorul digital DS18B20, asignarea pinului digital Arduino la care este conectat senzorul (pin 2 in cazul nostru) si apoi declararea unei variabile tip float, intitulata "float tempC = 0" careia ii atribuim valoarea zero pentru inceput.
    In aceasta variabila v-a fi stocata ulterior temperatura citita de la senzorul digital DS18B20 pentru a putea fi afisata pe LCD-ul 16x2.

.


    In sectiunea Setup a codului Arduino, initializam senzorul digital si LCD-ul 16x2, a se vedea liniile necesare in poza atasata mai sus.




    Tot in sectiunea Setup, putem pune un mesaj personalizat ce v-a apare pe LCD la pornire.  Acest mesaj NU este necesar bunei functionarii a codului, este un mesaj informativ in care putem sa afisam ce cod rulam, ex "Termometru" si eventual daca codul este imbunatatit pe parcurs, putem afisa ce varianta folosim, ex " V-2b".

    In acest mesaj fiecare isi poate scrie ce informatie doreste sa fie afisata pe LCD,  intre ghilimele DAR sa nu depaseasca 16 caractere pe un rand.
    Daca nu se doreste afisarea mesajului, se pot sterge liniile din poza atasata mai sus, sau se pot "comenta", adica in fata fiecarei linii se pun cate doua slashuri: //

    tot la acest mesaj mai avem linia : Delay (2000);  aceasta linie adauga o intarziere de 2 secunde, timp in care este afisat mesajul personalizat.

    De retinut, functia: void setup ();  ruleaza O SINGURA DATA la alimentare si pornire modul Arduino cu tensiune,  SAU  dupa ce apasam butonul reset al placii Arduino.




    Acum in cod urmeaza functia :  void loop();   functie ce ruleaza continuu atat timp cat este alimentat Arduino, sau dupa un reset al modului.

  Aici este scris codul care trebuie executat de Arduino conform dorintelor noastre.  In cazul nostru,  primele doua linii se ocupa ce citirea senzorului digital DS18B20 si memorarea temperaturii citite de la senzor in variabila tip float tempC, variabila care memoreaza temperatura citita de la senzor pentru a putea fi afisata pe LCD-ul 16x2.


    Urmatoarele patru linii se ocupa cu afisarea temperaturii pe LCD-ul 16x2.

    Urmeaza apoi o linie de intarziere intre citirile senzorului de temperatura, un interval de o secunda cred ca este ok, asa temperatura afisata v-a fi mai "stabila", nu v-a fluctua zecimalele foarte repede, doar la 1 secunda.


    CODUL ARDUINO PENTRU TERMOMETRU


  //=========================================================//
  //=                   Codul  Arduino                                                                      =//
  //=                       pentru                                                                                =//
  //=              Termometru simplu cu DS18B20                                             =//
  //=                 si afisare pe LCD 16x2                                                           =//
  //=                           V-1                                                                                 =//
  //=          https://hobby-geomar.blogspot.com/                                          =//
  //=======================================================//
  
//--- Biblioteci necesare -------
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>


// inițializează biblioteca prin asocierea pinilor de la LCD 
// cu pinii Arduino la care sunt conectati
LiquidCrystal lcd (8,  // pin RS LCD -> digital 8 Arduino
                   7,  // pin EN LCD -> digital 7 Arduino
                   6,  // pin D4 LCD -> digital 6 Arduino
                   5,  // pin D5 LCD -> digital 5 Arduino
                   4,  // pin D6 LCD -> digital 4 Arduino
                   3); // pin D7 LCD -> digital 3 Arduino
                   

#define ONE_WIRE_BUS 2              //----- Senzorul DS 18B20 este conectat pe pin D2 Arduino
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float tempC = 0;                    //---- Variabilă care memoreaza temperatura


void setup() {

  sensors.begin();                 // --- Initializare LCD 
  lcd.begin(16, 2);                // --- Tip LCD, 16x2

// -----------------------------------------------------------------
// Cod opțional pentru mesajul introductiv
// Puneți-vă propriul mesaj între ghilimele, ex: "* Hobby-GeoMar *"
// intre ghilimele maxim 16 caractere cat are linia de la LCD 
// -----------------------------------------------------------------

  lcd.setCursor(0,0);            //---- Setare afisare mesaj 1, prima linie, pozitia 0
  lcd.print("* Hobby-GeoMar *"); //---- Mesaj 1 pentru afisare pe LCD 
  lcd.setCursor(0,1);            //---- Setare afisare mesaj 2, a doua linie, pozitia 0
  lcd.print("  blogspot.com  "); //---- Mesaj 2 pentru afisare pe LCD 
  delay(2000);                   //---- intarziere 2 secunde, timp cat este afisat mesajul
  lcd.clear();                   //---- Stergere LCD
//---------------------------------------
}

void loop() {

  sensors.requestTemperatures();      //------------------------------------------
  tempC = sensors.getTempCByIndex(0); //-- citire temperatura si memorare in tempC

  lcd.setCursor(0,0);                 //---- Setare afisare temperatura pe prima linie a LCD-ului de la pozitia 0
  lcd.print("TEMP: ");                //---- Afisare text "TEMP:" pe LCD
  lcd.print(tempC);                   //---- Afisare temperatura senzor pe LCD
  lcd.print("\337C");                 //---- Afisare simbol grad Celsius pe LCD

  delay(1000);                        //---- intarziere de 1 sec intre citire temperatura

}
//============== Terminare program ============================


   Am sa revin cat de curand si cu o schema pentru o intelegere mai usoara a codului.

   *****    Va doresc succes in invatare Arduino.    *****