Para obtener información del Arduino sin conectarlo al odinador, es habitual utilizar una interfaz como la pantalla de 4×7 segmentos. Veremos en este tutorial cómo conectar y programar el arduino para mostrar la información en la pantalla.
Es posible conectar la pantalla de 7 segmentos directamente a los pines del Arduino. Para mantener los pines libres para otras funcionalidades, utilizamos un registro de desplazamiento 74HC595.
Material
- Ordenador
- Arduino UNO
- Pantalla de 4×7 segmentos
- Registro de desplazamiento 74HC595
- Cable Dupont
- Breadboard
Principio de funcionamiento
Los displays de 7 segmentos consisten en una serie de LEDs colocados para formar números. Estos LEDs se controlan a través de los pines de la pantalla (1-12).
Los grupos de LEDs o dígitos se activan a través de los pines D1,D2,D3,D4 y los LEDs se encienden a través de los pines A,B,C,D,E,F,G y DP para el punto decimal.
Existen dos tipos de pantallas, con cátodo común (serie A arriba) o con ánodo común (serie B abajo). Para la serie de ánodos, hay que conectar el común a 5V para activar el dígito y conmutar el pin LOW para encender un LED. En el caso de un cátodo común, hay que conectar el común a la tierra y poner el pin en estado ALTO para encender el LED.
Asegúrate de comprobar el modelo que tienes. En este tutorial, utilizamos la pantalla 5461BS de 4×7 segmentos con ánodo común.
Esquema
Utilizamos un registro de desplazamiento 74HC595 cuyas salidas Q0-6 y Q7 se conectan a las entradas de pantalla A-F y DP respectivamente.
Code
#define NUM_OF_DIGITS 4 int latch = 4; //74HC595 pin 9 STCP int cs = 5; //74HC595 pin 10 SHCP int data = 3; //74HC595 pin 8 DS int dPins[4] = {11, 10, 9, 8}; // DP G F E D C B A //0: 1 1 0 0 0 0 0 0 0xc0 //1: 1 1 1 1 1 0 0 1 0xf9 //2: 1 0 1 0 0 1 0 0 0xa4 //3: 1 0 1 1 0 0 0 0 0xb0 //4: 1 0 0 1 1 0 0 1 0x99 //5: 1 0 0 1 0 0 1 0 0x92 //6: 1 0 0 0 0 0 1 0 0x82 //7: 1 1 1 1 1 0 0 0 0xf8 //8: 1 0 0 0 0 0 0 0 0x80 //9: 1 0 0 1 0 0 0 0 0x90 unsigned char table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; void setup() { Serial.begin(115200); pinMode(latch, OUTPUT); pinMode(cs, OUTPUT); pinMode(data, OUTPUT); for (int j = 0; j < NUM_OF_DIGITS; j++) pinMode(dPins[j], OUTPUT); } void loop() { //Count from 0 to 9 on each digit for (int i = 0; i < NUM_OF_DIGITS; i++) { for (int j = 0; j < 10; j++) { Display(i, j); delay(500); Serial.println(j); } delay(500); } } void Display(int id, unsigned char num) { digitalWrite(latch, LOW); shiftOut(data, cs, MSBFIRST, table[num]); digitalWrite(latch, HIGH); for (int j = 0; j < NUM_OF_DIGITS; j++) digitalWrite(dPins[j], LOW); digitalWrite(dPins[id], HIGH); }
Una vez cargado el código, la pantalla debe contar de 0 a 9 en cada dígito.
Bonificación: pantalla de 4 dígitos
Para mostrar un número a 4 dígitos, convertiremos el número a 4 dígitos de base 10 utilizando las siguientes instrucciones:
number = k; for (int i = 0; i < NUM_OF_DIGITS; i++) { digit_data[i] = number % 10; number /= 10; }
También utilizaremos la función millis() para asegurarnos de que la pantalla se actualiza correctamente.
#define NUM_OF_DIGITS 4 int latch = 4; //74HC595 pin 9 STCP int cs = 5; //74HC595 pin 10 SHCP int data = 3; //74HC595 pin 8 DS int dPins[4] = {11, 10, 9, 8}; // DP G F E D C B A //0: 1 1 0 0 0 0 0 0 0xc0 //1: 1 1 1 1 1 0 0 1 0xf9 //2: 1 0 1 0 0 1 0 0 0xa4 //3: 1 0 1 1 0 0 0 0 0xb0 //4: 1 0 0 1 1 0 0 1 0x99 //5: 1 0 0 1 0 0 1 0 0x92 //6: 1 0 0 0 0 0 1 0 0x82 //7: 1 1 1 1 1 0 0 0 0xf8 //8: 1 0 0 0 0 0 0 0 0x80 //9: 1 0 0 1 0 0 0 0 0x90 unsigned char table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; int digit_data[NUM_OF_DIGITS] = {0}; unsigned int number = 0; unsigned long previousUpdate = 0, updateTime = 200; void setup() { Serial.begin(115200); pinMode(latch, OUTPUT); pinMode(cs, OUTPUT); pinMode(data, OUTPUT); for (int j = 0; j < NUM_OF_DIGITS; j++) pinMode(dPins[j], OUTPUT); } void loop() { //Count from 0 to 999 on each digit unsigned int k = 0; while (k < 1000) { updateDigits(); if (millis() - previousUpdate > updateTime) { k++; previousUpdate = millis(); number = k; Serial.print(k); Serial.print(" ("); for (int i = 0; i < NUM_OF_DIGITS; i++) { digit_data[i] = number % 10; number /= 10; Serial.print(digit_data[i]); } Serial.println(")"); } } } void Display(int id, unsigned char num) { digitalWrite(latch, LOW); shiftOut(data, cs, MSBFIRST, table[num]); digitalWrite(latch, HIGH); for (int j = 0; j < NUM_OF_DIGITS; j++) digitalWrite(dPins[j], LOW); digitalWrite(dPins[id], HIGH); } void updateDigits() { for (int j = 0; j < NUM_OF_DIGITS; j++) { Display(j, digit_data[j]); delay(5); } }
El número debe incrementarse cada 200 milisegundos y mostrarse en los 4 dígitos.
Fuentes
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie