Módulo Display 7 Segmentos TM167 Clock/Decimal

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:

DISPLAY 7SEG TM167

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.

Módulo Display Clock TM167

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:

DISPLAY-7SEG-TM167

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);
}

 

Módulo Display 7 seg Decimal

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.

Onde comprar?

#VLADCONTROL SHOP