Nokia 5110: Náhodné hodiny

Zápisník experimentátora

Hierarchy: Nokia 5110

Pomocou displeja Nokia 5110 si naprogramujeme hodiny, ktoré ukazujú hodiny, minúty a sekundy. Vždy po pár sekundách sa nastavia na náhodné hodnoty, ktoré sa chvíľu animujú. Na náš experiment použijeme Arduino Pro Mini, lineárny regulátor 3,3 V, level shifter a displej Nokia 5110.

Čo budeme potrebovať

V nasledovnom zozname nájdete všetky použité súčiastky (odkazy sú na Banggood):

Vo videu je použité Arduino Pro Mini. V tomto Arduine nemáme k dispozícii napätie 3,3 V, ktoré sa používa na napájanie displeja. Preto musíme použiť ešte lineárny regulátor 78L33, ktorým si upravíme napätie z 5 V na 3,3 V. Je zapojený v katalógovom zapojení spolu s kondenzátorom 0,33 uF na vstupe a 0,1 uf na výstupe.

Pretože potrebujeme okrem napájania pripojiť aj 5 dátových vodičov, ktoré majú na strane Arduina 5 V a na strane displeja 3,3 V, potrebujeme level shifter. Existuje ich viacero typov, niektoré sú vhodné do skúšobného poľa, iné sú len v SMD prevedení.

Level shifter tohoto typu je jednostranná cesta, ale to pre naše účely plne vyhovuje, nakoľko všetkých 5 vodičov odosiela údaje do displeja a nič nie je potrebné prenášať naspäť. Budeme takto ovládať piny s označením RST, CE, DC, DIN a CLK.

Zvyšné vodiče len pripojíte tak, že VCC sa pripojí na 3,3 V a vodiče LIGHT a GND sa pripoja na GND. To zabezpečí napájenie pre displej a zapnutie podsvietenia.

Algoritmus

Vykresľovanie hodín spočíva v tom, že každú sekundu vykreslíme novú scénu. Častejšie to nie je potrebné, pretože najrýchlejší pohyb na scéne je sekundová ručička.

Samotná scéna pozostáva z nakreslenia kružnice, dvanástich značiek dookola kružnice a troch ručičiek a pomocného výpisu hodnôt hodín, minút a sekúnd.

Programovanie

Na prípravu videa som využil knižnicu Adafruit PCD8544. Tú je možno nainštalovať priamo v IDE Arduina. Nezabudnite na to, že vyžaduje ešte jednu knižnicu Adafruit GFX. Rovnako by sa dali využiť aj iné knižnice. Ich použiteľný zoznam nájdete v popise displeja Nokia 5110.

V nasledovnom kóde sa nachádzajú tri riadky, ktorými pripojíte tri rôzne knižnice. Posledný riadok vytvorí objekt display typu Adafruit_PCD8544. V Adafruite zvolili trošku zvláštny spôsob zápisu, ale bude to fungovať. Osobne si myslím, že by to stačilo zapísať len ako definíciu objektu Adafruit_PCD8544 display(7, 6, 5, 4, 3);, ale na pár ušetrených bajtoch v tomto prípade až tak nezáleží.

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

V nasledovnom kóde vidíte periodické vykresľovanie hodín každú sekundu. Po desiatich sekundách sa vypočítajú nové hodnoty pre hodiny, minúty a sekundy.

void loop() {
  int h=random(24);
  int m=random(60);
  int s=random(60);
  for(int i=0;i<10;i++)
    {
    drawClock(h,m,s);
    delay(1000);
    s++;
    if(s>=60) m++;
    s=s%60;
    if(m>=60) h++;
    m=m%60;
    h=h%24;
    }
}

Vykresľovanie ručičiek na kruhu nám zabezpečuje prevod z polárnych súradníc do osí x a y cez goniometrické funkcie sínus a kosínus.

void drawClock(int h, int m, int s)
{
const int r=23;
const double rot=-M_PI/2;
double x,y,x0,y0,anglerad;
  
  display.clearDisplay();
  display.drawPixel(24,24,BLACK);
  display.drawCircle(24,24,r,BLACK);
  for(int i=0;i<12;i++)
    {
    anglerad=2*M_PI/12*i+rot;
    x=r*cos(anglerad);
    y=r*sin(anglerad);
    x0=(r-3)*cos(anglerad);
    y0=(r-3)*sin(anglerad);
    display.drawLine(24+x0,24+y0,24+x,24+y,BLACK);
    }

  // hour
  display.setCursor(50,0);
  display.print("h=");
  display.print(h);
  anglerad=2*M_PI/12*(h%12)+2*M_PI/12/60*m+rot;
  x=(r-15)*cos(anglerad);
  y=(r-15)*sin(anglerad);
  x0=0;
  y0=0;
  display.drawLine(24+x0,24+y0,24+x,24+y,BLACK);
  
  // minute
  display.setCursor(50,9);
  display.print("m=");
  display.print(m);
  anglerad=2*M_PI/60*m+rot;
  x=(r-10)*cos(anglerad);
  y=(r-10)*sin(anglerad);
  x0=0;
  y0=0;
  display.drawLine(24+x0,24+y0,24+x,24+y,BLACK);

  // second
  display.setCursor(50,18);
  display.print("s=");
  display.print(s);
  anglerad=2*M_PI/60*s+rot;
  x=(r-5)*cos(anglerad);
  y=(r-5)*sin(anglerad);
  x0=0;
  y0=0;
  display.drawLine(24+x0,24+y0,24+x,24+y,BLACK);

  // border
  display.drawLine(0,0,3,0,BLACK);
  display.drawLine(0,0,0,3,BLACK);
  display.drawLine(0,47,3,47,BLACK);
  display.drawLine(0,47,0,47-3,BLACK);
  display.drawLine(83,0,83-3,0,BLACK);
  display.drawLine(83,0,83,3,BLACK);
  display.drawLine(83,47,83-3,47,BLACK);
  display.drawLine(83,47,83,47-3,BLACK);
  
  display.display();  
}

Github

Aktuálnu verziu zdrojových textov nájdete aj na webe Github.

Video

Vo videu je popisovaný algoritmus hodín v akcii.



Download

05.03.2016


Menu