7 Segment Display conectado a Arduino Mini Pro


Hoy traemos un "display" de 4 dígitos, con 7 segmentos cada uno, también incorpora 2 puntos para mostrar una hora y 5 puntos para decimal. Es un aparato que podéis encontrar por la red por menos de 2 €.


Hay muchas variantes y muchos modelos, en éste caso disponemos del modelo con puntos con lo que tiene 16 pines.


Aquí os dejo el esquema de conexión de la pantalla con un Arduino Mini Pro, que es el que hemos usado para controlarlo.


Pasado el esquema a la práctica nos queda así:


Se podrían ahorrar cables si se usara con un modelo de Arduino que ya contenga una conexión USB incluida pero no es el caso.

Buscando por la red hemos encontrado éste sencillo código para probar la pantalla. Es simplemente un bloque que abre una conexión Serial y cuando recibe un carácter muestra por pantalla su código ASCII. 

int digit1 = 11; //PWM Display pin 1
int digit2 = 10; //PWM Display pin 2
int digit3 = 9; //PWM Display pin 6
int digit4 = 6; //PWM Display pin 8
int segA = A1; //Display pin 14
int segB = 3; //Display pin 16
int segC = 4; //Display pin 13
int segD = 5; //Display pin 3
int segE = A0; //Display pin 5
int segF = 7; //Display pin 11
int segG = 8; //Display pin 15
int num=0;

void setup() { 
    pinMode(segA, OUTPUT);
    pinMode(segB, OUTPUT);
    pinMode(segC, OUTPUT);
    pinMode(segD, OUTPUT);
    pinMode(segE, OUTPUT);
    pinMode(segF, OUTPUT);
    pinMode(segG, OUTPUT);

    pinMode(digit1, OUTPUT);
    pinMode(digit2, OUTPUT);
    pinMode(digit3, OUTPUT);
    pinMode(digit4, OUTPUT);
    Serial.begin(9600);
    pinMode(13, OUTPUT);
}

void loop()
{

    if(Serial.available()>0)
    {
        num = Serial.read(); 
    }
    dispNumber(num);
}

void dispNumber(byte toDisplay) {
    #define DISPLAY_BRIGHTNESS 500

    #define DIGIT_ON HIGH
    #define DIGIT_OFF LOW

    long beginTime = millis();

    for(int digit = 4 ; digit > 0 ; digit--) {

        //Turn on a digit for a short amount of time
        switch(digit) {
            case 1:
                digitalWrite(digit1, DIGIT_ON);
                break;
            case 2:
                digitalWrite(digit2, DIGIT_ON);
                break;
            case 3:
                digitalWrite(digit3, DIGIT_ON);
                break;
            case 4:
                digitalWrite(digit4, DIGIT_ON);
                break;
        }

        //Turn on the right segments for this digit
        ligNumber(toDisplay % 10);
        toDisplay /= 10;

        delayMicroseconds(DISPLAY_BRIGHTNESS); //Display this digit for a fraction of a second

        //Turn off all segments
        ligNumber(10);

        //Turn off all digits
        digitalWrite(digit1, DIGIT_OFF);
        digitalWrite(digit2, DIGIT_OFF);
        digitalWrite(digit3, DIGIT_OFF);
        digitalWrite(digit4, DIGIT_OFF);
    }

    while( (millis() - beginTime) < 10) ; //Wait for 20ms to pass before we paint the display again
}

void ligNumber(int numToDisplay) {

    #define SEGMENT_ON LOW
    #define SEGMENT_OFF HIGH

    switch (numToDisplay){

    case 0:
        digitalWrite(segA, SEGMENT_ON);
        digitalWrite(segB, SEGMENT_ON);
        digitalWrite(segC, SEGMENT_ON);
        digitalWrite(segD, SEGMENT_ON);
        digitalWrite(segE, SEGMENT_ON);
        digitalWrite(segF, SEGMENT_ON);
        digitalWrite(segG, SEGMENT_OFF);
        break;

    case 1:
        digitalWrite(segA, SEGMENT_OFF);
        digitalWrite(segB, SEGMENT_ON);
        digitalWrite(segC, SEGMENT_ON);
        digitalWrite(segD, SEGMENT_OFF);
        digitalWrite(segE, SEGMENT_OFF);
        digitalWrite(segF, SEGMENT_OFF);
        digitalWrite(segG, SEGMENT_OFF);
        break;

    case 2:
        digitalWrite(segA, SEGMENT_ON);
        digitalWrite(segB, SEGMENT_ON);
        digitalWrite(segC, SEGMENT_OFF);
        digitalWrite(segD, SEGMENT_ON);
        digitalWrite(segE, SEGMENT_ON);
        digitalWrite(segF, SEGMENT_OFF);
        digitalWrite(segG, SEGMENT_ON);
        break;

    case 3:
        digitalWrite(segA, SEGMENT_ON);
        digitalWrite(segB, SEGMENT_ON);
        digitalWrite(segC, SEGMENT_ON);
        digitalWrite(segD, SEGMENT_ON);
        digitalWrite(segE, SEGMENT_OFF);
        digitalWrite(segF, SEGMENT_OFF);
        digitalWrite(segG, SEGMENT_ON);
        break;

    case 4:
        digitalWrite(segA, SEGMENT_OFF);
        digitalWrite(segB, SEGMENT_ON);
        digitalWrite(segC, SEGMENT_ON);
        digitalWrite(segD, SEGMENT_OFF);
        digitalWrite(segE, SEGMENT_OFF);
        digitalWrite(segF, SEGMENT_ON);
        digitalWrite(segG, SEGMENT_ON);
        break;

    case 5:
        digitalWrite(segA, SEGMENT_ON);
        digitalWrite(segB, SEGMENT_OFF);
        digitalWrite(segC, SEGMENT_ON);
        digitalWrite(segD, SEGMENT_ON);
        digitalWrite(segE, SEGMENT_OFF);
        digitalWrite(segF, SEGMENT_ON);
        digitalWrite(segG, SEGMENT_ON);
        break;

    case 6:
        digitalWrite(segA, SEGMENT_ON);
        digitalWrite(segB, SEGMENT_OFF);
        digitalWrite(segC, SEGMENT_ON);
        digitalWrite(segD, SEGMENT_ON);
        digitalWrite(segE, SEGMENT_ON);
        digitalWrite(segF, SEGMENT_ON);
        digitalWrite(segG, SEGMENT_ON);
        break;

    case 7:
        digitalWrite(segA, SEGMENT_ON);
        digitalWrite(segB, SEGMENT_ON);
        digitalWrite(segC, SEGMENT_ON);
        digitalWrite(segD, SEGMENT_OFF);
        digitalWrite(segE, SEGMENT_OFF);
        digitalWrite(segF, SEGMENT_OFF);
        digitalWrite(segG, SEGMENT_OFF);
        break;

    case 8:
        digitalWrite(segA, SEGMENT_ON);
        digitalWrite(segB, SEGMENT_ON);
        digitalWrite(segC, SEGMENT_ON);
        digitalWrite(segD, SEGMENT_ON);
        digitalWrite(segE, SEGMENT_ON);
        digitalWrite(segF, SEGMENT_ON);
        digitalWrite(segG, SEGMENT_ON);
        break;

    case 9:
        digitalWrite(segA, SEGMENT_ON);
        digitalWrite(segB, SEGMENT_ON);
        digitalWrite(segC, SEGMENT_ON);
        digitalWrite(segD, SEGMENT_ON);
        digitalWrite(segE, SEGMENT_OFF);
        digitalWrite(segF, SEGMENT_ON);
        digitalWrite(segG, SEGMENT_ON);
        break;

    case 10:
        digitalWrite(segA, SEGMENT_OFF);
        digitalWrite(segB, SEGMENT_OFF);
        digitalWrite(segC, SEGMENT_OFF);
        digitalWrite(segD, SEGMENT_OFF);
        digitalWrite(segE, SEGMENT_OFF);
        digitalWrite(segF, SEGMENT_OFF);
        digitalWrite(segG, SEGMENT_OFF);
        break;
    }
}

Cargamos el sketch con el IDE de Arduino y enviamos la compilación una vez validada, el programa muestra 4 ceros y cada carácter que recibe por puerto serie es mostrado su código ASCII por pantalla.


Y el resultado final:


Si se diera el caso que una vez conectado veis que alguno de los grupos de leds no se enciende no desesperéis simplemente revisad el conexionado.



fuente: Project: 4 seven segments display with Arduino - show the ascii code

Comentarios

Entradas populares de este blog

Desarrollo de aplicaciones para dispositivos de muñeca Garmin con Connect IQ

Mostrar datos BMP180 mediante un OLED I2c LED LCD Display con Arduino Nano

Guía para grabar una imagen de Raspberry Pi a una SD en Windows (XP,Vista,7,8,8.1,10)