Efecto de fuego realista con Arduino

Last updated: 10 May 2022

Este proyecto te enseñará cómo crear un efecto sencillo pero muy realista de fuego (o llamas) con un Arduino y unos LEDs.

Es verdad que existen otros ejemplos de crear un efecto de fuego por allí en la web pero ninguno da un resultado muy realista. Son más bien ejercicios en encender y apagar un LED de forma aleatoria. Todos dan la sensación de ver unas luces de navidad baratas sufriendo un corte de circuito.

También se puede utilizar este tutorial como una introducción a la programación de Arduino/AVR (¡o incluso un primer paso a la programación en general!) porque el código solo requiere conocimientos muy básicos.

De hecho, el ejemplo del efecto de fuego es un buen punto de partida para niños (o niños adultos :) ) que están empezando programar Arduino. Todas las instrucciones están acompañadas por una explicación que no supone que hayas tocado un Arduino en tu vida.

Dado que el tutorial explica los comandos más básicos, se puede considerar un proyecto "hello world" Un programa ¡Hola, mundo! es un programa simple sin utilidad ninguna; solo demuestra que conozcas lo mínimo antes de ir más allá con tus sueños... . Es más divertido y útil (suponiendo, claro, que necesitas un efecto de fuegoven algún lugar de tu casa) que el ejemplo ubicuo de blinkparpadear. Si nunca has probado el ejemplo blink o lo has probado una vez y quedaste aburrido inmediatamente o (si tienes mucha suerte) no tienes ni idea qué es el ejemplo blink, puedes considerar esta página tu entrada en el mundo de la programación de Arduino y AVR :)

La primera vez que hice un efecto realista de fuego en un Arduino fue (debido a petición popular) para el belén navideño de mis hijas. De hecho fue la razón por la que compré y programé un Arduino por primera vez. Hacía unas cuántas navidades había logrado un efecto parecido (pero no tan realista) con un chip contador 4026, un chip temporizador NE555, un condensador y un par de resistencias enchufados a una protoboard (más un poco de cinta adhesiva) Encontré el diagrama en la web aunque no lo puedo encontrar ahora a pesar de mis mejores intentos en buscarlo. Supongo que ya no existe, pero si alguien conoce el URL, que me lo envie y añado un enlace aquí encantado..

Primer intento en crear un efecto de fuego (no muy) realista con los chips 4026 y 555
Primer intento en crear un efecto de fuego (no muy) realista con los chips 4026 y 555

Materiales

  • Placa Arduino (cualquier modelo + cable USB)
  • LEDs (rojo X 2, amarillo X 2)
  • resistencias (330Ω x 4)
  • cables puente (macho-macho X 4)
  • Protoboard sin soldadura

Pasos

Cableado

Conecta tu Arduino tal como se ve en el diagrama siguiente. Hay 4 LEDs conectados a las patas del Arduino 2, 3, 4 y 5 (salidas digitales). Cada LED está conectado a través de una resistencia 330Ω y por el otro lado conectado a tierra (GND). Claro, puedes usar más o menos LEDs pero evidentemente tendrás que poner como mínimo uno rojo y uno amarillo para conseguir una apariencia de llamas.

Para Arduino UNO (la placa más típica):

Cableado para un efecto de fuego en Arduino UNO
Cableado para un efecto de fuego en Arduino UNO

Para Arduino micro pro (un montaje más compacto):

Cableado para un efecto de fuego en Arduino micro pro
Cableado para un efecto de fuego en Arduino micro pro

Diagrama esquemático (sirve para ambos montajes):

Flame effect wiring on Arduino
Flame effect wiring on Arduino

Programación del Arduino

Crea un programa nuevoPrograma > Nuevo en el IDE de Arduino.

Programa nuevo en el IDE de Arduino
Programa nuevo en el IDE de Arduino

Nos ha creado dos funciones automáticamente: setup() Las instrucciones en setup() se ejecutarán solo una vez cuando arranquemos el Arduino. y loop() Las instrucciones en loop() se ejecutarán repetidamente hasta que desenchufemos el Arduino del corriente (sea cable USB, pila). .

Antes de codifcar la lógica de estas funciones, crea una variable global r que usaremos para asignar un número aleatorio cuando lo necesitemos (porque, como verás, lo necesitaremos):

long r;        

Añade el código de configuración (set-up). Esto dice que los pines 2, 3, 4 y 5 son salidas digitales (OUTPUTs); vamos a enviar un corriente eléctrico a través de ellos.

void setup(){
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
}       

Ahora creamos una función nuestra que alumbrará uno de nuestros LEDs (pata x). La primera linea genera un número aleatorio entre 0 y 100. Si ese número es menos de 90, la segunda linea de la función hará digitalWrite(x, true) y el LED que está conectado a la pata x se encenderá; en caso contrario hará digitalWrite(x, false) y el LED que esté conectado a la pata x se apagará. Dicho de otra forma, cada LED estará encendido durante 90% del tiempo. ¡¡¡Ésta es la clave para crear un efecto realista de fuego!!!

void parpardear(int x){
  r = random(100L);
  digitalWrite(x, r < 90);
}      

Ahora solo tenemos que añadir la lógica a la función loop(), que simplemente invoca a nuestra función parpardear() para los pines 2, 3, 4 y 5 y luego hace una pausa durante una décima de segundo antes de repetir.

void loop(){
  parpardear(2);
  parpardear(3);
  parpardear(4);
  parpardear(5);
  delay(100);
}        

El código completo queda así:

long r;

void setup(){
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
}

void parpardear(int x){
  r = random(100L);
  digitalWrite(x, r < 90);
}

void loop(){
  parpardear(2);
  parpardear(3);
  parpardear(4);
  parpardear(5);
  delay(100);
}       

Subir el programa a tu Arduino

Conecta tu Arduino al ordenador mediante el cable USB y asegúrate que la placa correcta y puerto USB correcto están seleccionados en el menú de Herramientas.

Cómo comprobar la placa y puerto del Arduino
Cómo comprobar la placa y puerto del Arduino

Ahora subePrograma > Subir o Ctrl + U tu código al chip.

Deberías ver algo parecido a esto en la consola y barra de estado:

Subido
Archiving built core (caching) in: /tmp/arduino_cache_136769/core/core_arduino_avr_micro_db99e0ab099901ba14487a14637cc883.a
El Sketch usa 4626 bytes (16%) del espacio de almacenamiento de programa. El máximo es 28672 bytes.
Las variables Globales usan 157 bytes (6%) de la memoria dinámica, dejando 2403 bytes para las variables locales. El máximo es 2560 bytes.

Y, sobre todo, deberías ver tus LEDs parpardeando como si fuesen llamas :)

Si ves un montón de texto en rojo en la consola que contenga los siguientes mensajes de error, probablemente has seleccionado la placa equivocada. En este caso, comprueba la placa especificada en el menú Herramientas.

  Ha ocurrido un error mientras se enviaba el sketch
Arduino: 1.8.5 (Linux), Board: "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"
Archiving built core (caching) in: /tmp/arduino_cache_752042/core/core_arduino_avr_mega_cpu_atmega2560_db99e0ab099901ba14487a14637cc883.a
El Sketch usa 1908 bytes (0%) del espacio de almacenamiento de programa. El máximo es 253952 bytes.
Las variables Globales usan 17 bytes (0%) de la memoria dinámica, dejando 8175 bytes para las variables locales. El máximo es 8192 bytes.
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
An error occurred while uploading the sketch

Si ves un montón de text en rojo en la consola que contenga los siguientes mensajes de error, probablemente has seleccionado el puerto USB equivocado. En este caso, comprueba el puerto especificado en el menú Herramientas.

  avrdude: error: programmer did not respond to command: exit bootloader
Arduino: 1.8.5 (Linux), Board: "Arduino/Genuino Micro"
El Sketch usa 1908 bytes (0%) del espacio de almacenamiento de programa. El máximo es 253952 bytes.
Las variables Globales usan 17 bytes (0%) de la memoria dinámica, dejando 8175 bytes para las variables locales. El máximo es 8192 bytes.
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
Found programmer: Id = ""; type = 
    Software Version = .; Hardware Version = �.
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: error: buffered memory access not supported. Maybe it isn't
a butterfly/AVR109 but a AVR910 device?
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.

avrdude: butterfly_recv(): programmer is not responding
avrdude: error: programmer did not respond to command: leave prog mode
avrdude: butterfly_recv(): programmer is not responding
avrdude: error: programmer did not respond to command: exit bootloader
avrdude: error: programmer did not respond to command: exit bootloader

Disfrutar de los resultados

Tus LEDs deben estar parpardeando como un fuego de verdad. Ojalá que hubiera sacado la foto siguiente en la oscuridad :(

Efecto fuego con Arduino
Efecto fuego con Arduino

Luego solo hace falta cubrir los LEDs y la placa con palitos finos de madera o paja y colocarla en tu maqueta o belén con el cable USB enchufado a la pared o a una pila. Aquí teneis mi (bastante blasfemo) belén. Menos mal que sí saqué esta foto en la oscuridad:

Efecto de fuego con Arduino en un belén
Efecto de fuego con Arduino en un belén

¡¡¡Luces (digo llamas), cámara, acción!!!

Efecto de fuego con Arduino en un belén

Y si no quieres sacrificar tu Arduino en el belén de tus niños durante toda la navidad, ¡este artículo te enseña como montar este mismo proyecto en un chip ATtiny85 de €1!

© 2022