En este post, aprenderás a generar números aleatorios en un Arduino y mostrarlos en un display de 7 segmentos. Este tipo de proyectos es ideal para entender cómo interactuar con displays y manejar su configuración para mostrar diferentes dígitos.
El programa utiliza la función random() de Arduino para generar números aleatorios dentro de un rango definido (por ejemplo, entre 0 y 99) y luego los traduce en señales digitales para controlar los segmentos del display.
Materiales:
Conexiones:
Como funciona?
El funcionamiento de este proyecto es el siguiente: Cuando pulsemos el botón 1 vez , entramos en un bucle infinito en donde nos aparecerán números aleatorios en los displays. No vamos a poder visualizar estos números ya que la pausa entre numero y numero es de 10ms (esta pausa se puede modificar). Cuando presionamos el pulsador por segunda vez, salimos de bucle y podremos visualizar un numero en los displays. A continuación les dejo el código documentado.
Código documnetado:
/*Código escrito por: Esteban Carrillo para EDEPTEC.Página web: https://www.edeptec.comFacebook: @edeptecYoutube: https://youtube.com/c/EDEPTEC*/// Definimos los pines de los displays//int pines[] = {0, 1, 2, 3, 4, 5, 6};//{g, f, e, d, c, b, a};#define decenaTr 10 // Pin para activar el display de decenas#define unidadTr 8 // Pin para activar el display de unidadesbool estadoAnterior = 0; // Variable para almacenar el estado anterior del botónint unidad; // Variable para almacenar la unidad del número aleatorioint decena; // Variable para almacenar la decena del número aleatorioshort pausa = 5;// Variable para almacenar la duración de la pausa entre activación de displaysbool pulso = 0; // Variable para controlar entre start y stop//Numeros que se mostraran en el display de 7 segmentos en binariobyte numerosAnodo[10]{B0000001, // 0B1001111, // 1B0010010, // 2B0000110, // 3B1001100, // 4B0100100, // 5B0100000, // 6B0001111, // 7B0000000, // 8B0000100, // 9};/*** Inicializa los pines como salidas y establece una semilla para el generador de números aleatorios.** El pin decenaTr y unidadTr se establecen como salidas para controlar el transistor* que activa el display de decenas o unidades. Luego, se establecen los 8 pines* necesarios para controlar cada segmento de los displays como salidas.** Por último, se establece una semilla para el generador de números aleatorios* leyendo el valor analógico del pin A2.*/void setup(){pinMode(decenaTr, OUTPUT);pinMode(unidadTr, OUTPUT);for (int led = 0; led < 8; led++){pinMode(pines[led], OUTPUT);}randomSeed(analogRead(A2));}/*** Bucle principal del programa. Se encarga de:* - Leer el estado del botón* - Cambiar el valor de la variable pulso si se presiona el botón* - Generar un número aleatorio entre 0 y 99 si se presiona el botón* - Separar el número en decenas y unidades* - Mostrar el número en los displays* - Hacer una pausa de 10ms* - Mostrar el número en los displays** @return void*/void loop(){bool estadoBoton = digitalRead(A0);if (estadoBoton != estadoAnterior && estadoBoton == HIGH)pulso = !pulso;estadoAnterior = estadoBoton;if (pulso){byte randomNum = random(100);separarNumero(randomNum);delay(10);}mostarNumero();}/*** Separa un número aleatorio en sus componentes de decenas y unidades.** Este método toma un número aleatorio de dos dígitos (0-99) y calcula* el valor de las decenas y unidades. Los valores calculados se almacenan* en las variables globales 'unidad' y 'decena'.** @param randomNum Número aleatorio a ser separado en decenas y unidades.*/void separarNumero(byte randomNum){unidad = randomNum / 10;decena = (randomNum % 10) / 1;}/*** Muestra en los displays el número separado en decenas y unidades.** Este método se encarga de mostrar en los displays el número* separado en decenas y unidades. Primero activa el transistor* de la decena y muestra el valor de la decena en el display,* luego espera un tiempo definido en la variable 'pausa' y* finalmente hace lo mismo para la unidad.*/void mostarNumero(){digitalWrite(decenaTr, HIGH);digitalWrite(unidadTr, LOW);PORTD = numerosAnodo[decena];delay(pausa);digitalWrite(decenaTr, LOW);digitalWrite(unidadTr, HIGH);PORTD = numerosAnodo[unidad];delay(pausa);}
Publicar un comentario