Módulo Display de Sete Segmentos é formado por sete elementos os quais podem ser ligados ou desligados individualmente. Eles permitem ser combinados a fim de produzir representações simplificadas de algarismos arábicos.
Os sete segmentos são dispostos num retângulo com dois segmentos verticais em cada lado e um segmento horizontal em cima e em baixo. Em acréscimo, o sétimo segmento divide o retângulo horizontalmente em duas partes iguais.
Módulo Display de 7 segmentos com CI TM167
Esse módulo é uma placa composta basicamente por um display de 7 segmentos com 4 dígitos e um circuito integrado TM1637. O controle de cada dígito pode ser feito de forma individual ou simultâneo. O circuito integrado TM1637 é que permite a redução de conexão ao i/o digital em 2 pinos a uma plataforma microcontroladora.
Especificações
-
- Controlador: TM1637
- Tensão de operação: 3,3VDC / 5VDC
- Número de dígitos: 4
- Dois pontos mediano – versão clock
- 4 pontos – versão decimal
- Interface: I2C
- Dimensões: 42x24x12mm
Projeto Relógio
Esse modelo (Módulo Display de 7 segmentos Clock) está basicamente relacionado para a medição de tempo, porém pode ser utilizado para outras finalidades em diversas aplicações.
Para aperfeiçoamento deste projeto, será utilizado o módulo DS1302 o qual é um módulo que permite a implementação de um relógio em tempo real, viabilizando o controle do tempo em segundo, minuto, hora, dia, semana, mês, ano e a capacidade de ajustes para anos bissextos.
Material
-
- 01 – Arduino ( Podendo ser Mega, Uno ou Nano)
- 01 – Módulo Display 7 segmentos 4 dígitos TM167 Clock
- 02 – Push button
- 01 – Módulo DS1302
- 02 – Resistores 10KΩ
- Jumpers para a conexão
Conexão do Módulo Display ao Arduino
A montagem é muito simples, então basta seguir conforme o esquema:
Código de Funcionamento
Primeiramente, devemos incluir as bibliotecas TM1637Display.h e DS1302.h. Em seguida, com algumas modificações do código exemplo da própria biblioteca, obteremos o código de aplicação desse projeto para então, finalmente, podermos carregar no Arduino.
#include <Wire.h> #include <stdio.h> #include <DS1302.h> #include <TM1637Display.h> namespace { // DS1302 const int kCePin = 5; const int kIoPin = 6; const int kSclkPin = 7; // Modulo Display const int clk = 2; const int dio = 3; DS1302 rtc(kCePin, kIoPin, kSclkPin); // Criar um objeto DS1302 TM1637Display display(clk, dio); String dayAsString(const Time::Day day) { switch (day) { case Time::kSunday: return "Domingo"; case Time::kMonday: return "Segunda"; case Time::kTuesday: return "Terca"; case Time::kWednesday: return "Quarta"; case Time::kThursday: return "Quinta"; case Time::kFriday: return "Sexta"; case Time::kSaturday: return "Sabado"; } return "(unknown day)"; } int printTime() { // Obter a hora e a data atuais do chip Time t = rtc.time(); // Dia da semana const String day = dayAsString(t.day); // Formatar a hora e a data e insir no buffer temporario char buf[50]; // snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day.c_str(), t.yr, t.mon, t.date, t.hr, t.min, t.sec); snprintf(buf, sizeof(buf), "%s - %02d/%02d/%04d - %02d:%02d:%02d", day.c_str(), t.date, t.mon, t.yr, t.hr, t.min, t.sec); // Imprimir a sequencia formatada em serie para ver a hora Serial.println(buf); int dt = t.hr * 100 + t.min; return dt; } } # define botaoPin_1 9 // Entrada do push button hora # define botaoPin_2 10 // Entrada do push button minuto int h, m; // Variaveis auxiliares unsigned long changeTime, changeTime1, changeTime2 ; boolean leBotao(int porta); // Prototipo funcao que le o botao void setup() { Serial.begin(9600); display.setBrightness(0x0F); display.clear(); rtc.writeProtect(false); rtc.halt(false); h = 16; m = 30; pinMode(botaoPin_1, INPUT_PULLUP); // Define o pino do botao como INPUT_PULLUP - HORAS pinMode(botaoPin_2, INPUT_PULLUP); // Define o pino do botao como INPUT_PULLUP - MINUTOS } void loop() { if (leBotao(botaoPin_1)) /* Se botão for apertado retorna true, se não for, retorna false */ { h++; if ( h > 23) { h = 0; } /* Criar um novo objeto de hora para definir a data e a hora. Sunday, September 22, 2013 at 01:38:50. Time t(2020, 02, 11, 10, 51, 00, Time::kThursday); Set the time and date on the chip. rtc.time(t); */ Time t(2020, 02, 16, h, m, 00, Time::kSunday); rtc.time(t); } if (leBotao(botaoPin_2)) { m++; if ( m > 59) { m = 0; } Time t(2020, 02, 13, h, m, 00, Time::kTuesday); rtc.time(t); } int decimaltime; decimaltime = printTime(); if ((millis() - changeTime) > 2000) { display.showNumberDecEx(decimaltime, (0x80 >> 1), true, 4, 0); changeTime = millis(); } if ((millis() - changeTime) > 1000) { display.showNumberDec(decimaltime, true, 4, 0); } } boolean leBotao(int porta) { static boolean estadoAnterior[5] = {true, true, true, true, true}; /* static --> para manter a variável na memória */ boolean estadoBotao = digitalRead(porta); boolean ligado = false; if (!estadoBotao && estadoAnterior[porta]) /* Esse controle permite que, mesmo o botão permanecendo apertado, vai ser considerado apenas uma vez*/ { ligado = true; } estadoAnterior[porta] = estadoBotao; return ligado; }
Então, feito isso, podemos observar a indicação da hora inicial setada com os pontos medianos piscando e quando pressionamos os botões, vemos a variação dos dígitos para acerto do relógio.
Projeto Módulo Display TM167 – Decimal
Partindo para essa versão com quatro pontos decimais, incluiremos um Sensor de Temperatura e Umidade DHT11 para serem mostradas no display a temperatura e umidade relativa ambiente.
Monte então o projeto conforme o esquema:
Código
Primeiramente, devemos incluir também a biblioteca DHT.h para poder operar o sensor de temperatura. Então, em seguida, só basta carregar o código e aguardar os valores a serem mostrados.
#include "DHT.h" #define DHTPIN 7 // Pino Digital 7 do sensor #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); #include <TM1637Display.h> // Module connection pins (Digital Pins) #define CLK 2 #define DIO 3 TM1637Display display(CLK, DIO); void setup() { Serial.begin(9600); //Serial.println(F("DHTxx test!")); dht.begin(); display.setBrightness(0xff); } float dec_c, dec_f, dec_h; int v_int_c, v_int_f, v_int_h; const uint8_t celsius[] = { SEG_A | SEG_B | SEG_F | SEG_G, // Circle SEG_A | SEG_D | SEG_E | SEG_F // C }; const uint8_t fahreheit[] = { SEG_A | SEG_B | SEG_F | SEG_G, // Circle SEG_A | SEG_F | SEG_G | SEG_E // F }; const uint8_t hum[] = { SEG_F | SEG_B | SEG_G | SEG_E | SEG_C, // H SEG_E | SEG_C | SEG_D // u }; void loop() { // A leitura da temperatura ou umidade leva cerca de 250 milissegundos // As leituras do sensor também podem ter ate 2 segundos de delay float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); // Read temperature as Fahrenheit (isFahrenheit = true) float f = dht.readTemperature(true); // Verifica se alguma leitura falhou e sai para tentar novamente if (isnan(h) || isnan(t) || isnan(f)) { Serial.println(F("Failed to read from DHT sensor!")); return; } // Calcula o índice de calor em Fahrenheit (o padrao) float hif = dht.computeHeatIndex(f, h); // Calcula o índice de calor em graus Celsius (isFahreheit = false) float hic = dht.computeHeatIndex(t, h, false); Serial.print(F("Humidity: ")); Serial.print(h); Serial.print(F("% Temperature: ")); Serial.print(t); Serial.print(F("°C ")); Serial.print(f); Serial.print(F("°F Heat index: ")); Serial.print(hic); Serial.print(F("°C ")); Serial.print(hif); Serial.println(F("°F")); v_int_c = int(t); // Tira a parte inteira Celsius v_int_f = int(f); // Tira a parte inteira Fahrenheit // Tira a parte decimal dec_c = (t - v_int_c) * 100; dec_f = (f - v_int_f) * 100; dec_h = (h - v_int_h) * 100; display.clear(); delay(1000); // Mostra a temperatura em Celsius display.showNumberDec(dec_c, true); display.showNumberDecEx(t, 0x80 >> 1, true, 2); delay(1500); display.clear(); display.setSegments(celsius, 2, true); delay(2000); // Mostra a temperatura em Fahrenheit if (f > 100) { display.showNumberDec(dec_f, true); display.showNumberDecEx(f, 0x80 >> 2, true, 3); delay(1500); display.clear(); display.setSegments(fahreheit, 2, true); delay(2000); } else { display.showNumberDec(dec_f, true); display.showNumberDecEx(f, 0x80 >> 1, true, 2); delay(1500); display.clear(); display.setSegments(fahreheit, 2, true); delay(2000); } //Mostra a umidade relativa display.showNumberDec(dec_h, true); display.showNumberDecEx(h, 0x80 >> 1, true, 2); delay(1500); display.clear(); display.setSegments(hum, 2, true); delay(2000); }
Concluímos que, com esse módulo e auxílio da biblioteca TM167, fica muito fácil utilizar esse display, podendo ser aplicado em uma grande gama de projetos.