Nota

Hola, ¡bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Profundiza en Raspberry Pi, Arduino y ESP32 con otros entusiastas.

¿Por qué unirse?

  • Soporte experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprende y comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Avances exclusivos: Obtén acceso anticipado a anuncios de nuevos productos y avances exclusivos.

  • Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más nuevos.

  • Promociones festivas y sorteos: Participa en sorteos y promociones festivas.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo!

Mostrar Número

En este proyecto, utilizamos Processing para controlar un display de 7 segmentos y mostrar números del 0 al 9 y letras de la A a la F.

Componentes necesarios

En este proyecto, necesitamos los siguientes componentes.

Es definitivamente conveniente comprar un kit completo, aquí está el enlace:

Nombre

ARTÍCULOS EN ESTE KIT

ENLACE

Kit Raphael

337

Raphael Kit

También puedes comprarlos por separado en los enlaces a continuación.

INTRODUCCIÓN DE COMPONENTES

ENLACE DE COMPRA

Placa de Extensión GPIO

COMPRAR

Protoboard

COMPRAR

Cables de Puente

COMPRAR

Resistor

COMPRAR

Pantalla de 7 segmentos

COMPRAR

74HC595

COMPRAR

Cableado

../_images/image1251.png

Esquema

import processing.io.*;

    int SDI=17;   //serial data input
    int RCLK=18;  //memory clock input(STCP)
    int SRCLK =27;   //shift register clock input(SHCP)


int[] SegCode= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void hc595_shift(int dat){
  int i;

  for(i=0;i<8;i++){
    int n=(0x80 & (dat << i));
    if ( n==0){
      GPIO.digitalWrite(SDI, 0);
    } else {
      GPIO.digitalWrite(SDI, 1);
    }
    GPIO.digitalWrite(SRCLK, 1);
    delay(1);
    GPIO.digitalWrite(SRCLK, 0);
  }

    GPIO.digitalWrite(RCLK, 1);
    delay(1);
    GPIO.digitalWrite(RCLK, 0);
}

void setup() {
    size(400, 200);
    frameRate(10);

    GPIO.pinMode(SDI, GPIO.OUTPUT);
    GPIO.pinMode(RCLK, GPIO.OUTPUT);
    GPIO.pinMode(SRCLK, GPIO.OUTPUT);

    GPIO.digitalWrite(SDI, 0);
    GPIO.digitalWrite(RCLK, 0);
    GPIO.digitalWrite(SRCLK, 0);

    fill(0,25,88);
    textAlign(CENTER,CENTER);
    textSize(height*0.8);
}

void draw() {

    background(255);
    int number = (frameCount%100)/10;
    text(number, width/2, height/2);
    hc595_shift(SegCode[number]);
}

¿Cómo funciona?

Importa processing.io.* y utiliza la biblioteca de funciones GPIO para controlar los pines del tubo digital.

Define el array SegCode = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}, que representa un array de códigos de segmentos desde 0 hasta F en hexadecimal (cátodo común).

La función setup() configura los tres pines SDI, RCLK y SRCLK como salida, y los datos iniciales como 0.

La función hc595_shift(int dat) se utiliza para desplazar el SegCode al 74HC595.

void hc595_shift(int dat){
  int i;

  for(i=0;i<8;i++){
    int n=(0x80 & (dat << i));
    if ( n==0){
      GPIO.digitalWrite(SDI, 0);
    } else {
      GPIO.digitalWrite(SDI, 1);
    }
    GPIO.digitalWrite(SRCLK, 1);
    delay(1);
    GPIO.digitalWrite(SRCLK, 0);
  }

    GPIO.digitalWrite(RCLK, 1);
    delay(1);
    GPIO.digitalWrite(RCLK, 0);
}

n=(0x80 & (dat << i)) significa desplazar dat a la izquierda por i bits y luego hacer la operación & con 0x80.

La regla de la operación & es que cuando ambos lados de & son 1, el resultado es 1, de lo contrario, el resultado es 0.

Por ejemplo, asumimos dat=0x3f,i=2 (0011 1111 << 2 desplaza a 1111 1100), entonces 1111 1100 & 1000 0000 (0x80)) = 1000 0000.

Finalmente, asigna los datos de dat a SDI (DS) por bits.

digitalWrite(SRCLK, 1) cuando SRCLK genera un pulso de flanco ascendente de 0 a 1, los datos se transferirán del registro DS al registro de desplazamiento;

digitalWrite(RCLK, 1) cuando RCLK genera un pulso de flanco ascendente de 0 a 1, los datos se transferirán del registro de desplazamiento al registro de almacenamiento.

fill(0,25,88);
textAlign(CENTER,CENTER);
textSize(height*0.8);

La función fill() utilizada en setup() puede llenar el color del texto, textAlign(CENTER,CENTER) se usa para centrar el texto, textSize(height*0.8) cambia la altura del texto a 0.8 veces la original. Estas funciones pueden personalizar el estilo del texto mostrado en Processing.

void draw() {

    background(255);
    int number = (frameCount%100)/10;
    text(number, width/2, height/2);
    hc595_shift(SegCode[number]);
}

El frameCount es una semilla, que está relacionada con frameRate. Por defecto, frameRate es 60, lo que significa que frameCount se acumulará 60 veces por segundo.

Luego, podemos hacer que Processing y el display de 7 segmentos muestren la cifra de 0 a 9 y de la A a la F simultáneamente.