Reloj con display de 7 segmentos y TM1637 conectado a Arduino Nano

Módulo display de 4 dígitos con el chip TM1637

El módulo puede trabajar con voltajes entre 3,3V y 5V consumiento unos 80mA.

Tiene cuatro pins de conexión con las siguientes funciones:

PinUso
1GND
2VCC - Entre 3,3 y 5V
3DIO - Entrada/Salida de datos
4CLK - Entrada de reloj

Vista posterior de la placa del display...

Chip TM1637 de Titan Micro Electronics...

Ver ficha de datos del chip TM1637

Para manejar el display se utilizará la librería del TM1637Display que se puede encontrar en:
https://github.com/avishorp/TM1637

Letras que identifican los 7 segmentos que forman cada dígito usando la librería TM1637Display:

En este caso se usará un módulo de 4 dígitos que tienen dos puntos entre el segundo y tercer dígito que se puede utilizar para mostrar la hora. Se comercializan también módulos similares pero que llevan un punto en la parte inferior derecha de cada dígito y que servirían mejor para mostrar valores decimales.

Programa de ejemplo que viene con la librería TM1637Display

#include <Arduino.h>
#include <TM1637Display.h>

// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3

// The amount of time (in milliseconds) between tests
#define TEST_DELAY   2000

const uint8_t SEG_DONE[] = {
	SEG_B | SEG_C | SEG_D | SEG_E | SEG_G,           // d
	SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,   // O
	SEG_C | SEG_E | SEG_G,                           // n
	SEG_A | SEG_D | SEG_E | SEG_F | SEG_G            // E
	};

TM1637Display display(CLK, DIO);

void setup()
{
}

void loop()
{
  int k;
  uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
  uint8_t blank[] = { 0x00, 0x00, 0x00, 0x00 };
  display.setBrightness(0x0f);

  // All segments on
  display.setSegments(data);
  delay(TEST_DELAY);

  // Selectively set different digits
  data[0] = display.encodeDigit(0);
  data[1] = display.encodeDigit(1);
  data[2] = display.encodeDigit(2);
  data[3] = display.encodeDigit(3);
  display.setSegments(data);
  delay(TEST_DELAY);

  /*
  for(k = 3; k >= 0; k--) {
	display.setSegments(data, 1, k);
	delay(TEST_DELAY);
	}
  */

  display.clear();
  display.setSegments(data+2, 2, 2);
  delay(TEST_DELAY);

  display.clear();
  display.setSegments(data+2, 2, 1);
  delay(TEST_DELAY);

  display.clear();
  display.setSegments(data+1, 3, 1);
  delay(TEST_DELAY);


  // Show decimal numbers with/without leading zeros
  display.showNumberDec(0, false); // Expect: ___0
  delay(TEST_DELAY);
  display.showNumberDec(0, true);  // Expect: 0000
  delay(TEST_DELAY);
	display.showNumberDec(1, false); // Expect: ___1
	delay(TEST_DELAY);
  display.showNumberDec(1, true);  // Expect: 0001
  delay(TEST_DELAY);
  display.showNumberDec(301, false); // Expect: _301
  delay(TEST_DELAY);
  display.showNumberDec(301, true); // Expect: 0301
  delay(TEST_DELAY);
  display.clear();
  display.showNumberDec(14, false, 2, 1); // Expect: _14_
  delay(TEST_DELAY);
  display.clear();
  display.showNumberDec(4, true, 2, 2);  // Expect: __04
  delay(TEST_DELAY);
  display.showNumberDec(-1, false);  // Expect: __-1
  delay(TEST_DELAY);
  display.showNumberDec(-12);        // Expect: _-12
  delay(TEST_DELAY);
  display.showNumberDec(-999);       // Expect: -999
  delay(TEST_DELAY);
  display.clear();
  display.showNumberDec(-5, false, 3, 0); // Expect: _-5_
  delay(TEST_DELAY);
  display.showNumberHexEx(0xf1af);        // Expect: f1Af
  delay(TEST_DELAY);
  display.showNumberHexEx(0x2c);          // Expect: __2C
  delay(TEST_DELAY);
  display.showNumberHexEx(0xd1, 0, true); // Expect: 00d1
  delay(TEST_DELAY);
  display.clear();
  display.showNumberHexEx(0xd1, 0, true, 2); // Expect: d1__
  delay(TEST_DELAY);
  
	// Run through all the dots
	for(k=0; k <= 4; k++) {
		display.showNumberDecEx(0, (0x80 >> k), true);
		delay(TEST_DELAY);
	}

  // Brightness Test
  for(k = 0; k < 4; k++)
	data[k] = 0xff;
  for(k = 0; k < 7; k++) {
    display.setBrightness(k);
    display.setSegments(data);
    delay(TEST_DELAY);
  }
  
  // On/Off test
  for(k = 0; k < 4; k++) {
    display.setBrightness(7, false);  // Turn off
    display.setSegments(data);
    delay(TEST_DELAY);
    display.setBrightness(7, true); // Turn on
    display.setSegments(data);
    delay(TEST_DELAY);  
  }

 
  // Done!
  display.setSegments(SEG_DONE);

  while(1);
}

Pulsa aquí para descargar el código "tm1637prueba1.ino" utilizado en esta prueba.


Otra prueba para ver la forma de iluminar cada segmento de los dígitos utilizando la librería TM1637Display...

// Segmentos en los dígitos del display TM1637
//
//         A
//        ---
//     F |   | B
//        -G-
//     E |   | C
//        ---
//         D

#include <TM1637Display.h>

#define CLK 2
#define DIO 3

TM1637Display display(CLK, DIO);

const uint8_t celsius[] = {
  SEG_A | SEG_B | SEG_G | SEG_F,  // dibuja en el dígito 3 un cero tipo grados
  SEG_A | SEG_F | SEG_E | SEG_D   // dibuja la letra C
};

const uint8_t letra_j[] = {
  SEG_A | SEG_B | SEG_C | SEG_D   // dibuja la letra J
};

const uint8_t letra_i[] = {
  SEG_B | SEG_C   // dibuja la letra I
};

const uint8_t letra_d[] = {
  SEG_E | SEG_G | SEG_D | SEG_B | SEG_C   // dibuja la letra d
};

const uint8_t letra_s[] = {
  SEG_A | SEG_F | SEG_G | SEG_C | SEG_D   // dibuja la letra S
};


void setup() {
	display.setBrightness(0);
}

void loop() {
	display.showNumberDec(millis()/1000);
  
  // display.showNumberDec(21, false, 2, 0);
  // display.setSegments(celsius, 2, 2);

  // ---- setSegments(segmentos, longitud, posición) ----

  delay(1000);
  display.setBrightness(2);
  display.setSegments(letra_j, 1, 0);
  display.setSegments(letra_i, 1, 1);
  display.setSegments(letra_d, 1, 2);
  display.setSegments(letra_s, 1, 3);
  delay(500);

  display.setBrightness(7);
  display.setSegments(letra_j, 1, 0);
  display.setSegments(letra_i, 1, 1);
  display.setSegments(letra_d, 1, 2);
  display.setSegments(letra_s, 1, 3);
  delay(500);

  display.setBrightness(0);
  
}

Pulsa aquí para descargar el código "tm1637prueba2.ino" utilizado en esta prueba.

Montaje de un reloj para probar el display TM1632

Se utiliza el display basado en el TM1632, un reloj en tiempo real (RTC) DS3231 y un Arduino Nano.

Este montaje se ha realizado siguiendo el esquema y código que se puede ver en la página web:
https://how2electronics.com/interfacing-tm1637-4-digit-7-segment-led-display-arduino/

Como es un montaje solo para probar el display no incluye botones para configurar la hora u otras funciones como alarma. El ajuste de la hora se hace tomando la hora del PC en el momento de compilar el programa y se mantiene con la pila de botón que incluye el DS3231.

Conexiones entre el Arduino Nano, el reloj DS3231 y el display TM1637

Arduino Nano Reloj DS3231 Display TM1637
GND GND GND
5V VCC VCC
A4 SDA -
A5 SCL -
D3 - DIO
D2 - CLK

El display muesta las horas y minutos en formato "hh:mm"

Tanto el reloj como el display reciben la alimentación de la salida de 5V del Arduino Nano

El grado de iluminación de los dígitos se puede hacer más ténue o más brillante por software asignando valores entre 1 y 7 en la librería que se ha usado.

El circuito de reloj DS3231 incorpora una pila de botón 3V modelo CR2032 que permite mantener la hora cuando el circuito no tiene alimentación.

Librerías usadas en este montaje:

Otras páginas con información y montajes con el TM1637:

En las siguientes líneas se muestra el código usado para manejar el Arduino Nano, el reloj DS3231 y el display TM1637 y que se ha descargado desde: https://how2electronics.com/interfacing-tm1637-4-digit-7-segment-led-display-arduino/

// Programa descargado desde:
//   https://how2electronics.com/interfacing-tm1637-4-digit-7-segment-led-display-arduino/

// Include the libraries
#include "RTClib.h"
#include <TM1637Display.h>
 
// Define the connections pins
#define CLK 2
#define DIO 3
 
// Create rtc and display object
RTC_DS3231 rtc;
TM1637Display display = TM1637Display(CLK, DIO);
 
void setup() {
  // Begin serial communication
  Serial.begin(9600);
 
  // Check if RTC is connected correctly
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  // Check if the RTC lost power and if so, set the time
  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    // The following line sets the RTC to the date & time this sketch was compiled:
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
 
  // Set the display brightness (0-7)
  display.setBrightness(5);
  
  // Clear the display
  display.clear();
}
 
void loop() {
  // Get current date and time
  DateTime now = rtc.now();
 
  // Create time format to display
  int displaytime = (now.hour() * 100) + now.minute();
 
  // Display the current time in 24 hour format with leading zeros and a center colon enabled
  display.showNumberDecEx(displaytime, 0b11100000, true);
 
  delay(1000);
}

Pulsa aquí para descargar el código "reloj-ds3231-display-tm1637.ino" utilizado en esta prueba.

Este código está basado en el que se puede ver en la página https://how2electronics.com/interfacing-tm1637-4-digit-7-segment-led-display-arduino/