miercuri, 23 octombrie 2013

Afisaj de Nokia 3410 comandat de Arduino (II)

   In prima parte am prezentat modul de conectare al afisajului de Nokia 3410 si cum am reusit sa-l folosesc la rezolutia maxima de 95x65 (fata de cea a celui de Nokia 3310 cu 84x48).
   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 drawFrame
iar 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