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:
Pin | Uso |
---|---|
1 | GND |
2 | VCC - Entre 3,3 y 5V |
3 | DIO - Entrada/Salida de datos |
4 | CLK - 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/