bclose

Detector de llama

Arduino y los sensores de fuego

Objetivos

 

 

    • Presentar los sensores de llama.
    • Montar un circuito de ejemplo.
    • Ver sus características.
 

Material requerido.

Imagen de Arduino UNO

Arduino UNO o similar.

conexiones

Algunos cables de protoboard macho hembra.

Zumbador piezoelectrico

Un buzzer piezoeléctrico

Flame sensor

Un sensor de llama

tienda online prometec

Sensores de llama

 

No resulta extraño que los sensores de llamas se encuentren entre los más vendidos. La industria los suministra de todos los tipos, tamaños y precios, porque la idea de que se te queme la casa o la empresa es algo que ayuda mucho a sacar la cartera y buscar un detector que sea capaz de avisarte con tiempo de que hay llamas cerca de tus cosas.

En realidad, es muy probable que tengas varios de estos detectores en tu casa. Imagínate, por ejemplo, los calentadores de gas, los hornos domésticos de gas, o un sencillo calentador de agua y calefacción.

Todos ellos requieren una llama quemando gas. Si por cualquier motivo, la llama se extingue y no lo detectases, el gas seguiría fluyendo y causando un embalsamiento, listo para causar un disgusto explosivo.

Por eso, todos estos electrodomésticos, y sus equivalentes industriales, incorporan por ley, un detector de llama, que pueda cortar el gas en cuanto detecte falta de llama.

Lo sensores más sencillos (y baratos), suelen ser del tipo de detectores de ultravioletas, o sensores de infrarrojos.

 
  • El mercado ofrece, también, un amplio espectro de sensores del tipo de detectores de humo y de gases nocivos como monóxido de Carbono (CO) típico de la combustión,Dioxido de Carbono (CO2),  detectores de humo, o de gases peligrosos libres, como hidrocarburos  (Propano, Butano y demás).
  • Si tenemos ocasión en el futuro hablaremos de ellos.
 

En un entorno normal, la ignición de una llama provoca una ionización potente de gases comunes (En realidad un plasma ionizado, similar al que ilumina una lámpara halógena), que generan un patrón típico de frecuencia en el rango del ultravioleta. El detector es un semiconductor sensible a este rango de frecuencias.

Cuando la llama se estabiliza, es relativamente sencillo detectar su espectro infrarrojo, con una fotorresistencia LDR, pero diseñada para ser específicamente sensible a un rango característico.

Nosotros vamos a usar un sensor muy sencillo y fácil de manejar que es un sensor infrarrojo de llamas. Funcionan detectando una longitud de onda especifica (de unos 760 nm) que son características de las llamas, aunque son relativamente fáciles de engañar y pueden dar falsos positivos con ciertas luces.

Como todo en la vida, es cuestión de precio, y el nuestro es barato, así que nos tendremos que apañar, pero a pesar de todo, confio, en que el resultado de la sesión, sea satisfactorio.

Este sensor se encuentra muy frecuentemente encapsulado con un soporte y un potenciómetro para ajustar la sensibilidad, por poco dinero. Incluso se vende en formato múltiple, con varias cabezas apuntando en distintas direcciones

Montaje con soporte y ajuste
Multiple flame sensor

En principio siempre es recomendable usar uno montado (Porque dan menos trabajo y a la hora de la verdad no se suelta un cable), pero como me sobraba un detector independiente, por la mesa voy a montarlo en circuito de protoboard para ver qué pasa.

Flame sensor

 

Esquema de conexión

 

Lo normal para leer este sensor de llamas, seria usar un divisor de tensión como este:

Flame sensor circuit

Donde R1 debería tomar valores sobre 500k y como no tenía nada parecido, he usado 4 resistencias de 100k en serie, para tener lecturas claras en la puerta A0 de Arduino uno o Arduino mega. EL esquema eléctrico es algo así:

Alarma de llamas

Y aquí tenemos el esquema de la protoboard:

Alarma de incendio

 

Programa de control

 

El programa es de lo más simple. Solo tenemos que leer la caída de tensión en el divisor y mandar una señal acústica con el buzzer en cuanto el valor de la lectura en A0 sobrepase un cierto umbral.

Vamos a recuperar, además, la función Beep () que escribimos en la sesion Buzzers o zumbadores, para dar el tono de alarma cuando se detecte una llama

void setup()
   {
       pinMode(9, OUTPUT);
   }

void loop()
   {
       int v = analogRead(A0) ;
       if ( v > 10)
            beep(200) ;
   }
  
void beep(unsigned char pausa)
   {
       analogWrite(9, 20);
       delay(pausa);             // Espera
       analogWrite(9, 0);        // Apaga
       delay(pausa);             // Espera
   }

Lo que hace el programa es leer el pin A0 y si su valor sobrepasa un mínimo (para evitar los falsos positivos) llama a la función beep() para dar la alarma.

 
  • Nota: Normalmente hay que calibrar la sensibilidad del sensor. Para ello hay que ver que valores te devuelve en tu caso concreto y afinar este valor umbral, para que no esté pitando continuamente.
  • Los sensores en placa, suelen venir con un potenciómetro, que hay que ajustar para calibrar la sensibilidad el detector.
  • Tambien convendría modificar el programa, para que el tono de la señal se hiciese mas agudo cuanto mas alto sea el valor de lectura en A0
 

Aquí os dejo un mini video con un ejemplo:

 

Resumen de la sesión

 

 
    • Hemos visto que estos pequeños sensores de llamas son simples y razonablemente eficaces.
    • Dan bastante falsos positivos especialmente si les acercáis una luz potente.
    • Os recomiendo la versión con montura por la comodidad de uso.
    • Hemos creado una pequeña alarma de incendios con unos materiales de muy poco coste
 

 

 

 

 

(43) Comments

    • Alexander

    al momento de conectar todo y subir la programacion a arduino el buzzer se queda sonando y no se que hacer ayuda

    seran problema de programacion

    • Hola Alexander, ¿estás usando la programación del ejemplo? La que está subida está bien seguro. ¿O estás usando una programación tuya? Saludos.

  • hola, es posible conectar varios sensores de flama para que uno de ellos detecte el fuego? que cambios habría que hacerle al codigo?

    • Hola Alexander,pues no lo he probado pero si deberia ser posible conectándolo a varias entradas analógicas y yendo mirando si alguna de ellas cumple la condición. Puedes hacer un if con varios || o hacer un if dentro de un bucle for que vaya recorriendo todas las entradas.

      Eso sí para facilitar el montaje,si vas usas muchos sensores te recomendaría comprarlos cn montura Keyes. Un saludo.

  • hola, estaba practicando este proyecto con el arduino nano, pero el sensor de flama solo funciona a unos 80 cm o menos, hay alguna forma de que detecte a una mayor distancia (metros) o algun tipo de sensor q me recomiende.

    • Hola angel, hace mucho que no uso uno pero creo que deberia detectarte la llama a mas distancia

    • Guille

    ¿Es necesario una resistencia de 400k para cada diodo, si hago un montaje con más de uno?. Me surge la duda por la versión multiple que está de ejemplo pero que tiene solo una resistencia variable.
    Saludos y gracias de antemano.

    • Hola Guille, Me imagino que con una unica resitencia variable se podria hacer algo pero no lo veo muy claro, porque tendrias que leer con los convertidores Analogicos entre puntos y no me acaba de convencer.
      Es cuestion de hacer la prueba y ver como va la cosa (El experimento manda) pero a priorio yo pondria una resistencia por cada diodo y luego veriamos

  • Hola admin, sigo devorando este tutorial, gracias por tus oportunas repuestas anteriores. No he montado este proyecto, pero tengo una gran duda. Veo que en el primer esquemático, el sensor de llama se muestra polarizado inversamente, es decir el cátodo a VCC y el ánodo (triángulo) a GND. Igualmente en el el esquema de protoboard lo veo polarizado en forma directa catado a GND y anodo a VCC. Cual es el modo de polarización correcto?

    • Hola Edwin, seguramente sera algun error en el dibujo del montaje, pero al final es un foto diodo que conduce cuando recibe la radiacion adecuada y su polarizacion es la de un dioido sin mas

    • Daniel

    Gracias por la respuesta, Miguel. No tenía a mano esa placa pero he probado con otra y esa misma resistencia y sin problema. He tenido que afinar el valor del sensor de 20 a 42 y todo fenomenal.

    Agradecerte de nuevo la ayuda, eficaz y rápida.

    • Daniel

    Hola Miguel.

    Lo primero, felicitarte por los tutoriales de esta página. Son sencillamente geniales.

    Respecto a la alarma de incendios, lo estoy probando con una resistencia de 470K y me da lecturas de 1023 siempre. Tengo un flexo al lado y si lo apago da valores de 700 para arriba hasta volver a estabilizarse en 1023. ¿Crees que puede ser cosa de la resistencia? He concatenado varias de 10K en serie hasta llegar a los 500K pero no consigo solucionarlo.

    Gracias.

    • Daniel yo probaria con otra puerta analogica de arduino porque me parece mas un problema de la lectura que de otra cosa

  • Ya lo he publicado en foro>comunicaiones, haber si me podeis echar un cable que llevo mucho tiempo atascado con esto y me esta empezando a minar la moral…jejej. Igual es algun fallo de estos chorras, pero esos son los que mas cuesta ver y te hacen perder mucho tiempo.

    Gracias.

  • La verdad es lo que pretendia desde un principio, preguntar en el foro, pero parece que nose como hacerlo, me podrias indicar como??. Mientras voy a seguir intentandolo.

  • Hola,
    si, este codigo es la funcion que utilizo para medir el duty-cycle del pulso y que he explicado en los post anteriores y…..no , no me funciona como deberia, se supone que cuando acciono los mandos de la emisora de RC (aceleracion y giro) los valores del contador TCNT1 deberian de variar en funcion de dichas acciones, es decir, el numero de cuentas del contador tiene que variar en funcion del ancho del pulso. Ademas los valores que obtengo no son correctos, es como si midiese pulsos de menos de 1 mseg y aveces de mas de 2 mseg cosa que no puede ser, porque el rango de valores del pulso es de 1 a 2 mseg.

    • Hola Mike,
      La verdad es que planteas un tema complejo y con el que habria que entrar en mas detalles de lo que conviene en estas paginas.
      Te recomiendo plantear la cuestion en el foro, a ve si asi entre todos podemos echarte una mano

  • Primero, gracias por contestar, y segundo, con la funcion PulseIn me da unos tiempos de ejecucion muy altos.
    Por esa razon te hablo de medir el tiempo mediante la deteccion de flancos de subida/bajada, para ello utilizo la funcion digitalRead(). Este es el algoritmo que utilizo:

    void Leer_Canales(){

    nuevoTact = 0;

    dato_ch1 = digitalRead(Pin_in_ch1); // Leer pin

    Ddato_ch1 = dato_ch1 – dato_ant_ch1; // diferencia de valores leidos

    if(Ddato_ch1 == 1) // diferecia = 1 , flanco de subida
    {
    Tini = TCNT1; // empiezo a contar
    flancosubida = 1;
    }

    if(Ddato_ch1 == -1) // diferencia = -1 , flanco de bajada
    {
    Tact = TCNT1; // detengo contador
    flancobajada = 0;

    if(Tact < Tini ) // en caso de desborde del contador
    {
    nuevoTact = Tact + desborde; // a las cuentas actuales le sumo el desborde = 65536
    DT = nuevoTact – Tini;
    }
    else
    {
    DT = Tact – Tini; // diferencias de cuentas

    }
    }
    Duty_ch1 = DT * Tclk; // calculo duty-cycle, Tclk = periodo micro = 62.5e-9
    dato_ant_ch1 = dato_ch1;

    }

    • Hola Mike, ¿Te funciona bien? ¿Tienes algun problema con este programa?

  • Hola de nuevo,

    Estoy intentado leer la duracion de un pulso de una emisora de radio control mediante la deteccion de flancos, tanto de subida, como de bajada.

    Para hacer esta tarea leo el pin de entrada y resto el valor leido con otro anterior. Si la diferencia es igual a 1, es que tienes un flanco de subida, accedo al TCNT1 y lo guardo en una variable como tiempo inicial, y si la diferencia es igual a -1 , estamos en un flanco de bajada, entonces accedo de nuevo a contador del timer 1 y lo guando como tiempo actual.

    A la hora de contar el tiempo actual tambien tengo en cuenta los debordes del contador. es decir, si se da el caso le sumo el desborde al tiempo actual. pues la cuestion es que cuando haces la diferencia de tiempos me dan valores fijos, no se actualizan los valores, es decir, no responden a las acciones de los mandos y ademas son valores incorrectos.

    Si me podeis ayudar?

    Gracias.

    • Hola mike, pues tu diras en que te podmeos ayudar.

      De momento te haria un comentario sin conocer los detalles de tu tema, pero hay una funcion no muy conocida que se llama pulseIn() y que se puede usar precisamente para medir un pulso con subida y bajada o al reves. Si buscas en internet enseguida encontraras la referencia y como se usa: https://www.arduino.cc/en/Reference/PulseIn

      Entretanto, en nuestras paginas hay un ejemplo que hace exactamente eso con un pulso de audio ultrasonico para medir distancias aqui quizas te pueda ayudar

  • Hola me llamo Miguel y hace mas de una semana que cree una nueva entrada para ver si me podeis ayudar con un problema con el contador del Timer 1 de Arduino, pero todavia sigue pendiente de revision, nose si lo hice bien o no.

    Si alguen me puede contestar , gracias

    • Hola Mike,
      No he visto que tenga ningún comentario pendiente de responder y por eso no se muy bien cual es el problema. ¿Puedes volver a postear tu consulta por favor?
      Te atenderé encantado en lo que pueda

  • hola ,saber si existe alguna forma una vez dado el valor analógico que va de 0 a 1023 podamos calcular la longitud de la flama, es decir que con el dato analógico hubiera alguna formula que nos diera el tamaño de la flama

    • Hola Hugo,
      Que yo sepa, el detector de llama funciona porque esta sintonizado con una frecuencia especifica asociada con las llamas, pero no se me ocurre como podria determinar el tamaño de la llama y no soy optimista al respecto.

      Pero podrias utilizar una camara barata que se conecte a arduino de modo que cuando detectas la llama, dispares unas cuantas fotos. Ahora si que podras calcular el tamaño de la llama, midiendo el tamaño en funcion de la distancia y suponiendo una posicion fija de la camara, lo que parece razonable ¿Te puede valer?

    • Gustavo

    hola buenas nesesito saber como puedo hacer para colocar el sensor de llama de 4 pines que tiene una placa roja que sale mas arriba en la foto mas un led en ves de una bosina con arduino y como lo puedo programar recien empese a ocupar arduino y no entiendo mucho el tema alguien que me ayude porfavor tengo que entregar este trabajo para mañana

    • Hola Gustavo,
      No estoy seguro de llegar a tiempo para tu entrega, pero normalmente esos breakouts tiene 4 pines. GND + Vcc y una salida analogica que estará marcada como A0 o algo asi. EL cuarto pin puede estar libre o dar una señal digital cuando hay un cambio para avisarte.
      Espero que te sirva

    • Pam

    en mi pais no encontre lo que es el sensor de llamas … segun ellos no existe…. como se llama ese sensor en terminos muy cientificos como el “555” … 🙂

  • Saludos a todos.
    Alguien sabe cuanto de temperatura puede soportar el sensor de llama ?

    • Hola Cesar. Aunque no lo tengo ni lo he probado, yo no le acercaría un mechero o soplete. Algunos componentes electrónicos aguantan hasta 100º/150º. Una llama supera con creces esas temperaturas. Teóricamente, este módulo es para detectar una llama a cierta distancia, disparar una alarma y poder controlar el fuego antes de que se descontrole. Si el módulo y Arduino continuan en la zona de fuego, pues… esta claro.

      Saludos.

  • Hola amigos!!
    Me llamo David y hace poco que paso mis ratos de ocio con arduino y estoy buscando tutoriales para aprender.
    Tengo una idea desde hace algun tiempo,para crear una alarma para la cocina,y me ha venido de perlas encontrar este sitio,que tengo marcado como favorito para consultas.
    He realizo vuestro proyecto “Alarma de fuego con sensor de llama” y funciona correctamente,he variado la sensibilidad porque se activa a veces por reflejos.
    Voy al grano,quiero hacer algo mas dificil y serio.
    Quiero que el detector al activarse por llama,haga parpadear un led a la vez que suena el zumbador.
    Pero que cuando el detector deje de funcionar por no detectar llama,se apage el zumbador,pero el led siga parpadeando hasta pulsar un boton.
    Algo asi como un avisador por si salta la alarma cuando no estas,para que sepas que ha pasado algo.
    Espero haberme explicado.
    Aqui os pongo el codigo que vuestro que he modificado,pero que me da errores,y ya no se por donde seguir.

    int ledRojo = 2;
    int botonPin = 8;
    int valor =analogRead(A0);
    int botonState;
    int valorState;

    void setup()//declaracion del pin de salida
    {
    pinMode(ledRojo, OUTPUT);
    pinMode(botonPin, INPUT);
    pinMode(valor,INPUT);
    pinMode(9, OUTPUT);

    }
    void loop()//función de loop-lectura del valor del sensor de llama y corrección del umbral de lectura base
    {

    do{
    valorState= analogRead(A0);
    botonState= digitalRead(botonPin);
    }
    while (valorState == LOW);
    if( valorState == HIGH)
    {
    digitalWrite(ledRojo, HIGH);
    delay(200);
    digitalWrite(ledRojo, LOW);
    delay(200);}
    if(botonState== HIGH);
    {
    digitalWrite(ledRojo,LOW);}

    }
    if ( valor > 10){

    beep1(200) ;//función de llamada al zumbador
    }

    void beep1(unsigned char pausa)//función del zumbador con los intervalos de silencio correspondientes

    {
    analogWrite(9, 200);
    delay(pausa); // Espera
    analogWrite(9, 0); // Apaga
    delay(pausa); // Espera
    }

    ———————————————————————-
    Tengo declarados le led, el boton ,el detector,el zumbador,y lo quiero que vaya sucediendo.Pero ya se que me falta mucho que aprender.
    Espero que me haya explicado bien y el codigo sirva de ayuda.

    • Hola david,

      Lamento informarte de que recibimos tantas peticiones de opinar sobre el código de amigos, que sencillamente carecemos del tiempo necesario par hacerlo, confío en que lo entiendas. Esperamos poder montar en breve algún foro de usuarios de ido que podamos ayudarnos unos a otros.

      De todos modos veo que tiene varios errores de sintaxis en tu código, vemos:

      if ( valor > 10){ LA condición del if debe evaluarse a fue o false y tu pones dos instrucciones separadas por punto y coma.

      Podria ser if ( valor &gt ) es de cir que valor y gt sean true, pero entonces para marcar el and deberías poner valor && gt. Vale? y por cierto gt no está definido.

      Después pones if(botonState== HIGH); y como finalizas la linea con punto y coma (Q casi seguro sobra) , la linea de digital write se ejecuta siempre independientemente de tu condición aunque parezca que depende del if. Borra este punto y coma

      Por ultimo no entiendo bien lo que quieres porque aun colocas las llaves un poco regular. Te recomiendo que hagas indentaciones de las lineas para que te aclares tu y después que escribas poco apoco el programa para irlo comprobando porque hay varios errores que muestran que aun no entiendes bien el tema de los bloques.

      Persevera, que todos hemos empezado en algún momento y poco a poco iras aprendiendo a programar

      Suerte y hasta pronto

        • David

        Gracias Admin,seguiré intentándolo.

      • Martin

      Yo simplemente dejaría el led encendido pero no le pondría ningún pulsador. Cuando llegas a casa y ves que el led está activado le das al botón de reiniciado de arduino y ya se te apagará.

    • Alberto Palomero

    Buenisimo como el resto, si senhor,

    el mio tuve que calibrar lo a v>30 para que solo pitara al encender. Por cierto no veas con las resistencias…probe varias combinaciones y solo con 400 funcionaba bien. ni 300, ni 470.

    Saludos!

    • JuanKar

    ¡Genial! El tutorial en linea con los demas, superinstructivo, muy facil de entender y ameno. No pense que estos sensores fueran tan sensibles O_O.
    Un detalle: en el esquema creo que hay que alargar un poco el cable negro del buzzer para que se conecte al negativo 😉

Give a Reply

WordPress Anti-Spam by WP-SpamShield