Deoarece libraria grafica pe care am folosit-o, si anume u8glib
are prezentat si un manual de utilizare in care se prezinta si comenzile, m-am gandit sa refac prezentarea grafica a unui secundar de ceas, cum am facut cu afisajul de Nokia 3310, vezi articolul Afisajul folosit la telefoanele Nokia 5110/3310 si Arduino (IV), folosind si placa Arduino facuta de Nelu, ca si afisajul e de la el si poate se inteleg mai bine:
Pentru a intelege libraria, am studiat si, am folosit, comenzi sau parti din exemplele care vin cu libraria, dar si ce e in manual:
// prima prezentare grafica
u8g.firstPage(); // pregateste partea grafica
do {
subrutina(); // "munceste" in subrutina, unde e mesajul de intampinare
} while( u8g.nextPage() ); // pana se termina acea parte grafica
delay(5000); // asteapta 5 secunde sa faca altceva (si sa pastreze imaginea pe ecran)
Grafica dintr-o pagina (ecran) se comanda din programul principal cu comenzile prezentate mai sus, iar un subrutina propriu-zisa, poate fi:void subrutina(void) {
// folosesesc un anume font
u8g.setFont(u8g_font_unifont);
//u8g.setFont(u8g_font_osb21); // sau alt font
u8g.drawStr( 3, 22, "Salut Nicu!"); // la coordonatele cu x=3 si y=22 scriu mesajul
// pictez un chenar
u8g.drawFrame(1,1,93,63);
// u8g.setFont(u8g_font_unifont); // font mai maricel (nefolosit)
u8g.setFont(u8g_font_6x13); // font mai mititel
u8g.drawStr( 3, 40, "afisez mesaj pe");
u8g.drawStr( 6, 50, "ecran de Nokia");
u8g.drawStr( 40, 60, "3410");
}
Despre cum se face un cadru, vedeti comanda drawFrameiar despre cum scriu un text, vedeti comanda drawStr
Partea grafica a fost ok, chiar si afisarea de texte de diverse marimi, dar am vrut sa afisez secundele corespunzatoare pozitiei secundarului si a trebuit sa folosesc corespondenta caracterelor ASCII:
Eu am folosit o varianta care merge ok, adica am aflat cifra de la zeci si cea de la unitati si am adunat la ele pe 48...iar inainte am desenat un cerc si secundarul.. pentru fiecare secunda transmit variabila unghi si "chem" subrutina numita subrutina2
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, 50, "niq_ro"); }
else
{ u8g.drawStr(30, 20, "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, 10, s);
}
else
{
s[0]=int(unghi/10)+48;
u8g.drawStr(4, 10, s);
}
s[0]=unghi-10*int(unghi/10)+48;
u8g.drawStr(10, 10, s);
}
Bun, am facut si un film numit Arduino with Nokia 3410 LCD (2):
Sketch-ul folosit de mine este urmatorul:
/*
// original sketch by niq_ro from http://nicuflorica.blogspot.com for analog clock using u8glib library
// version 1m5 - 2013.10.22, Craiova - Romania
>>> 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
int xmax=94; // lungime maxima pe axa x
int ymax=64; // lungime maximape axa y
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;
//int ji=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, 22, "Salut Nicu!");
// pictez un chenar
u8g.drawFrame(1,1,93,63);
// u8g.setFont(u8g_font_unifont);
u8g.setFont(u8g_font_6x13);
u8g.drawStr( 3, 40, "afisez mesaj pe");
u8g.drawStr( 6, 50, "ecran de Nokia");
u8g.drawStr( 40, 60, "3410");
}
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, 50, "niq_ro"); }
else
{ u8g.drawStr(30, 20, "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, 10, s);
}
else
{
s[0]=int(unghi/10)+48;
u8g.drawStr(4, 10, s);
}
s[0]=unghi-10*int(unghi/10)+48;
u8g.drawStr(10, 10, 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, 30, "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
Niciun comentariu:
Trimiteți un comentariu