piątek, 21 sierpnia 2015

[6] Arduino - Wyświetlacz 7 seg

Tym razem zajmę się połączeniem modułu wyświetlacza 7-segmentowego składającego się z czterech połączonych wyświetlaczy. Dzięki zastosowaniu takiego modułu mamy możliwość wyświetlania czterech odrębnych cyfr.

Wstęp


Jak już wspomniałem wcześniej będę wykorzystywał moduł wyświetlacza zaprezentowany na Rys. 1. Na rysunku zaznaczyłem także poszczególne segmenty wyświetlacza oraz jego poszczególne numery.

Rys. 1. Wygląd zewnętrzny wyświetlacza 7-segmentowego

Wyświetlacz wykorzystuje wspólną anodę. Przez co odpalenie segmentów następuje poprzez podanie stanu niskiego. Szybkie wyświetlanie danych na wszystkich wyświetlaczach jest możliwe poprzez szybkie przełączanie pomiędzy liniami wyświetlacza. 

Podłączenie


Cyfry od 1 do 4 oznaczają numer wyświetlacza, natomiast litery od a do h są to poszczególne segmenty każdego z wyświetlaczy.

Moduł podłączyłem do następujących wyprowadzeń:

VCC - 5V lub 3.3V
1 - Pin Arduino 2
2 - Pin Arduino 3
3 - Pin Arduino 4
4 - Pin Arduino 5

a - Pin Arduino 6
b - Pin Arduino 7
c - Pin Arduino 8
d - Pin Arduino 9
e - Pin Arduino 10
f - Pin Arduino 11
g - Pin Arduino 12
h - Pin Arduino 13

Program


W programie pokaże sposób inicjalizacji poszczególnych cyfr na każdym z wyświetlacza. Działania programu opiera się o odpowiednie włączanie pożądanych segmentów.

Całość programu podzielę na części, aby był on przedstawiony bardziej przejrzyście. 

W pierwszym kroku należy uwzględnić deklarację poszczególnych pinów oraz wstępną definicję funkcji. W Arduino nie ma to akurat znaczenia, takiego jak w C, natomiast przez to łatwiej będzie pamiętać o znajdujących się funkcjach. 

//Definicje połączeń
const int a = 6;
const int b = 7;
const int c = 8;
const int d = 9;
const int e = 10;
const int f = 11;
const int g = 12;
const int h = 13;
const int W4 = 5;
const int W3 = 4;
const int W2 = 3;
const int W1 = 2;
 
//Wstepna deklaracja funckji włączającej wyświetlacz
void Wys_1(void);
void Wys_2(void);
void Wys_3(void);
void Wys_4(void);
 
//Zapalenie poszczególnej cyfry
void Cyfra_1(void);
void Cyfra_2(void);
void Cyfra_3(void);
void Cyfra_4(void);
void Cyfra_5(void);
void Cyfra_6(void);
void Cyfra_7(void);
void Cyfra_8(void);
void Cyfra_9(void);
void Cyfra_0(void);

Następnie należy w funkcji setup() ustawić odpowiednie porty. Wszystkie połączenia muszą być skonfigurowane jako wyjścia.

void setup() 
{
  pinMode(a, OUTPUT);   //a
  pinMode(b, OUTPUT);   //b
  pinMode(c, OUTPUT);   //c
  pinMode(d, OUTPUT);   //d
  pinMode(e, OUTPUT);   //e
  pinMode(f, OUTPUT);   //f
  pinMode(g, OUTPUT);   //g
  pinMode(h, OUTPUT);   //h - Kropka
  pinMode(W1, OUTPUT);  //4  
  pinMode(W2, OUTPUT);  //3
  pinMode(W3, OUTPUT);  //2
  pinMode(W4, OUTPUT);  //1
}

Następnie po pętli głównej następuje definicja zdeklarowanych wcześniej funkcji. Odpowiednie podanie stanu wysokiego na wybrany pin wyświetlacza pozwala na jego włączenie.

void Wys_1()  //Pierwszy wyświetlacz
{
  digitalWrite(W1, HIGH);
  digitalWrite(W2, LOW);
  digitalWrite(W3, LOW);
  digitalWrite(W4, LOW);
}
 
void Wys_2() //Drugi wyświetlacz
{
  digitalWrite(W1, LOW);
  digitalWrite(W2, HIGH);
  digitalWrite(W3, LOW);
  digitalWrite(W4, LOW);
}
 
void Wys_3()  //Trzeci wyświetlacz
{
  digitalWrite(W1, LOW);
  digitalWrite(W2, LOW);
  digitalWrite(W3, HIGH);
  digitalWrite(W4, LOW);
}
 
void Wys_4()  //Czwarty wyświetlacz
{
  digitalWrite(W1, LOW);
  digitalWrite(W2, LOW);
  digitalWrite(W3, LOW);
  digitalWrite(W4, HIGH);
}

Kolejną część programu stanowią definicje poszczególnych cyfr:

void Cyfra_1()
{
  //wyświetl 1
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(h, LOW);
}
 
void Cyfra_2()
{
  //wyswietl 2
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
  digitalWrite(h, LOW);
}
 
void Cyfra_3()
{
  //wyswietl 3
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
  digitalWrite(h, LOW);
}
 
void Cyfra_4()
{
  //wyswietl 4
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(h, LOW);
}
 
void Cyfra_5()
{
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(h, LOW);
}
 
void Cyfra_6()
{
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(h, LOW);
}
 
void Cyfra_7()
{
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(h, LOW);
}
void Cyfra_8()
{
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(h, LOW);
}
void Cyfra_9()
{
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(h, LOW);
}
void Cyfra_0()
{
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
  digitalWrite(h, LOW);
}

Teraz przejdę do głównej części programu gdzie zaprezentuje krótkie przykładowe działanie całości:

void loop() 
{
  Czysc();
  Wys_1();
  Cyfra_1();
  delay(3);
  Czysc();
  Wys_2();
  Cyfra_2();
  delay(3);
  Czysc();
  Wys_3();
  Cyfra_3();
  delay(3);
  Czysc();
  Wys_4();
  Cyfra_4();
  delay(3);
}

Ustawienie opóźnienia większego od 6ms powoduje widoczne migotanie obrazu.

Dodatkowo dodałem funkcje Czysc(), która wyłącza wszystkie segmenty wyświetlacza. Pozwala to na wyeliminowanie pewnych śmieci, które się pojawiają podczas wyświetlania tzn. nie do końca dogaszonych segmentów.

Funkcje dotyczące wyświetlacza mogą być również wykonane w dwóch oddzielnych funkcjach zamiast każda cyfra i wyświetlacz osobno. Takie rozwiązanie można opracować przy wykorzystaniu instrukcji warunkowej switch .. case, która będzie przełączać pomiędzy poszczególnymi cyframi i wyświetlaczem. W którymś z kolejnych postów pokażę dokładnie w jaki sposób to wykonać.