Introdução à programação C para Arduino
O Display de 7 Segmentos
Figura 68 - Atividade 10 – Esquema da placa física
O DISPLAY DE 7 SEGMENTOS
HORA DA PRÁTICA:
ATIVIDADE_011 – Agora vamos escrever um código para piscar cada segmento de um display de 7 segmentos. Para tanto faremos inicialmente de uma forma longa (sem while) e depois com uma forma curta (com while).
Obs. como displays de 7 segmentos não costumam vir no kit básico, realizaremos este projeto apenas no SIMULIDE.
Obs2: os displays de 7 segmentos podem ser do tipo positivo ou do tipo negativo. No SIMULIDE é conectado o terminal genérico do display no GND da placa UNO e ‘digitalWrite(x,HIGH)’ faz com que os segmentos se acendam. Mas no meu kit (avançado), o terminal genérico do display é ligado no 5V e ‘digitalWrite(x,LOW)’ faz o segmento acender.
CÓDIGO LONGO
void setup() {
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
}
void loop() {
digitalWrite(0,HIGH);
delay(500);
digitalWrite(0,LOW);
delay(500);
digitalWrite(1,HIGH);
delay(500);
digitalWrite(1,LOW);
delay(500);digitalWrite(2,HIGH);
delay(500);
digitalWrite(2,LOW);
delay(500);digitalWrite(3,HIGH);
delay(500);
digitalWrite(3,LOW);
delay(500);digitalWrite(4,HIGH);
delay(500);
digitalWrite(4,LOW);
delay(500);digitalWrite(5,HIGH);
delay(500);
digitalWrite(5,LOW);
delay(500);digitalWrite(6,HIGH);
delay(500);
digitalWrite(6,LOW);
delay(500);digitalWrite(7,HIGH);
delay(500);
digitalWrite(7,LOW);
delay(500);
}
CÓDIGO CURTO
int porta = 2;
void setup() {
while(porta <=9)
{
pinMode(porta, OUTPUT);
porta++;
}
}
void loop() {
if(porta==10)
porta=2;
digitalWrite(porta, HIGH);
delay(500);
digitalWrite(porta, LOW);
delay(500);
porta++;
}
Figura 69 - Atividade 11 – Execução no SIMULIDE
ATIVIDADE_011_B – Agora vamos escrever um código para contar de 9 até 0 e escreve de ‘f’ até ‘a’ no display de 7 segmentos.
Obs. Por ser um software ainda em desenvolvimento, o SIMULIDE não executa este projeto corretamente.
Obs2: os displays de 7 segmentos podem ser do tipo positivo ou do tipo negativo. No meu kit (avançado), o terminal genérico do display é ligado no 5V.
Neste projeto utilizaremos o circuito integrado 74hc595, ele serve para economizar portas do Arduino, enquanto no projeto anterior nós utilizamos 8 portas, aqui utilizaremos apenas 3 graças ao circuito integrado. Note que o circuito tem o lado identificado por um ‘furo’ conforme a parte de cima da imagem abaixo.
Figura 70 - Circuito integrado 74HC595
CÓDIGO PARA A PLACA FÍSICA REAL
//meu display liga no 5v para display que liga no gnd
//trocar os 0 por 1 e os 1 por 0 na função abaixo
byte seven_seg_digits[16] = { B00000011, // = 0
B10011111, // = 1
B00100101, // = 2
B00001101, // = 3
B10011001, // = 4
B01001001, // = 5
B01000001, // = 6
B00011111, // = 7
B00000001, // = 8
B00011001, // = 9
B00010001, // = a
B11000001, // = b
B01100011, // = c
B10000101, // = d
B01100001, // = e
B01110001 // = f
};
// conectar a porta 8 do arduino no ST_CP do 74HC595 (pin 12,latch pin)
int latchPin = 8;
// conectar a porta 12 do arduino no SH_CP of 74HC595 (pin 11, clock pin)
int clockPin = 12;
// conectar a porta 11 do arduino no DS of 74HC595 (pin 14)
int dataPin = 11;
void setup() {
// marca as 3 portas do Arduino como saída
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
// função para mostrar 1 dígito no display
void sevenSegWrite(byte digit) {
// configurações iniciais antes do display mostrar 1 núm.
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, seven_seg_digits[digit]);
digitalWrite(latchPin, HIGH);
}
//escreve de f até a depois conta de 9 p/ 0
void loop() {
for (byte digit = 16; digit > 0; --digit) {
delay(1000);
sevenSegWrite(digit - 1);
}
delay(4000); //espera 4s
}
Figura 71 - Esquema da placa física
ATIVIDADE_011_C – Agora vamos escrever um código para contar de 0 a 9 utilizando o display de 7 segmentos.
O código é relativamente longo e para ficar mais organizado, eu decidi programar cada número de 0 a 9 dentro de uma função (função é um trecho de código que pode ficar localizado fora das funções ‘void setup()’ e ‘void loop()’, funções são muito utilizadas por programadores experientes para organizar e tornar o código mais legível e mais fácil de dar manutenção).
CÓDIGO PARA O SIMULIDE.
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
}
void loop() {
int tempo = 1000; //TEMPO DE 1 SEGUNDO PARA TODAS AS FUNÇÕES
todos_segmentos(tempo, LOW); //APAGA TODOS OS SEGMENTOS
um(tempo, HIGH); //FUNÇÃO 1, ACENDE OS SEGMENTOS DO 1
um(tempo, LOW); //FUNÇÃO 1, APAGA OS SEGMENTOS DO 1
dois(tempo, HIGH);
dois(tempo, LOW);
três(tempo,HIGH);
três(tempo,LOW);
quatro(tempo, HIGH);
quatro(tempo, LOW);
cinco(tempo, HIGH);
cinco(tempo, LOW);
seis(tempo, HIGH);
seis(tempo, LOW);
sete(tempo, HIGH);
sete(tempo, LOW);
oito(tempo, HIGH);
oito(tempo, LOW);
nove(tempo, HIGH);
nove(tempo, LOW);
zero(tempo, HIGH);
zero(tempo, LOW);
}
void um(int tempo, int estado)//FUNÇÃO PARA ESCREVER 1
{
digitalWrite(2,estado);
digitalWrite(8,estado);
delay(tempo);
}
void dois(int tempo, int estado)//FUNÇÃO PARA ESCREVER 2
{
digitalWrite(3,estado);
digitalWrite(4,estado);
digitalWrite(6,estado);
digitalWrite(8,estado);
digitalWrite(9,estado);
delay(tempo);
}
void três(int tempo, int estado)
{
digitalWrite(2,estado);
digitalWrite(3,estado);
digitalWrite(6,estado);
digitalWrite(8,estado);
digitalWrite(9,estado);
delay(tempo);
}
void quatro(int tempo, int estado)
{
digitalWrite(2,estado);
digitalWrite(5,estado);
digitalWrite(6,estado);
digitalWrite(8,estado);
delay(tempo);
}
void cinco(int tempo, int estado)
{
digitalWrite(2,estado);
digitalWrite(3,estado);
digitalWrite(5,estado);
digitalWrite(6,estado);
digitalWrite(9,estado);
delay(tempo);
}
void seis(int tempo, int estado)
{
digitalWrite(2,estado);
digitalWrite(3,estado);
digitalWrite(4,estado);
digitalWrite(5,estado);
digitalWrite(6,estado);
digitalWrite(9,estado);
delay(tempo);
}
void sete(int tempo, int estado)
{
digitalWrite(2,estado);
digitalWrite(8,estado);
digitalWrite(9,estado);
delay(tempo);
}
void oito(int tempo, int estado)
{
digitalWrite(2,estado);
digitalWrite(3,estado);
digitalWrite(4,estado);
digitalWrite(5,estado);
digitalWrite(6,estado);
digitalWrite(8,estado);
digitalWrite(9,estado);
delay(tempo);
}
void nove(int tempo, int estado)
{
digitalWrite(2,estado);
digitalWrite(3,estado);
digitalWrite(5,estado);
digitalWrite(6,estado);
digitalWrite(8,estado);
digitalWrite(9,estado);
delay(tempo);
}
void zero(int tempo, int estado)
{
digitalWrite(2,estado);
digitalWrite(3,estado);
digitalWrite(4,estado);
digitalWrite(5,estado);
digitalWrite(8,estado);
digitalWrite(9,estado);
delay(tempo);
}
void todos_segmentos(int tempo, int estado)
{
digitalWrite(2,estado);
digitalWrite(3,estado);
digitalWrite(4,estado);
digitalWrite(5,estado);
digitalWrite(6,estado);
digitalWrite(7,estado);
digitalWrite(8,estado);
digitalWrite(9,estado);
delay(tempo);
}
Figura 72 - Atividade 11 C – Execução no
SIMULIDE
No caso do meu display de 7 segmentos, ele tem o polo comum ligado em 5V e cada terminal ligado em uma porta digital do ARDUINO em estado LOW (contrário do display de 7 segmentos padrão do SIMULIDE).
Abaixo apresento o esquema de ligação para um display (anodo) com polo comum ligado em 5 V e cada terminal ligado em uma porta digital da placa UNO em estado LOW. Obs. os números que aparecem abaixo, de 2 a 9 correspondem às portas digitais de 2 a 9.