Bootstrap

火焰传感器 - 从零开始认识各种传感器【第十六期】

火焰传感器|从零开始认识各种传感器

1、什么是火焰传感器 

火焰传感器是一种用于检测火焰或火光的传感器。它可以快速、准确地检测到周围环境中火源的存在,从而在火灾发生之初及时向消防人员或相关机构发送报警信息,以便及时采取措施进行火灾扑救。此外,在电力、化工、石油等行业中广泛使用的火焰传感器还可以检测到一系列易燃和有毒气体的存在,从而预防和减少了事故的发生。

 

2、火焰传感器工作原理

 

火焰传感器的工作原理通常基于光学检测技术,当火焰燃烧时,会产生一些特定波长的光线,这些光线可以被称为“火焰光谱”。

 

火焰传感器利用光电效应,将这些特定波长的光线转换成电信号,从而检测火焰的存在。 

3、常见的火焰传感器的种类 

火焰传感器主要有红外线及紫外线火焰传感器,也有复合型可以同时检测红外线和紫外线的类型,另外也有离子型火焰传感器。
其中,红外型火焰传感器则是检测由火焰散发的红外波长光线,根据光线强度的变化来确定火源位置;紫外型火焰传感器则是使用其敏感的紫外波长光线检测火焰在自然界中所特有的紫外辐射,从而确定火源是否存在。

3.1 红外线火焰传感器

当火焰燃烧时,会产生大量的红外线,红外火焰传感器能够探测到波长在700nm~1000nm范围内的红外线,这些红外线被传感器检测到,并将其转换成电信号。红外线火焰传感器对于不同类型的火焰都具有很好的响应能力,因此适用于各种不同的应用场景。

图片

 

3.2 紫外线火焰传感器

 

紫外线传感器的特点是:只对300nm波长以下的紫外线有感应,而对其它频谱范围的光线不敏感。

 

利用这个特性可以对火焰中的紫外线进行检测。到达地面的太阳光和一般电光源发出的光波长均大于300nm,所以紫外线火焰传感器检测的紫外波段属太阳光谱盲区,可以避开太阳光源的干扰,所以可靠性较高,而且它是光子检测手段,信噪比高,具有微弱信号检测能力。与红外线相比,紫外线检测手段更为可靠,具备高灵敏度、高响应速度。

图片

 

3.3 复合型及离子型火焰传感器

 

由于红外线和紫外线火焰传感器的不同特点,市场上还有同时具备红外线和紫外线检测功能的复合型的火焰传感器。它具有很高的防误报警能力,灵敏度和探测器距离高,抗电磁干扰能力强。
另外还有利用离子传感原理的火焰传感器,它的特点是只对火焰有感应,对高温无反应,抗干扰性能好,可以用于监测微弱的火苗。它的工作原理如下:
当有火焰存在时,火焰中的气体分子会被激发成离子,那么离子火焰传感器的两个电极中会引入一个小电流,火焰产生的离子会使得电流增加。通过监测电流变化,就可以判断是否存在火焰并触发相应的控制动作。

图片

 

3.4 几种火焰传感器的对比

 

这是几种不同的火焰传感器的比较,选择哪种火焰传感器取决于具体的应用场景和要求。例如,在需要高灵敏度和准确性的场景下,可以选择复合型火焰传感器;而在对成本要求较高的场景下,红外线火焰传感器可能是更好的选择。

4、火焰传感器实验演示 

我们来演示使用 MCU 读取显示火焰传感器的数据,实验中使用的是一款红外线火焰传感器。在常态下,读出数据为20左右,使用打火机打火并接近传感器,可以看到显示数值迅速升高,随着火焰距离的远近不同,数值会发生动态变化。

图片

 

具体的代码如下:

from breakout_colourlcd240x240 import BreakoutColourLCD240x240
from machine import ADC, Pin, Timer, PWM
from utime import sleep
import time, math,array
#------------------------------------------------------------------
width = BreakoutColourLCD240x240.WIDTH
height = BreakoutColourLCD240x240.HEIGHT
display_buffer = bytearray(width * height*2)
display = BreakoutColourLCD240x240(display_buffer)

timer1 = Timer() 

stemp = ADC(2)                       
current_temp = 0                   
#-------------------------------------------------------------------
def display_init():
    
    display.set_pen(0,255,0)
    display.rectangle(58,30,13,160)
    display.circle(64,190,10)
    display.set_pen(255,0,0)
  
    display.text("current", 150, 20, 194, 2)
    display.text("temp", 150, 35, 194, 2)
    display.update()
  
    for i in range(6):
        display.set_pen(0,200,0)
        display.pixel_span(80,27 + i*30,10)
        display.text(str(50 - i *10), 100, 20+i*30, 194, 2)
        display.set_pen(0,0,220)
        if i < 5:
            for j in range(4):
                display.pixel_span(80,33 + j*6 + i * 30,5)
        display.update()
    
#---------------------------------------------------------------------
def display_change(temp, color):
    global current_temp
    current_temp = temp
    #print(temp)
    if (50 - temp) < 25 :
        display.set_pen(color[0], color[1], color[2])
    else :
        display.set_pen(255, 0, 0)
    display.rectangle(58,30,13,160)
    display.circle(64,190,10)
    display.set_pen(0,0,150)
    display.rectangle(58,20,13,7+int((temp)/2)*6)
    display.set_pen(0,0,0)
    display.rectangle(150,50,90,40)
    if (50 - temp) < 25 :
        display.set_pen(color[0], color[1], color[2])
    else :
        display.set_pen(255, 0, 0)
    display.text(str(50-temp), 150, 50, 5, 5)
    display.update()
#----------------------------------------------------------------------
def get_temp():
    
    Analogvalue=stemp.read_u16()
    voltage=100*float(Analogvalue)/65535

    return voltage
#----------------------------------------------------------------------
def main():
    
    color = [0,255,0] 
    timer1 = Timer()
    display_init()
    timer1.init(freq=5,mode=Timer.PERIODIC, callback=lambda t:display_change(round(get_temp(),1), color))

    while True:
      sleep(0.1) 
main()

;