16
Blog Dedicado ao Arduino. Contém informação de projetos, tutoriais, dicas e truques. O desenvolvimento de hardware e software dos projetos. 0 mais Próximo blog» Criar um blog ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos 1 de 16 04/09/2012 17:49

ARDUINO by Myself_ Display 7 Segmentos

  • Upload
    zemar74

  • View
    142

  • Download
    2

Embed Size (px)

Citation preview

Page 1: ARDUINO by Myself_ Display 7 Segmentos

Blog Dedicado ao Arduino. Contém informação de projetos, tutoriais, dicas e truques. O desenvolvimento de hardware e software dos projetos.

0 mais Próximo blog» Criar um blog

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

1 de 16 04/09/2012 17:49

Page 2: ARDUINO by Myself_ Display 7 Segmentos

#define DELAYTIME 50

// definições de variáveisunsigned short hours, minutes, seconds;boolean pm;unsigned long lastTime; // mantém um registro de quando o segundo // aconteceu

// debouncing do botãoint buttonState; // leitura corrente do pino do botãoint buttonStateDW;int lastButtonState = LOW; // leitura anterior do pino do botãoint lastButtonStateDW = LOW;unsigned long button_down_start = 0; // quanto tempo o botão foi pressionadounsigned long button_down_startDW = 0;unsigned long lastDebounceTime = 0; // a última vez que o pino de saída foi alternadounsigned long lastDebounceTimeDW = 0;unsigned long debounceDelay = 50; // tempo de debouncingunsigned long debounceDelayDW = 50;

// parametros de inicialização do Arduinovoid setup() { // inicializando todos os pinos requeridos como saída pinMode(DIGIT1, OUTPUT); pinMode(DIGIT2, OUTPUT); pinMode(DIGIT3, OUTPUT); pinMode(DIGIT4, OUTPUT);

pinMode(SEGMENTA, OUTPUT); pinMode(SEGMENTB, OUTPUT); pinMode(SEGMENTC, OUTPUT); pinMode(SEGMENTD, OUTPUT); pinMode(SEGMENTE, OUTPUT); pinMode(SEGMENTF, OUTPUT); pinMode(SEGMENTG, OUTPUT);

pinMode(COLON, OUTPUT); pinMode(AMPM, OUTPUT); // inicializando o pino do botão como entrada pinMode(BUTTONUP, INPUT); pinMode(BUTTONDW, INPUT); // configuração da hora inicial no display hours = 12; minutes = 0; seconds = 0; pm = true; // post meridiam?

lastTime = millis(); // armazena o segundo do sistema em "lastTime"}

// loop principal do programavoid loop() { // continua mostrando o visor enquanto aguarda o cronômetro expirar while (millis() - lastTime < 1000) { clock_show_time(hours, minutes);

// pisca os leds : a cada segundo if (seconds % 2 == 0) { clock_show_colon(); }

// botão UP pressionado, aumenta os minutos int reading = digitalRead(BUTTONUP); // verifica se estado do botão mudou, por ruído ou pressionamento if (reading != lastButtonState) { // reset o temporizador de debouncing lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { // qualquer que seja a leitura, estava por mais tempo // que o atraso de estabilização, então leva-o como estado atual corrente if (buttonState != reading) { button_down_start = millis(); // armazena o inicio do estado corrente do botão } buttonState = reading; // o estado do botão é agora ligado ou desligado if (buttonState == HIGH) {

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

2 de 16 04/09/2012 17:49

Page 3: ARDUINO by Myself_ Display 7 Segmentos

// se o botão foi segurado por mais de 5 segundos, faça o ir mais rapido if ((millis() - button_down_start) > 5000) { seconds += 10; if (seconds > 59) seconds = 59; } // botão foi pressionado incrementTime(); } } // botão DOWN pressionado, diminui os minutos int readingDW = digitalRead(BUTTONDW); // verifica se estado do botão mudou, por ruído ou pressionamento if (readingDW != lastButtonStateDW) { // reset o temporizador de debouncing lastDebounceTimeDW = millis(); } if ((millis() - lastDebounceTimeDW) > debounceDelayDW) { // qualquer que seja a leitura, estava por mais tempo // que o atraso de estabilização, então leva-o como estado atual corrente if (buttonStateDW != readingDW) { button_down_startDW = millis(); // armazena o inicio do estado corrente do botão } buttonStateDW = readingDW; // o estado do botão é agora ligado ou desligado if (buttonStateDW == HIGH) { // se o botão foi segurado por mais de 5 segundos, faça o ir mais rapido if ((millis() - button_down_startDW) > 5000) { seconds -= 10; if (seconds > 0) seconds = 0; } // botão foi pressionado decrementTime(); } }

lastButtonStateDW = readingDW; lastButtonState = reading; }// fim do while

lastTime += 1000; incrementTime();} // fim do loop principal

//// uma chamada a função incrementTime aumenta o tempo em 1 minuto//void incrementTime() { if (seconds == 59) { seconds = 0; if (minutes == 59) { minutes = 0; if (hours == 12) { hours = 1; } else { hours++; if (hours == 12) { pm = !pm; } } } else { minutes++; } } else { seconds++; }}

//// uma chamada a função decrementTime diminue o tempo em 1 minuto//void decrementTime() { if (seconds == 0) { seconds = 59;

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

3 de 16 04/09/2012 17:49

Page 4: ARDUINO by Myself_ Display 7 Segmentos

if (minutes == 0) { minutes = 59; if (hours == 1) { hours = 12; } else { hours--; if (hours == 12) { pm = !pm; } } } else { minutes--; } } else { seconds--; }}

//// clock_show_time - mostra um dado tempo no relógio// Note que em vez de hr/min o usuário pode usar min/sec// Máximo horas é de 99, Máximo minutos é de 59, e um mínimo de 0.//void clock_show_time(unsigned short hours, unsigned short minutes) { unsigned short i; unsigned short delaytime; unsigned short num_leds[10] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 }; unsigned short digit[4]; unsigned short hide_leading_hours_digit; // converte minutos e segundos em dígitos individuais // verifica os limites if (hours > 99) hours = 99; if (minutes > 59) minutes = 59; // converte hora if (hours < 10 && hours > 0) { hide_leading_hours_digit = 1; } else { hide_leading_hours_digit = 0; } digit[0] = hours / 10; digit[1] = hours % 10; // restante digit[2] = minutes / 10; digit[3] = minutes % 10; // restante

for (i = hide_leading_hours_digit; i < 4; i++) { clock_all_off(); clock_show_digit(i, digit[i]);

// poucos LEDs = display luminoso, então o delay depende do número de LEDs acesos. delaytime = num_leds[digit[i]] * DELAYTIME; delayMicroseconds(delaytime); } clock_all_off(); if (pm) { clock_show_ampm(); } clock_all_off();}

//// clock_all_off - desliga todos os LEDsdo relógio e faz o display apagado//void clock_all_off(void) { // digitos devem ser ON para qualquer LED ser on digitalWrite(DIGIT1, ON); digitalWrite(DIGIT2, ON); digitalWrite(DIGIT3, ON); digitalWrite(DIGIT4, ON); // segmentos devem ser OFF para qualquer LED ser on digitalWrite(SEGMENTA, OFF); digitalWrite(SEGMENTB, OFF); digitalWrite(SEGMENTC, OFF); digitalWrite(SEGMENTD, OFF); digitalWrite(SEGMENTE, OFF); digitalWrite(SEGMENTF, OFF);

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

4 de 16 04/09/2012 17:49

Page 5: ARDUINO by Myself_ Display 7 Segmentos

digitalWrite(SEGMENTG, OFF); // desliga os : e alarme também digitalWrite(COLON, OFF); digitalWrite(AMPM, OFF);}

//// clock_show_digit - liga os LEDs para um digito de uma dada posição//// (se o valor está fora da faixa, exibe um 9. se dígito está fora// do intervalo de exibição, permanece em branco//void clock_show_digit(unsigned short position, unsigned short value) { byte a; byte b; byte c; byte d; byte e; byte f; byte g;

switch (position) { case 0: digitalWrite(DIGIT1, OFF); break; case 1: digitalWrite(DIGIT2, OFF); break; case 2: digitalWrite(DIGIT3, OFF); break; case 3: digitalWrite(DIGIT4, OFF); break; }

a = !(value == 1 || value == 4); b = !(value == 5 || value == 6); c = !(value == 2); d = !(value == 1 || value == 4 || value == 7); e = (value == 0 || value == 2 || value == 6 || value == 8); f = !(value == 1 || value == 2 || value == 3 || value == 7); g = !(value == 0 || value == 1 || value == 7); if (a) digitalWrite(SEGMENTA, ON); if (b) digitalWrite(SEGMENTB, ON); if (c) digitalWrite(SEGMENTC, ON); if (d) digitalWrite(SEGMENTD, ON); if (e) digitalWrite(SEGMENTE, ON); if (f) digitalWrite(SEGMENTF, ON); if (g) digitalWrite(SEGMENTG, ON);}

//// clock_show_colon - mostra os : que separa minutos de segundos//void clock_show_colon(void) { unsigned short delaytime;

digitalWrite(COLON, ON); // 2 leds = 2 delays necessários delaytime = DELAYTIME * 2; // deve usar uma variávelpara ter atraso similar delayMicroseconds(delaytime); // porque o uso da variável retarda um pouco digitalWrite(COLON, OFF);}

//// clock_show_alarm - mostra o ponto de ampm//void clock_show_ampm(void) { unsigned short delaytime;

digitalWrite(AMPM, ON); delaytime = DELAYTIME; delayMicroseconds(delaytime); digitalWrite(AMPM, OFF);}// Fim da Compilação

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

5 de 16 04/09/2012 17:49

Page 6: ARDUINO by Myself_ Display 7 Segmentos

Postado por Marcelo Moraes às 23:29 Nenhum comentário:

Marcadores: Arduino, Clock, Display 7 Segmentos, Relógio Digital

Vejam o vídeo:Também no youtube http://www.youtube.com/watch?v=y2owd8Pa4Y0&feature=youtu.be

Recomende isto no Google

Trabalhando com Displays de 7 Segmentos

Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.sendo:"VERDE", indicação de nível 1 a 5 (Fácil);"AMARELO", indicação de nível 6 a 8 (Médio);VERMELHO, indicação de nível 9 e 10 (Difícil);

Este post traz 3 experiências com display de 7 segmentos e 4 dígitos.Mostra como fazer a multiplexação de mais de um display, usando os mesmos pinos do arduino, para economizar conexões/pinos.

1a experiência - faz o tratamento de padrões de teste do display, assim podemos trabalhar a multiplexação e efetuar um teste defuncionamento do display.

2a experiência - é um contador temporal, usando o relógio do sistema (temporização interna), faz a contagem crescente dos segundospassados após o início, ou reinício, do sistema. O reinício é executado com um botão de reset.

3a experiência - Um relógio com hora/minuto (contagem de segundos por um LED indicador). Através de botão é possível ajustar h/m. Contatambém com uma indicação de manhã/tarde am/pm através de LED.

Utilizamos um único circuito geral de ligação do display com o Arduino.

O HARDWARE:

1 x Arduino ou Duemilanove1 x BreadBoard1 x Display - 4 Dígitos x 7 Segmentos1 x Switch Dactilar2 x LEDs

6 x Resistores de 220KO1 x Resistor de 10KOFios e Cabos

O CIRCUITO:

Conectar o Arduino da seguinte maneira:pino Display - pino ArduinoA - 2B - 3C - 4D - 5E - 6F - 7G - 8PT -DIG1 - 9

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

6 de 16 04/09/2012 17:49

Page 7: ARDUINO by Myself_ Display 7 Segmentos

DIG2 - 10DIG3 - 11DIG4 - 12

SWITCH - A4 (experiências 2 e 3)LED-AM/PM - A1 (experiência 3)LEDs 2 Pontos - 13 (experiência 3)

Como ligar o Switch:

+5V -----[ / ]-----A4-----/\/\/\/-----GND+5V -----[ / ]-----A5-----/\/\/\/-----GND

Como Ligar um LED:

Pino Arduino -----|>|-----/\/\/\/-----GND

O SOFTWARE:

Aqui estão os softwares comentados.

Experiência 1:-

// definição dos pinos dos segmentosint a = 2;int b = 3;int c = 4;int d = 5;int e = 6;int f = 7;int g = 8;//int p = 8;

// definição dos pinos dos dígitosint d4 = 9;int d3 = 10;int d2 = 11;int d1 = 12;

// outras definiçõesint del = 100;int buttoncount = 0;int loopcount = 0;

// inicialização do Arduinovoid setup(){ pinMode(d1, OUTPUT); pinMode(d2, OUTPUT); pinMode(d3, OUTPUT); pinMode(d4, OUTPUT); pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); //pinMode(p, OUTPUT);}

// loop principal do programavoid loop(){ roulette(4); // padrão de teste #1, 4 é o numero de vezes que será // executado o padrão; será passado a rotina // como um argumento delay(100); zigzag(4); // padrão de teste #2 delay(100);

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

7 de 16 04/09/2012 17:49

Page 8: ARDUINO by Myself_ Display 7 Segmentos

circles(4); // padrão de teste #3 delay(100);}

// subrotina para multiplexar os dígitos do displayvoid pickDigit(int x){ digitalWrite(d1, HIGH); // vlor HIGH no pino desabilita o dígito digitalWrite(d2, HIGH); digitalWrite(d3, HIGH); digitalWrite(d4, HIGH);

switch(x) // cria uma estrutura switch, tendo como entrada // o número do display a ser habilitado { case 1: digitalWrite(d1, LOW); // colocando LOW no pino, estamos habilitando // o acendimento dos segmento break; // executou? sai da estrutura switch case 2: digitalWrite(d2, LOW); break; case 3: digitalWrite(d3, LOW); break; default: digitalWrite(d4, LOW); break; }}

// subrotina para apagar todos os segmentosvoid clearLEDs(){ digitalWrite(a, LOW); // colocando LOW nos pinos dos segmentos // apagamos o segmento digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); //digitalWrite(p, LOW);}

// primeiro padrão de testevoid roulette(int x) // o argumento x define quantas vezes será executado // o padrão de teste{ loopcount = 0; // inicia variável de contagem do loop while (loopcount < x) // loop com o valor do argumento { digitalWrite(a, HIGH); // valor HIGH no pino do segmentos // acende o segmento pickDigit(1); // seleciona dígito 1 delay(del); // delay pickDigit(2); delay(del); pickDigit(3); delay(del); pickDigit(4); delay(del); digitalWrite(a, LOW); // apaga segmento anterior digitalWrite(f, HIGH); // acende próximo segmento delay(del); digitalWrite(f, LOW); digitalWrite(e, HIGH); delay(del); digitalWrite(e, LOW); digitalWrite(d, HIGH); delay(del); pickDigit(3); delay(del); pickDigit(2); delay(del); pickDigit(1); delay(del); digitalWrite(d, LOW); digitalWrite(c, HIGH); delay(del); digitalWrite(c, LOW); digitalWrite(b, HIGH); delay(del); clearLEDs(); // limpa o display loopcount++; // incrementa o contador do número de vezes // de execução do teste }}

// segundo padrão de testevoid zigzag(int x){ loopcount = 0; while(loopcount < x)

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

8 de 16 04/09/2012 17:49

Page 9: ARDUINO by Myself_ Display 7 Segmentos

{ digitalWrite(a, HIGH); pickDigit(1); delay(del); pickDigit(2); delay(del); pickDigit(3); delay(del); pickDigit(4); delay(del); digitalWrite(a, LOW); digitalWrite(f, HIGH); delay(del); digitalWrite(f, LOW); digitalWrite(g, HIGH); delay(del); pickDigit(3); delay(del); pickDigit(2); delay(del); pickDigit(1); delay(del); digitalWrite(g, LOW); digitalWrite(c, HIGH); delay(del); digitalWrite(c, LOW); digitalWrite(d, HIGH); delay(del); pickDigit(2); delay(del); pickDigit(3); delay(del); pickDigit(4); delay(del); digitalWrite(d, LOW); digitalWrite(e, HIGH); delay(del); digitalWrite(e, LOW); digitalWrite(g, HIGH); delay(del); pickDigit(3); delay(del); pickDigit(2); delay(del); pickDigit(1); delay(del); digitalWrite(g, LOW); digitalWrite(b, HIGH); delay(del); clearLEDs(); loopcount++; }}

// terceiro padrão de testevoid circles(int x){ loopcount = 0; while (loopcount < x) { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); pickDigit(1); delay(250); digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(f, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); pickDigit(2); delay(250); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(f, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); pickDigit(3); delay(250); digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(f, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); pickDigit(4); delay(250); clearLEDs(); loopcount++; }

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

9 de 16 04/09/2012 17:49

Page 10: ARDUINO by Myself_ Display 7 Segmentos

}// Fim da Compilação

Experiência 2:-

// definição dos pinos dos segmentosint a = 2;int b = 3;int c = 4;int d = 5;int e = 6;int f = 7;int g = 8;//int p = 8;

//definição dos pinos dos dígitosint d1 = 9;int d2 = 10;int d3 = 11;int d4 = 12;

// outras definiçõeslong n = 0;int x = 200;int del = 1000;

// inicialização do Arduinovoid setup(){ pinMode(d1, OUTPUT); pinMode(d2, OUTPUT); pinMode(d3, OUTPUT); pinMode(d4, OUTPUT); pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); //pinMode(p, OUTPUT);}

// loop principal do programavoid loop(){ clearLEDs(); // apaga todos os segmentos pickDigit(1); // seleciona dígito 1 pickNumber((n/x/1000)%10); // gera o número a ser mostrado // baseado em n e x delayMicroseconds(del); // delay em microsegundos clearLEDs(); pickDigit(2); pickNumber((n/x/100)%10); delayMicroseconds(del); clearLEDs(); pickDigit(3); //dispDec(3); pickNumber((n/x/10)%10); delayMicroseconds(del); clearLEDs(); pickDigit(4); pickNumber(n/x%10); delayMicroseconds(del); n++; // incrementa n if (digitalRead(A4) == HIGH) // verifica se botão foi pressionado { n = 0; // se sim zera o contador }}

// subrotina para multiplexar os dígitos do displayvoid pickDigit(int x){ digitalWrite(d1, HIGH);// valor HIGH no pino desabilita o dígito digitalWrite(d2, HIGH); digitalWrite(d3, HIGH); digitalWrite(d4, HIGH); switch(x) // cria uma estrutura switch, tendo como entrada // o número do display a ser habilitado { case 1: digitalWrite(d1, LOW); // colocando LOW no pino, estamos habilitando // o acendimento dos segmentos break; // executou? sai da estutura

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

10 de 16 04/09/2012 17:49

Page 11: ARDUINO by Myself_ Display 7 Segmentos

case 2: digitalWrite(d2, LOW); break; case 3: digitalWrite(d3, LOW); break; default: digitalWrite(d4, LOW); break; }}

// subrotina para acender um determinado número no displayvoid pickNumber(int x){ switch(x) // cria uma estrutura switch para seleção { default: zero(); // chama rotina para apresentar número 0 no display break; // executou? retorna da subrotina case 1: one(); break; case 2: two(); break; case 3: three(); break; case 4: four(); break; case 5: five(); break; case 6: six(); break; case 7: seven(); break; case 8: eight(); break; case 9: nine(); break; }}

//void dispDec(int x)//{ //digitalWrite(p, HIGH);//}

// subrotina para apagar todos os segmentosvoid clearLEDs(){ digitalWrite(a, LOW); // valor low no pino, apaga segmento digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); //digitalWrite(p, LOW);}

// mostra número sero no displayvoid zero(){ digitalWrite(a, HIGH); // valor HIGH no pino, acende segmento digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW);}

void one(){ digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW);}

void two(){ digitalWrite(a, HIGH);

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

11 de 16 04/09/2012 17:49

Page 12: ARDUINO by Myself_ Display 7 Segmentos

digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, HIGH);}

void three(){ digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH);}

void four(){ digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH);}

void five(){ digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH);}

void six(){ digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH);}

void seven(){ digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW);}

void eight(){ digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH);}

void nine(){ digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH);}// Fim da Compilação

Experiência 3:-

// nomes dos pinos e definições#define DIGIT1 9#define DIGIT2 10#define DIGIT3 11

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

12 de 16 04/09/2012 17:49

Page 13: ARDUINO by Myself_ Display 7 Segmentos

#define DIGIT4 12

#define SEGMENTA 2#define SEGMENTB 3#define SEGMENTC 4#define SEGMENTD 5#define SEGMENTE 6#define SEGMENTF 7#define SEGMENTG 8

#define COLON 13#define AMPM A1

#define BUTTON A4

#define ON HIGH#define OFF LOW

#define DELAYTIME 50

// definições de variáveisunsigned short hours, minutes, seconds;boolean pm;unsigned long lastTime; // mantém um registro de quando o segundo // aconteceu

// debouncing do botãoint buttonState; // leitura corrente do pino do botãoint lastButtonState = LOW; // leitura anterior do pino do botãounsigned long button_down_start = 0; // quanto tempo o botão foi pressionadounsigned long lastDebounceTime = 0; // a última vez que o pino de saída foi alternadounsigned long debounceDelay = 50; // tempo de debouncing

// parametros de inicialização do Arduinovoid setup() { // inicializando todos os pinos requeridos como saída pinMode(DIGIT1, OUTPUT); pinMode(DIGIT2, OUTPUT); pinMode(DIGIT3, OUTPUT); pinMode(DIGIT4, OUTPUT);

pinMode(SEGMENTA, OUTPUT); pinMode(SEGMENTB, OUTPUT); pinMode(SEGMENTC, OUTPUT); pinMode(SEGMENTD, OUTPUT); pinMode(SEGMENTE, OUTPUT); pinMode(SEGMENTF, OUTPUT); pinMode(SEGMENTG, OUTPUT);

pinMode(COLON, OUTPUT); pinMode(AMPM, OUTPUT); // inicializando o pino do botão como entrada pinMode(BUTTON, INPUT); // configuração da hora inicial no display hours = 12; minutes = 0; seconds = 0; pm = true; // post meridiam?

lastTime = millis(); // armazena o segundo do sistema em "lastTime"}

// loop principal do programavoid loop() { // continua mostrando o visor enquanto aguarda o cronômetro expirar while (millis() - lastTime < 1000) { clock_show_time(hours, minutes);

// pisca os leds : a cada segundo if (seconds % 2 == 0) { clock_show_colon(); }

// botão pressionado, aumenta os minutos int reading = digitalRead(BUTTON);

// verifica se estado do botão mudou, por ruído ou pressionamento if (reading != lastButtonState) { // reset o temporizador de debouncing lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { // qualquer que seja a leitura, estava por mais tempo // que o atraso de estabilização, então leva-o como estado atual corrente if (buttonState != reading) { button_down_start = millis(); // armazena o inicio do estado corrente do botão }

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

13 de 16 04/09/2012 17:49

Page 14: ARDUINO by Myself_ Display 7 Segmentos

buttonState = reading; // o estado do botão é agora ligado ou desligado if (buttonState == HIGH) { // se o botão foi segurado por mais de 5 segundos, faça o ir mais rapido if ((millis() - button_down_start) > 5000) { seconds += 10; if (seconds > 59) seconds = 59; } // botão foi pressionado incrementTime(); } }

lastButtonState = reading; }

lastTime += 1000; incrementTime();}

//// uma chamada a função incrementTime aumenta o tempo em 1 segundo//void incrementTime() { if (seconds == 59) { seconds = 0; if (minutes == 59) { minutes = 0; if (hours == 12) { hours = 1; } else { hours++; if (hours == 12) { pm = !pm; } } } else { minutes++; } } else { seconds++; }}

//// clock_show_time - mostra um dado tempo no relógio// Note que em vez de hr/min o usuário pode usar min/sec// Máximo horas é de 99, Máximo minutos é de 59, e um mínimo de 0.//void clock_show_time(unsigned short hours, unsigned short minutes) { unsigned short i; unsigned short delaytime; unsigned short num_leds[10] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 }; unsigned short digit[4]; unsigned short hide_leading_hours_digit; // converte minutos e segundos em dígitos individuais // verifica os limites if (hours > 99) hours = 99; if (minutes > 59) minutes = 59; // converte hora if (hours < 10 && hours > 0) { hide_leading_hours_digit = 1; } else { hide_leading_hours_digit = 0; } digit[0] = hours / 10; digit[1] = hours % 10; // restante digit[2] = minutes / 10; digit[3] = minutes % 10; // restante

for (i = hide_leading_hours_digit; i < 4; i++) { clock_all_off(); clock_show_digit(i, digit[i]);

// poucos LEDs = display luminoso, então o delay depende do número de LEDs acesos. delaytime = num_leds[digit[i]] * DELAYTIME; delayMicroseconds(delaytime); }

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

14 de 16 04/09/2012 17:49

Page 15: ARDUINO by Myself_ Display 7 Segmentos

clock_all_off(); if (pm) { clock_show_ampm(); } clock_all_off();}

//// clock_all_off - desliga todos os LEDsdo relógio e faz o display apagado//void clock_all_off(void) { // digitos devem ser ON para qualquer LED ser on digitalWrite(DIGIT1, ON); digitalWrite(DIGIT2, ON); digitalWrite(DIGIT3, ON); digitalWrite(DIGIT4, ON); // segmentos devem ser OFF para qualquer LED ser on digitalWrite(SEGMENTA, OFF); digitalWrite(SEGMENTB, OFF); digitalWrite(SEGMENTC, OFF); digitalWrite(SEGMENTD, OFF); digitalWrite(SEGMENTE, OFF); digitalWrite(SEGMENTF, OFF); digitalWrite(SEGMENTG, OFF); // desliga os : e alarme também digitalWrite(COLON, OFF); digitalWrite(AMPM, OFF);}

//// clock_show_digit - liga os LEDs para um digito de uma dada posição//// (se o valor está fora da faixa, exibe um 9. se dígito está fora// do intervalo de exibição, permanece em branco//void clock_show_digit(unsigned short position, unsigned short value) { byte a; byte b; byte c; byte d; byte e; byte f; byte g;

switch (position) { case 0: digitalWrite(DIGIT1, OFF); break; case 1: digitalWrite(DIGIT2, OFF); break; case 2: digitalWrite(DIGIT3, OFF); break; case 3: digitalWrite(DIGIT4, OFF); break; }

a = !(value == 1 || value == 4); b = !(value == 5 || value == 6); c = !(value == 2); d = !(value == 1 || value == 4 || value == 7); e = (value == 0 || value == 2 || value == 6 || value == 8); f = !(value == 1 || value == 2 || value == 3 || value == 7); g = !(value == 0 || value == 1 || value == 7); if (a) digitalWrite(SEGMENTA, ON); if (b) digitalWrite(SEGMENTB, ON); if (c) digitalWrite(SEGMENTC, ON); if (d) digitalWrite(SEGMENTD, ON); if (e) digitalWrite(SEGMENTE, ON); if (f) digitalWrite(SEGMENTF, ON); if (g) digitalWrite(SEGMENTG, ON);}

//// clock_show_colon - mostra os : que separa minutos de segundos//void clock_show_colon(void) { unsigned short delaytime;

digitalWrite(COLON, ON); // 2 leds = 2 delays necessários delaytime = DELAYTIME * 2; // deve usar uma variávelpara ter atraso similar delayMicroseconds(delaytime); // porque o uso da variável retarda um pouco digitalWrite(COLON, OFF);}

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

15 de 16 04/09/2012 17:49

Page 16: ARDUINO by Myself_ Display 7 Segmentos

Assinar: Postagens (Atom)

Postado por Marcelo Moraes às 21:33 Nenhum comentário:

Marcadores: Arduino, Clock, Display 7 Segmentos

//// clock_show_alarm - mostra o ponto de ampm//void clock_show_ampm(void) { unsigned short delaytime;

digitalWrite(AMPM, ON); delaytime = DELAYTIME; delayMicroseconds(delaytime); digitalWrite(AMPM, OFF);}//Fim da Compilação

O VÍDEO:vejam no youtube http://www.youtube.com/watch?v=e1Zl5pf2AP4

+1 Recomende isto no Google

ARDUINO By Myself: Display 7 Segmentos http://arduinobymyself.blogspot.com.br/search/label/Display 7 Segmentos

16 de 16 04/09/2012 17:49