.. note::
¡Hola, bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook! Sumérgete más profundamente 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.
- **Vistas previas exclusivas**: Obtén acceso anticipado a anuncios de nuevos productos y avances.
- **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes.
- **Promociones festivas y sorteos**: Participa en sorteos y promociones de temporada.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo!
.. _1.1.4_js:
1.1.4 Pantalla de 7 segmentos
====================================
Introducción
----------------
Vamos a intentar controlar una pantalla de 7 segmentos para mostrar cifras del 0 al 9 y de la A a la F.
Componentes Necesarios
--------------------------------
En este proyecto, necesitamos los siguientes componentes.
.. image:: img/list_7_segment.png
Es definitivamente conveniente comprar un kit completo, aquí está el enlace:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nombre
- ELEMENTOS EN ESTE KIT
- ENLACE
* - Kit Raphael
- 337
- |link_Raphael_kit|
También puedes comprarlos por separado en los enlaces a continuación.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUCCIÓN DEL COMPONENTE
- ENLACE DE COMPRA
* - :ref:`cpn_gpio_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_7_segment`
- |link_7segment_buy|
* - :ref:`cpn_74hc595`
- |link_74hc595_buy|
Diagrama Esquemático
------------------------
Conecta el pin ST_CP del 74HC595 al GPIO18 de la Raspberry Pi, SH_CP al GPIO27, DS al GPIO17,
y los puertos de salida paralelos a los 8 segmentos de la pantalla LED de segmentos. Introduce
datos en el pin DS al registro de desplazamiento cuando SH_CP (la entrada del reloj del registro
de desplazamiento) esté en el flanco ascendente, y al registro de memoria cuando ST_CP (la entrada
del reloj de la memoria) esté en el flanco ascendente. Luego puedes controlar los estados de
SH_CP y ST_CP a través de los GPIO de la Raspberry Pi para transformar la entrada de datos serial
en salida de datos paralela, ahorrando así GPIOs de la Raspberry Pi y controlando la pantalla.
.. image:: img/schematic_7_segment.png
Procedimientos Experimentales
--------------------------------
**Paso 1:** Construye el circuito.
.. image:: img/image73.png
**Paso 2:** Ve a la carpeta del código.
.. raw:: html
.. code-block::
cd ~/raphael-kit/nodejs/
**Paso 3:** Ejecuta el código.
.. raw:: html
.. code-block::
sudo node 7-segment_display.js
Después de ejecutar el código, verás la pantalla de 7 segmentos mostrar del 0 al 9 y de la A a la F.
**Código**
.. code-block:: js
const Gpio = require('pigpio').Gpio;
const segCode = [0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71];
const SDI = new Gpio(17, { mode: Gpio.OUTPUT });
const RCLK = new Gpio(18, { mode: Gpio.OUTPUT });
const SRCLK = new Gpio(27, { mode: Gpio.OUTPUT });
function hc595_shift(dat) {
for (let j = 0; j < 8; j++) {
let code = 0x80 & (dat << j);
if (code != 0) {
code = 1;
}
SDI.digitalWrite(code);
SRCLK.trigger(1,1);
}
RCLK.trigger(1,1);
}
let index = -1;
setInterval(() => {
index = (index+1)%16;
hc595_shift(segCode[index]);
}, 1000);
**Explicación del Código**
.. code-block:: js
const segCode = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71];
Define un array de códigos de segmentos hexadecimales (cátodo común) de 0 a F.
.. code-block:: js
const SDI = new Gpio(17, { mode: Gpio.OUTPUT });
const RCLK = new Gpio(18, { mode: Gpio.OUTPUT });
const SRCLK = new Gpio(27, { mode: Gpio.OUTPUT });
Inicializa los pines 17, 18 y 27 en modo de salida, y asígnalos a ``SDI``, ``RCLK`` y ``SRCLK`` respectivamente.
.. code-block:: js
function hc595_shift(dat) {
for (let j = 0; j < 8; j++) {
let code = 0x80 & (dat << j);
if (code != 0) {
code = 1;
}
SDI.digitalWrite(code);
SRCLK.trigger(1,1);
}
RCLK.trigger(1,1);
}
Implementa una función ``hc595_shift`` para convertir los campos en el array ``segCode`` en números
y mostrarlos en el tubo digital.
.. code-block:: js
let code = 0x80 & (dat << j);
if (code != 0) {
code = 1;
}
SDI.digitalWrite(code);
Asigna los datos dat a SDI(DS) por bits.
Aquí asumimos dat=0x3f (0011 1111), cuando j=2, 0x3f se desplazará a la derecha (<<) 2 bits.
1111 1100 (0x3f << 2) & 1000 0000 (0x80) = 1000 0000, es verdadero.
En este momento, se escribe 1 en SDI.
.. code-block:: js
SRCLK.trigger(1,1);
Genera un pulso de flanco ascendente y mueve los datos DS al registro de desplazamiento.
``trigger(pulseLen, level)``
* pulseLen - longitud del pulso en microsegundos (1 - 100)
* level - 0 o 1
Envía un pulso de disparo al GPIO.
El GPIO se establece en level durante pulseLen microsegundos y luego se restablece a not level.
.. code-block:: js
RCLK.trigger(1,1);
Genera un pulso de flanco ascendente y mueve los datos del registro de desplazamiento al registro de almacenamiento.
.. code-block:: js
let index = -1;
setInterval(() => {
index = (index+1)%16;
hc595_shift(segCode[index]);
}, 1000);
Finalmente, usa la función ``hc595_shift()`` para convertir los campos en ``segCode``
y mostrarlos a través del tubo digital.
Imagen del Fenómeno
---------------------------
.. image:: img/image74.jpeg