Introdução à programação C para Arduino

Giovan Barreira · Capítulo 23 de 30

Páginas do PDF

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.