¿Cómo generar números aleatorios con Arduino?

En este post vas a prender a generar números aleatorios con Arduino mediante dos funciones random y randomSeed.

Aquí tienes el vídeo donde te explico como usar las funciones para generar números aleatorios,

Función random:

Arduino tiene una función para generar números “aleatorios” que se llama Random y digo entre comillas porque esta función lo que hace es generar una lista de números que aunque muy larga, son siempre los mismos, por lo tanto no son realmente aleatorios.

Se puede escribir de dos maneras.

random(max);

random(min,max);

En el primer caso nos devuelve una valor aleatorio entre 0 y el número máximo -1

En el siguiente ejemplo:

numAleatorio=random(250);

asignamos a la variable numAleatorio el número aleatorio generado por la función random entre 0 y 249 incluidos.

Otra manera de escribir esta función sería indicando un valor mínimo que estaría incluido y un valor máximo que estaría excluido es decir devolverá un valor entre el mínimo incluido y el máximo -1.

Veamos un ejemplo:

numAleatorio=random(100,200);

Aquí asignamos a la variable numAleatorio el resultado de la función random entre 100 y 199 incluidos.

curso arduino
Curso Arduino

Si quieres convertirte en un experto en Arduino pincha en el siguiente botón

Función randomSeed

Ahora vamos a ver como generar números aleatorios con la función randomSeed, seed significa semilla y no es ni mas ni menos que un valor que introducimos a partir del cual la función random comienza a calcular, por lo tanto si conseguimos variar ese valor o darle cada vez uno diferente estaremos forzando a la función random que comienze a calcular cada vez desde un número diferente consiguiendo generar realmente números aleatorios.

Veamos dos ejemplos de como conseguir esto:

La primera sería leyendo un pin analógico que no está conectado a ningún sitio y por lo tanto lo que captaría sería ruido o interferencias eléctricas por lo tanto ese valor variará cada vez que hagamos una lectura de el.

randomSeed(analogRead(0);

otra forma sería consultando la función millis como ya vimos en un post anterior, esta función os devuelve el tiempo que se lleva ejecutando el programa por lo que cada vez que lo consultemos será diferente.

randomSeed(millis());

Aplicación de las funciones random mediante programa y montaje de un dado electrónico.

Cada vez que se oprima un pulsador se encenderá un número de leds aleatorios permaneciendo 1´5 segundos encendidos para poder visualizarlos.

A continuación puedes observar el esquema del montaje del dado electrónico y del programa de arduino, ambos puedes descargarlos en la zona de descargas.

Esquema de conexión

Esquema de conexión dado electrónico
Esquema de conexión dado electrónico

Programa para Arduino

/*AUTOR: JOSE ANTONIO RIVERA MORALES
 *FECHA: 1-8-2019
 *www.pasionelectronica.com
 * Este programa es un dado electrónico al oprimir el pulsador
 * genera un número aleatorio entre 1-6 espera un tiempo de 1´5s
 * con los leds iluminados y a continuación los apaga y espera una 
 * nueva pulsación
 */
 int pulsador=8;//número de pin donde conecto el pulsador
 int numAleatorio;//variable que me guarda el número aleatorio obtenido
 int x=0;//variable que almacena el número de leds a encender usada en el for
 int y=0;//variable para empezar desde el pin 2
 
void setup() {
pinMode(2,OUTPUT);//pines 2-7 configurados como salidas
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(pulsador,INPUT);//pin 8 pulsador configurado como entrada
randomSeed(analogRead(A0));//indico la semilla a usar, capto el ruido electrico de este pin sin conectar
}

void loop() {
 while(digitalRead(pulsador)==false);//espero a que sea pulsado el pulsador
 numAleatorio=random(1,7);//almaceno el número aleatorio entre 1-7
for(x=0;x<numAleatorio;x++){//bucle for para que encienda el número de leds igual al número obtenido
  y=x+2;//indico que empieze a encender leds desde el pin 2
  digitalWrite(y,HIGH);//enciendo el led correspondiente según cuantas veces ha entrado en el for
}
delay(1500);//espero un tiempo con los leds encendidos
y=0;//reinicializo la variable para que empieze a apagar
for(x=0;x<numAleatorio;x++){//bucle for para apagar los leds
  y=x+2;//indico que empieze a apagar leds desde el pin 2
  digitalWrite(y,LOW);//ordeno apagar el led correspondiente

}
}