Am comanat un afisaj cu driver UC1609C, cu rezolutie de 192x64 pixeli, despre care citisem ca se poate controla cu biblioteca u8g2lib asa ca banuiam ca pot adapta usor programe de la alte afisaje cu rezolutii similare.
Pana sa soseasca afisajul, am gasit o biblioteca alternativa ERM19264_UC1609, care are o documentatie buna, asa ca am facut niste teste cu exemplele ei, cand a sosit afisajul.
rezultatele se observa in posele si filmuletele urmatoare:
Bun, testasem si biblioteca u8g2lib, doar ca am reusit sa compilez si incarc un exemplu doar cu text, dar consuma si acela multe resurse, ulterior am gasit articolul Display LCD 19264-05 V3.2 (Arduino) care indica sub-biblioteca u8x8lib ce foloseste doar text si consuma resurse putine.
Am luat programiorul de pe site si l-am adaptat sa arata ca un ceas (pseudoceas),
Am achizitionat un afisaj grafic color cu rezolutie de 320x240 (QVGA) cu diagonala de 2,2" (5,6cm) care are integratul de control de tip ILI9341.
El se alimenteaza la maxim 3,3V si se poate comanda pe 5 sau 6 fire. Dupa cateva cautari pe net am aflat ca as putea folosi solutia aplicata la afisajul grafic monocrom utilizat la telefonele Nokia 3310 (5110), care au integratul de comanda PCD8544, in care inseriasem rezistente de 10k pe pinii de comanda, cum am prezentat in articolul Afisajul folosit la telefoanele Nokia 5110/3310 si Arduino
Montajul practic arata asa, unde nu folosesc pinul MISO, dupa cum am gasit in libraria grafica ucglib:
Dupa ce am descarcat libraria ucglib, care seamana, cel putin la prima vedere cu libraria u8glib pe care am folosit-o la afisajul de Nokia 3410 si la afisajul grafic monocrom cu ST7920.
asa ca o sa trebuiasca sa modific partea de interfatare, cu CD4050, cum e prezentat pe site-ul Gordons Projects
Integratul CMOS CD4050 contine 6 buffer-e neinversoare, ce permit tensiuni mai marei la intrare decat cele de alimentare, de aceea este folosit drept convertizor de nivel logic de la 5V cat are placa Arduino la 3,3V cat are afisajul.
PS: Se poate folosi o schema simplificata cu rezistente, prin eliminarea celor 3 diode, alimentand direct din conectorul de 3,3V de pe placa Arduino:
Pana sa realizeze partea de interfata cu 4050, m-am mai "jucat" cu afisajul, de fapt cu sketch-urile, reusind sa modific unul care arata un secundar de ceas si era facut pentru a fi utilizat cu libraria u8glib:
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.
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.
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, RESETint 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 xint ycenter=ymax/2; // centrul ecranului pe axa yint raza=ymax/2-2; // raza cerculuiint 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!");
}
voidsetup(void) {
// flip screen, if required// u8g.setRot180();// set SPI backup if required//u8g.setHardwareBackup(u8g_backup_avr_spi);// assign default color valueif ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
u8g.setColorIndex(255); // white
}
elseif ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
u8g.setColorIndex(3); // max intensity
}
elseif ( u8g.getMode() == U8G_MODE_BW ) {
u8g.setColorIndex(1); // pixel on
}
elseif ( u8g.getMode() == U8G_MODE_HICOLOR ) {
u8g.setHiColorByRGB(255,255,255);
}
}
u8g_uint_t xx=0;
voidloop(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 delaydelay(150);
// fac ceasu' cu secundarfor (xx = 0; xx < 60; xx++) // aici ar fi secundele
{
u8g.firstPage(); // incepere parte de graficado { // face asta pana termina ce e in subrutina de desenat
subrutina2(xx); // munceste la ce e in subrutina2
} while( u8g.nextPage() ); // pana o terminadelay(1000); // sta o secunda
}
xx=0; // readuce cronometrul la zerodelay(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
Deoarece am primit un afisaj de la un Nokia 3410 de la Nelu si afisajul compatibil Nokia 3310 de la chinezi a "decedat" datorita contactului imperfect dintre ecran si cablaj (banda din elastomer, sau cum ii zice), am apelat la Narcis de la Multitec (fost coleg de scoala si liceu + prieten) sa-mi lipeasca o panglica din 8 fire de mufa afisajului, care arata ca "type 1" prezentat la http://serdisplib.sourceforge.net/ser/pcd8544.html:
si am facut o interfata ca si cea pentru afisajul de 3310 + condensator de 4,7uF intre Vout si masa... (merge si unul de 0,1uF):
am constatat ca zona utila de afisare e mult redusa fata de ecran, iar uneori in afara zonei de afisare apar "balarii":
Am cautat pe net sa vad daca si alti s-au mai confruntat cu aceasta problema si am gasit la http://www.radiolocman.com/shem/schematics.html?di=63334 ceva similar, cu o poza care explica mult mai bine decat ce scriu in cuvinte:
Tot cautand am descoperit libraria U8glib care suporta si "driver"-ul PCF8812, care permite, impreuna cu afisajul o rezolutie utila de 96x65 (din cei 102x65 pe care-i poate comanda) fata de PCD8544 cu 84x48 folosit la Nokia 3310... de aceea aparea si o zona nefolosita.
Dupa ce am instalat libraria, am incarcat niste exemple pentru teste si e ok: