Dupa ce m-am "jucat" cu ESP32-C3 Mini (Supermini), am observat ca afisajul monocrom cu ST7920 este destul de mare ca dimensiuni, asa ca am zis sa modific cu ajutorul AI-ului programul ceasului NTP cu ESP8266.
Prima versiune a fost cea cu format de 12 ore, programul modificat pentru ESP32-C3 Mini (Supermini) este NTPclock_ESP32C3_st7920_v1.inoUn blog ce completeaza site-ul www.arduinotehniq.com (www.tehnic.go.ro); o parte din articole sunt (si vor fi) postate si in engleza pe arduinotehniq.blogspot.com. Filmuletele tehnice se gasesc pe canalul de youtube...
Se afișează postările sortate după relevanță pentru interogarea st7920. Sortați după dată Afișați toate postările
Se afișează postările sortate după relevanță pentru interogarea st7920. Sortați după dată Afișați toate postările
duminică, 9 august 2026
Ceas NTP cu ESP32-C3 Mini pe afisaj monocrom SPI (rezolutie128x64 si driver ST7920)
iar schema asemanatoare cu cea de la ESP8266, doar ca a trebuie sa conectez pinul de contrast la 3.3V printr-o rezistenta de 470Ω si sa am cca. 4,4V pe pinul respectiv (in mod normal se coneteaza un semireglabil de 10kΩ intre 5V si GND, dar nu l-am avut la indemana si am improvizat).
Am facut 2 filmulete:
Apoi am revenit la formatul de 24 ore, am adaugat reglaj automat ora de vara/iarna si sa se reconecteze in caz ca pierde legatura cu reteaua WiFi.
Programul este NTPclock_ESP32C3_st7920_v2.ino si am facut 2 filmulete:
Am considerat ca imaginea este statica, asa ca am introdus si secundele, programul devenind NTPclock_ESP32C3_st7920_v2a.inoCa de obicei, am facut 2 filmulete:
10.08.2026
Pe timp de noapte, lumina de fundal este deranjanta, asa ca am introdus o rezistenta de 470Ω in serie cu ledul de fundal si tensiunea de 3,3V.
vineri, 20 iulie 2018
Ceas reglabil pe afisaj LCD12864 (ST7920)
Avand de gand sa folosesc afisajul monocrom cu rezolutie de 128x64 cu driver ST7920 (l-am mai prezentat pe blog - http://nicuflorica.blogspot.com/search?q=st7920) la un sistem gen cronostat pe mai multe zone, am zis ca intai sa fac partea de ceas cu reglaj al datei si orei.
M-am folosit de articolele cu afisajul, de articolul Arduino Astronomical Clock (or Arduino Pond Pump Controller!) si ale mele http://nicuflorica.blogspot.com/search?q=andydoz. Schema de conectare este
programul utilizat fiind u8glib_RTC_clock1.ino, apoi am implementat si partea de reglaj,
Daca se apasa scurt butonul de epe encoder apare un mesaj cu date despre program
iar daca se apasa lung intra in meniul de reglaj, la modificarea anului
prin rotirea encoderului se modifica valoarea (minimul fiind 2018, vorba lui Andy, asta nu e masina timpului sa trec in anii anteriori) apoi la paasare scurtaa butonului se ajunge in meniul de reglaj al lunii
apoi se trece in reglajul zilei din luna
Dupa apasarea butonului se intra in partea de reglaj a ceasului, la ore
si apoi la minute
Apasand din nou butonul se revine la modul de functionare normala, ca ceas
In filmuletele de mai jos s evedem modul de functionare si reglare
- ceas pe afisaj 128x64 cu ST7920 (3)
- RTC clock on 128x64 display with ST7290 (3)
Am constatat ca programul ocupa foarte mult spatiu (97%) si nu o sa imi incapa tot ce aveam de gand, asa ca voiam sa renunt si sa trec pe afisaj alfanumeric LCD2004 (20x4), dar dupa ce am discutat cu Vlad si mi-a zis ca fonturile folosite de mine consuma multa memorie, m-am mai jucat cu fonturile si am redus mult memoria ocupata (67%), dupa cum se vede in filmuletele
- ceas pe afisaj 128x64 cu ST7920 (4)
- RTC clock on 128x64 display with ST7290 (4)
Sketch-ul optimizat este u8glib_RTC_clock2.ino.
M-am folosit de articolele cu afisajul, de articolul Arduino Astronomical Clock (or Arduino Pond Pump Controller!) si ale mele http://nicuflorica.blogspot.com/search?q=andydoz. Schema de conectare este
iar configurarea in program (sketch) este
(se foloseste libraria u8glib)
Am adaptat sketch-ul gasit in articolul Analog LCD clock - Arduino LCD combinandu-l cu cel al lui Andy, initial avand prezentarea asta
Deoarece libraria RTClib nu are posibilitatea de a regla si ziua din luna (se poate face altfel, cum e prezentat in articolul Tronixstuff – Using DS1307 and DS3231 Real-time Clock Modules with Arduino, dar nu am timp prea mult de teste, asa ca am renuntat la aceasta facilitate momentan).
Initial, am pus doar partea de afisare, dupa cum se vede in filmuletele:
Daca se apasa scurt butonul de epe encoder apare un mesaj cu date despre program
iar daca se apasa lung intra in meniul de reglaj, la modificarea anului
prin rotirea encoderului se modifica valoarea (minimul fiind 2018, vorba lui Andy, asta nu e masina timpului sa trec in anii anteriori) apoi la paasare scurtaa butonului se ajunge in meniul de reglaj al lunii
apoi se trece in reglajul zilei din luna
Dupa apasarea butonului se intra in partea de reglaj a ceasului, la ore
si apoi la minute
Apasand din nou butonul se revine la modul de functionare normala, ca ceas
In filmuletele de mai jos s evedem modul de functionare si reglare
- ceas pe afisaj 128x64 cu ST7920 (3)
- ceas pe afisaj 128x64 cu ST7920 (4)
miercuri, 23 august 2023
Ceas NTP in format de 12 ore pe afisaj monocrom SPI (rezolutie128x64 si driver ST7920)
Deoarece m-am tot "batut" cu afisaj de 2.2" cu interfata i2c si driver ST7567S, in sensul ca dupa un timp apar "balarii", dupa cum am descris in articolul anterior si intr-un-ul mai vechi, am zis sa revin la un afisaj "clasic", cu interfata SPI, cu aceeasi rezolutie de 128x64, cel cu driver ST7920 si diagonala mai mare.
Am luat ca baza de plecare programul pentru ceasul NTP in format de 12 ore pe afisaj de 1,3" cu driver SH1107 prezentat intr-un articol recent,
doar ca folosit configuratia din articolul ESP8266 and ST7920 powered 128*64 Liquid Crystal Display in a test bench, in care este prezentata si schema de test Am folosit configurarea recomandata, pentru biblioteca u8g2lib esteU8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R2, 14, 13, 15, U8X8_PIN_NONE);
si astfel programul pentru ceasul NTP in format de 12 ore pe afisaj SPI monocrom cu driver ST7920 este NTPclock_12864_st7920_v1c3.ino.
Am realizat si 2 filmulete:
24.08.2023
Am realizat ca afisajul e mai mare decat aveam eu informatiile initiale (2,9" sau 2,6", areal are 3,1-3,2") pentru ca are diagonala de cca. 8-8,1cm.
duminică, 16 august 2026
Statie meteo cu ESP32-C3 Mini pe afisaj monocrom SPI (rezolutie128x64 si driver ST7920)
Am considerat ca pe afisajul ST7920 cu rezolutie 128x64 incap mai multe informatii (nu doar un simplu ceas, adica), asa ca am apelat la AI sa im introduca temperatura si umiditatea de la serverul open-meteo, pe langa data si numele zilei (informatii alternativ in romana si engleza)
Programul este weatherstation_esp32c3_st7920_v1.ino si cu el incarcat, am facut 2 filmulete:
Dupa ce am testat ore bune, am adaugat si celelalte informatii utile (stare vreme, presiune, vant, indice UV pe timp de zi, indice calitate aer)
miercuri, 18 iunie 2014
Afisajul grafic monocrom LCD12864 (cu driver ST7920) comandat serial de Arduino
Am achizitionat un afisaj grafic monocrom LCD12864, care are o rezolutie de 128x64 si este controlat de integratul ST7920.
Deoarece acest afisaj se poate comanda paralel sau serial, am preferat varianta cu mai putine fire, asa ca m-a oprit la articolul Display gráfico LCD 128x64 - ST7920, care foloseste libraria grafica u8glib.
Am folosit-o si eu pentru afisajul de Nokia 3410 cu driver PCF8812(vedeti un exemplu, articolul Afisaj de Nokia 3410 comandat de Arduino (III): Masurare temperaturi in 2 zone si afisare pe ecran de Nokia 3410).
Revenind la afisajul cel nou si la articolul brazilian, va prezint schema de conectare:
Dupa realizarea practica a montajului, am incarcat sketch-ul de acolo, obtinand:
Din primele teste, am realizat ca reglajul contrastului nu se face, indiferent de tensiunea de pe pinul VO (de la 0 la 5V), asa ca am incercat si fara: merge foarte bine.
Schema simplificata, folosita de mine este:
Am incarcat si modificat un pic sketch-ul prezentat in articolul Afisaj de Nokia 3410 comandat de Arduino (II)
De data asta, totul este mai mare:
Am facut si un filmulet, numit teste cu afisajul grafic LCD12864 cu ST7920 si Arduino
Sketch-ul folosit de mine, nefinisat, dar functional, este:
/*
// original sketch by niq_ro from http://nicuflorica.blogspot.com for analog clock using u8glib library
// version 1m5 - 2013.10.22, Craiova - Romania
// version 1m6 - 2014.06.17, Craiova
>>> Before compiling: Please remove comment from the constructor of the
>>> connected graphics display (see below).
Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
Copyright (c) 2012, olikraus@gmail.com
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list
of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "U8glib.h"
// ecran de Nokia 3410
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
//U8GLIB_PCD8544 u8g(3, 4, 7, 5, 6); // SPI Com: SCK = 3, MOSI = 4, CS = 7, A0 = 5, Reset = 6
// U8GLIB_PCF8812 u8g(3, 4, 7, 5, 6);
U8GLIB_ST7920_128X64_1X u8g(6, 5, 4 ,7); //Enable, RW, RS, RESET
int xmax=128; // lungime maxima pe axa x (ST7920 LCD12864))
//int xmax=94; // lungime maxima pe axa x (LCD Nokia 3410)
//int xmax=84; // lungime maxima pe axa x (LCD Nokia 3310)
int ymax=64; // lungime maxima pe axa y (ST7920 LCD12864)
//int ymax=64; // lungime maxim ape axa y (LCD Nokia 3410)
//int ymax=48; // lungime maxima pe axa y (LCD Nokia 3310)
int xcenter=xmax/2; // centrul ecranului pe axa x
int ycenter=ymax/2; // centrul ecranului pe axa y
int raza=ymax/2-2; // raza cercului
int unghi=0;
// for LCD12864 with ST7920:
float kx = 1.37;
float ky = 1;
float kt = 1.2;
float xt=15;
// for Nokia 3310:
// float kx = 1;
// float ky = 1;
// float kt = 1;
// float xt=0;
// for Nokia 3410 LCD:
//float kx = 0.9;
//float ky = 0.57;
//float kt = 1;
// float xt=0;
void subrutina(void) {
// graphic commands to redraw the complete screen should be placed here
u8g.setFont(u8g_font_unifont);
//u8g.setFont(u8g_font_osb21);
u8g.drawStr( 3*kt+xt, 22*ky, "Salut Nicu!");
// pictez un chenar
u8g.drawFrame(1,1,93*kx,63*ky);
// u8g.setFont(u8g_font_unifont);
u8g.setFont(u8g_font_6x13);
u8g.drawStr( 3*kx*kt+xt, 40*ky, "afisez mesaj pe");
u8g.drawStr( 6*kx*kt+xt, 50*ky, "ecran grafic");
u8g.drawStr( 14*kx*kt+xt, 60*ky, "128x64");
}
void subrutina1(void) {
// desenez cercul principal
u8g.drawCircle(xcenter,ycenter,raza);
/*
// un font si mai mic
u8g.setFont(u8g_font_4x6);
u8g.drawStr(40, 60, "3410");
*/
// trag o linie din centrul cercului la cifra 0/12
u8g.drawLine(xcenter, ycenter, xcenter, ycenter-raza);
// delay(500);
u8g.drawLine(xcenter, ycenter, xcenter+raza, ycenter);
// delay(500);
u8g.drawLine(xcenter, ycenter, xcenter, raza+ycenter);
// delay(500);
u8g.drawLine(xcenter, ycenter, xcenter-raza, ycenter);
// delay(500);
}
void subrutina2(uint8_t unghi) {
// desenez cercul principal
u8g.drawCircle(xcenter,ycenter,raza);
// for (unghi=0; unghi<60; unghi+=1);
float x1=sin(6*unghi*2*3.14/360);
float y1=cos(6*unghi*2*3.14/360);
u8g.drawLine(xcenter, ycenter, xcenter+raza*x1, ycenter-raza*y1);
// folosesc un font mititel
u8g.setFont(u8g_font_6x13);
if (unghi <15 || unghi>45)
{ u8g.drawStr(30*kx*kt, 50*ky, "niq_ro"); }
else
{ u8g.drawStr(30*kx*kt, 20*ky, "niq_ro");
}
char s[2] = " ";
if (unghi<10)
{
// see http://www.asciitable.com/
s[0]=unghi+48; // transform cifrele in caractere ASCII
u8g.drawStr(10*kx, 10*ky, s);
}
else
{
s[0]=int(unghi/10)+48;
u8g.drawStr(4*kx, 10*ky, s);
}
s[0]=unghi-10*int(unghi/10)+48;
u8g.drawStr(10*kx, 10*ky, s);
}
void subrutina3(void) {
// pun font si apoi scriu mesaj de sfarsit...
// u8g.setFont(u8g_font_gdr25);
u8g.setFont(u8g_font_unifont);
u8g.drawStr(20*kx*kt, 30*ky, "Sfarsit!");
}
void setup(void) {
// flip screen, if required
// u8g.setRot180();
// set SPI backup if required
//u8g.setHardwareBackup(u8g_backup_avr_spi);
// assign default color value
if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
u8g.setColorIndex(255); // white
}
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
u8g.setColorIndex(3); // max intensity
}
else if ( u8g.getMode() == U8G_MODE_BW ) {
u8g.setColorIndex(1); // pixel on
}
else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
u8g.setHiColorByRGB(255,255,255);
}
}
u8g_uint_t xx=0;
void loop(void) {
// picture loop
u8g.firstPage();
do {
subrutina(); // unde e mesajul de intampinare
} while( u8g.nextPage() );
delay(5000);
// a doua reprezentare grafica
u8g.firstPage();
do {
subrutina1(); // unde desenez ceva pana ma prind cum se face
} while( u8g.nextPage() );
delay(5000);
// rebuild the picture after some delay
delay(150);
// fac ceasu' cu secundar
for (xx = 0; xx < 60; xx++) // aici ar fi secundele
{
u8g.firstPage(); // incepere parte de grafica
do { // face asta pana termina ce e in subrutina de desenat
subrutina2(xx); // munceste la ce e in subrutina2
} while( u8g.nextPage() ); // pana o termina
delay(1000); // sta o secunda
}
xx=0; // readuce cronometrul la zero
delay(2000); // sta 2 secunde
// a treia reprezentare grafica
u8g.firstPage();
do {
subrutina3(); // unde scriu ca s-a terminat demonstratia...
} while( u8g.nextPage() );
delay(10000); // sta 10 secunde
} // final de program, se revine de la inceput
Abonați-vă la:
Postări (Atom)
-
Pentru cazuri cand trebuie sa alimentam un montaj sau un consumator (radio portabil, beculet, etc) de la o sursa de tensiune continua fix...
-
ultima modificare: 12.04.2020 Fata de sistemele clasice pentru incubatoare care regleaza doar temperatura, la solicitarea lui Vior...
-
rezumat articol Avand o situatie in care am o masina de spalat automata veche (AEG Lavamat Regina 804), pe care am reusit s-o reconditi...


























