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.
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.
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.
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();
}
Aktuálnu verziu zdrojových textov nájdete aj na webe Github.
Vo videu je popisovaný algoritmus hodín v akcii.
05.03.2016