Sedemsegmentni zasloni so imenitni tako za lastno rabo kot za različne delavnice, saj so svetli, poceni in jih je lahko uporabljati.
Najpreprostejši (po sestavi, ne pa za uporabo!) so takšni brez dodatnega čipovja. Sestavljen je tako, da so na eni strani povezane vse katode posamezne števke, na drugi pa vse anode, ki pripadajo istim segmentom različnih števk. Če je bil tale stavek nerazumljiv – nič hudega. Bolj pomembno je tole: tak zaslon je zoprno upravljati: če ga priključimo na Arduina, bomo za to porabili skoraj vse pine, Arduino pa tudi ne bo mogel početi nič drugega kot neprestano skrbeti za ta zaslon – tudi, kadar se njegova vsebina na spreminja.
Praktično uporabni zasloni imajo zato zraven še kak čip za krmiljenje zaslona. Trenutno sta v modi predvsem dva. Zasloni s štirimi števkami imajo navadno čip TM1637, takšni z osmimi pa MAXX7219 ali MAXX7221. Prav danes sem zalotil takšne s tremi in s šestimi, vsebovali pa so 74HC595.
Je to, kateri čip vsebuje, kaj pomembno? Nekoliko. Zasloni s čipom MAXX imajo poleg vhodov tudi izhode. Takšne zaslone lahko nizamo, enega za drugim jih lahko priključimo kar osem, a nam še vedno vzamejo le dva pina na Arduinu. En MAXX lahko skrbi za največ osem števk, vsaka ima sedem segmentov in morda še piko, torej osem. 8×8 je 64: taisti čip (in taista knjižnica) se uporablja tudi v zaslonih, sestavljenih iz 64 LEDic. Skratka, MAXX si želimo predvsem, kadar bomo uporabljali več zaslonov. Sicer pa nam je najbrž vseeno.
Skoraj. Kateri čip se skriva v zaslonu, moramo vedeti še zato, da znamo izbrati pravo Arduinovo knjižnico uporabiti za delo z njim. Zaslone, ki uporabljajo MAXX, bomo upravljali s knjižnico LEDControl. O njej kaj več kdaj drugič.
Tule pa si bomo ogledali, kako delati s TM1637.
# Žice
Zaslon priključimo tako, da CLK in DIO povežemo s poljubnima digitalnima pinoma, VCC in GND pa seveda z VCC (5 V) in GND. Na Arduina lahko priključimo več takšnih zaslonov, vendar vsakega na drug par pinov.
# Knjižnica
Na Arduinovih straneh boste našli povezavo na knjižnico TM1637Display. Čeprav je uporabna, se človek (recimo jaz :)) enkrat naveliča njenih nerodnosti. In sprogramira svojo.
Brezsramno torej priporočam, da uporabite mojo knjižnico Led7Segment. 🙂
Namestitev je preprosta. Poberite datoteko .zip in v okolju Arduino izberite Sketch / Include Library / Add .ZIP Library ter mu pokažite pravkar pobrano datoteko (ali direktorij, kamor jo je razzipal vaš brskalnik).
# Uporaba
Kot vse knjižnice je potrebno tudi tole vključiti v program.
#include <Led7Segment.h>
Zdaj bomo sestavili spremenljivko (objekt) z imenom display
(ime bi lahko bilo seveda tudi drugačno) tipa Led7Segment
. Ob tem moramo povedati, na katere pine smo priključili zaslon. Če priključimo CLK na pin 13 in DIO na pin 12, bomo torej nadaljevali z
Led7Segment display(13, 12);
Osnovno poslanstvo sedemsegmentnega zaslona je, da kaže številke. Recimo 42. Takole
display.showNumber(42);
Ker to ni posebej vznemirljivo, pokažimo še kako številko. Recimo: odštevajmo.
#include <Led7Segment.h>
Led7Segment display(13, 12); // CLK, DIO
void setup() {
for(int i = 10; i > -11; i--) {
display.showNumber(i);
delay(300);
}
void loop() {
}
# Prikaz števil
Funkcija showNumber
zna vse živo. Skoraj malo ponosen sem nanjo. 🙂
Prvi argument – in edini, v gornjih primerih – je številka, ki jo želimo pokazati. Včasih bi radi pokazali dve številki, eno na levih dveh števkah, drugo na desnih dveh. Ali spreminjali vsako števko posebej. Temu služita naslednja dva argumenta funkcije showNumber
: drugi argument pove, na katerem mestu na zaslonu želimo izpisati števko, tretji pa, koliko števk ji bomo namenili.
Števke so oštevilčene od leve proti desni; prva je 0, druga 1 in tako naprej. Če, recimo, napišemo
display.showNumber(42, 1, 3);
se bo izpisala številka 42, in sicer od druge števke (števke 1) naprej, in sicer želimo uporabiti 3 števke. Uporabili bomo torej števke 1, 2 in 3. showNumber
poravna števko na desno, torej bo števka 1 prazna, na števkah 2 in 3 pa bo pisalo 4
in 2
.
Včasih bi želeli številko izpisati tako, da odvečnih mest na levi ne zapolni s praznino temveč z ničlami. Za to pa ima showNumber
četrti argument: ta je true
ali false
. Če ga postavimo na true
, bomo namesto praznih mest dobili ničle. Tako se bo po
display.showNumber(6, 0, 2, true);
display.showNumber(4, 2, 2, true);
na zaslonu izpisalo 0604
.
Imenitni peti argument funkcije pove, v katerem številskem zapisu bi radi izpisali število. Če vas desetiški sistem dolgočasi in ste po naravi nagnjeni k sedmiškemu, dodajte na konec še argument 7
, pa se bodo števila izpisovala po sedmiško.
V vsej svoji imenitnosti showNumber
ne zmore vsega. Na štirimestni zaslon ne zna izrisati števila 12345. Ali -1234. Prav tako ne zmore
display.showNumber(123, 0, 2, true);
saj smo jo omejili na dve mesti. V tem primeru namesto števila izpiše E
-je. E kot Error.
# Pike
Večina sedemsegmentnih zaslonov ima tudi decimalne pike ali pa dvopičje med števkama. Prižigamo in ugašamo jih s setDots
. setDots(1)
prižge čisto desno piko, setDots(2)
tisto za tretjo števko, setDots(4)
tisto za drugo in setDots(8)
tisto za prvo. Pokažemo lahko tudi več pik hkrati: setDots(1 + 8)
(ja, seveda, to je isto kot setDots(9)
) bo pokazal prvo in zadnjo.
Na zaslonih z dvopičjem se le-to nahaja za drugo števko, torej ga prižgemo s setDots(4)
in ugasnemo s setDots(0)
. Če je ura 12:38
, to povemo z
display.showNumber(1238);
for(int i = 0; i < 60; i++) {
display.setDots(4);
delay(500);
display.setDots(0);
delay(500);
}
# Prižiganje in ugašanje in zatemnjevanje in brisanje
Za kako utripanje utegneta priti prav funkciji turnOff();
in turnOn();
. Klic turnOff();
le izključi prikaz števila, vsebina zaslona pa se ohrani in se spet pojavi, ko pokličemo turnOn();
.
Še bolj imenitno pa lahko utripamo tako, da nastavljamo svetlost zaslona. To počnemo s funkcijo setBrightness
, ki prejme argument med 0 in 7. Če nastavimo svetlost na 0, je zaslon najtemnejši, a še vedno viden.
for(int i = 0; i < 10; i++) {
display.setBrightness(0);
delay(500);
display.setBrightness(7);
delay(500);
}
Vsebino zaslona pobrišemo s clearDisplay();
. Če nočemo pobrisati vsega, dodamo še dva argumenta, ki povesta, od katere števke naprej brišemo in koliko števk.
# donE
Pa še funkcija za hackerje: setSegments
. Kar sami odkrijte, kaj počne tale program.
#include <Led7Segment.h>
Led7Segment display(13, 12); // CLK, DIO
uint8_t done[] = {
SEG_TR | SEG_BR | SEG_B | SEG_BL | SEG_M, // d
SEG_BR | SEG_B | SEG_BL | SEG_M, // o
SEG_BR | SEG_BL | SEG_M, // n
SEG_TL | SEG_BL | SEG_T | SEG_M | SEG_B // E
};
void setup() {
display.setSegments(done);
}
void loop() {
}
Ali, še bolj fancy, tale:
#include <Led7Segment.h>
Led7Segment display(13, 12); // CLK, DIO
uint8_t done[] = {
SEG_TR | SEG_BR | SEG_B | SEG_BL | SEG_M, // d
SEG_BR | SEG_B | SEG_BL | SEG_M, // o
SEG_BR | SEG_BL | SEG_M, // n
SEG_TL | SEG_BL | SEG_T | SEG_M | SEG_B // E
};
void setup() {
for(int i = 3; i >= 0; i--) {
display.setSegments(done, i);
delay(300);
}
}
void loop() {
display.setBrightness(0);
delay(400);
display.setBrightness(7);
delay(400);
}