差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
tempsensor [2023/07/20 17:32]
chengshunkai
tempsensor [2023/08/01 16:39] (当前版本)
chengshunkai
行 5: 行 5:
 温度传感器是一种用于测量和检测温度的设备或传感器。它能够将物体或环境的温度转换为可供测量、记录或控制的电信号或数字信号。温度传感器广泛应用于各个领域,包括工业控制、环境监测、医疗设备、家电、汽车等。温度传感器在各个领域中起着至关重要的作用,帮助监测和控制温度,确保设备的正常运行和安全性,同时也提供数据用于分析和决策。 温度传感器是一种用于测量和检测温度的设备或传感器。它能够将物体或环境的温度转换为可供测量、记录或控制的电信号或数字信号。温度传感器广泛应用于各个领域,包括工业控制、环境监测、医疗设备、家电、汽车等。温度传感器在各个领域中起着至关重要的作用,帮助监测和控制温度,确保设备的正常运行和安全性,同时也提供数据用于分析和决策。
  
-### 2. 温度传感器的分类+{{ :​wenducgq.jpg?​600 |}} 
 + 
 +### 2. 温度传感器的分类
  
 {{ :​温度传感器.jpg?​1000 |}} {{ :​温度传感器.jpg?​1000 |}}
行 14: 行 16:
  
 热敏电阻温度传感器利用材料的电阻随温度变化的特性来测量温度。它使用热敏电阻材料作为敏感元件,该材料的电阻值会随着温度的变化而变化。通过测量热敏电阻的电阻值变化,可以确定与温度相关的值。热敏电阻的电阻值随温度的升高或降低而呈非线性变化。热敏电阻温度传感器的输出是模拟信号,通常需要通过模数转换器(ADC)将其转换为数字形式以进行进一步的处理和读取。 热敏电阻温度传感器利用材料的电阻随温度变化的特性来测量温度。它使用热敏电阻材料作为敏感元件,该材料的电阻值会随着温度的变化而变化。通过测量热敏电阻的电阻值变化,可以确定与温度相关的值。热敏电阻的电阻值随温度的升高或降低而呈非线性变化。热敏电阻温度传感器的输出是模拟信号,通常需要通过模数转换器(ADC)将其转换为数字形式以进行进一步的处理和读取。
 +
 +{{ :​quxian.png?​600 |}}
  
 ####​种类: ####​种类:
行 46: 行 50:
  
 测量范围较窄,不能适用于极高温度和极低温度的测量。 测量范围较窄,不能适用于极高温度和极低温度的测量。
- 
-####​使用案例: 
- 
-**NTC热敏电阻转化为温度值** 
- 
-NTC热敏电阻温度计算方法,B值法 
- 
-{{ :​bzhi.jpg?​300 |}} 
- 
-这里T1和T2指的是K度即开尔文温度,K度=273.15(绝对温度)+摄氏度;其中T2=(273.15+25)[通常都是用25℃] 
- 
-R1是热敏电阻在T1温度下的阻值; 
- 
-R2是热敏电阻在T2温度下的标称阻值,​T2一般是常温25℃ 
- 
-B值是热敏电阻的重要参数(参考具体型号热敏电阻datasheet) 
- 
-exp是e的n次方; 
- 
-NTC热敏电阻随环境温度(T)升高,电阻值(R)会下降,反之,当温度(T)下降,电阻值(R)会上升。其对温度感应非常灵敏,NTC热敏电阻电路相对简单,价格低廉,组件精确,可以轻松获取项目的温度数据,因此广泛应用于各种温度的感测与补偿中。 
- 
-常规NTC热敏电阻参数:温度为(R25℃)时,阻值为10kΩ,B值(25/​85)为3435。温度为(R25℃)时,阻值为100kΩ,B值(25/​50)为3950 
- 
-转换代码如下: 
- 
-    from machine import Pin,ADC 
-    import time 
-    import math 
- 
-    A0 = ADC(0) 
- 
-    temp=1 
-    temp1=1 
- 
-    while True: 
-        Analogvalue=A0.read_u16() 
-        print("​Analogvalue=",​Analogvalue) 
-        voltage=3.32*float(Analogvalue)/​65535 
-        print("​voltage=",​voltage) 
-        Rt=10000*voltage/​(3.32-voltage) 
-        print("​Rt=",​Rt) 
- 
-        temp=1/​(((math.log(Rt/​10000))/​3950)+(1/​(273.15+25))) 
-        temp=temp-273.15 
-        print('​temperature=',​temp,'​c'​) 
-        if(temp>​34):​ 
-            print('​hot'​) 
-        else: 
-            print('​cold'​) 
-        time.sleep(1) 
- 
- 
- 
- 
-**NTC热敏电阻模拟温度传感器模块:KY-028** 
- 
-KY-028数字温度传感器根据热敏电阻测量温度变化。该模块具有数字和模拟输出,有一个电位计用于调整数字接口上的检测阈值。注:该模块不能精准的测量温度,只能测量温度相对变化,可做固定环境下的温度报警器使用。 
- 
-{{ :​ky-028.jpg?​300 |}} 
- 
-{{:​ky_028.mp4|}} 
- 
-使用KY-028来监测温度变化,调节模块上的可变电阻器使其在正常环境下报警输出引脚输出为低电平,将传感器连接到树莓派拓展板上。 
- 
-树莓派-------KY-028 
- 
-3.3------+ 
- 
-GND------G 
- 
-DO-------GPIO20 
- 
-A0-------GPIO26(ADC0) 
- 
-当温度正常时RGB灯为常绿,oled显示屏显示Normal 
- 
-当温度升高时发出报警信息RGB灯变为红色闪烁,oled显示屏显示Warn!!!,同时蜂鸣器响起 
- 
-    from machine import Pin,ADC,PWM 
-    from oled import oled 
-    from ssd1306 import SSD1306_SPI 
-    from board import pin_cfg 
-    import framebuf 
-    import array 
-    import rp2 
-    import time 
-    import math 
- 
-    D0 = Pin(20,​Pin.IN) 
-    A0 = ADC(0) 
-    pwm0 = PWM(Pin(19)) ​     # 从引脚创建 PWM 对象 
-    pwm0.freq(7000) ​        # 设置频率 
-    pwm0.duty_u16(500) ​     # 设置占空比,​ 范围 0-65535 
- 
-    status=1 
-    temp=1 
- 
-    NUM_LEDS = 12 
- 
-    #​设置pio工作模式 
-    @rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW,​ out_shiftdir=rp2.PIO.SHIFT_LEFT,​ autopull=True,​ pull_thresh=24) 
- 
- 
-    def ws2812(): 
-        T1 = 2 
-        T2 = 5 
-        T3 = 3 
-        wrap_target() 
-        label("​bitloop"​) 
-        out(x, 1)               ​.side(0) ​   [T3 - 1] 
-        jmp(not_x, "​do_zero"​) ​  ​.side(1) ​   [T1 - 1] 
-        jmp("​bitloop"​) ​         .side(1) ​   [T2 - 1] 
-        label("​do_zero"​) 
-        nop()                   ​.side(0) ​   [T2 - 1] 
-        wrap() 
- 
-    #使用 ws2812 程序创建状态机,输出到 Pin(22)上。 
-    sm = rp2.StateMachine(0,​ ws2812, freq=8_000_000,​ sideset_base=Pin(18)) 
- 
-    # 启动状态机,它将等待其FIFO上的数据。 
-    sm.active(1) 
- 
-    # 通过一系列 LED RGB 值在 LED 上显示图案。 
-    ar = array.array("​I",​ [0 for _ in range(NUM_LEDS)]) 
- 
-    while True: 
-        Analogvalue=A0.read_u16()#​读取ADC值 
-        voltage=3.3*float(Analogvalue)/​65535#​将ADC值转换为电压值 
-        status=D0.value() 
-        oled.fill(0) 
-        oled.show()#​oled清屏 
-        if(status==1):#​报警状态 
-            pwm0.freq(7000) 
-            pwm0.duty_u16(500)#​使蜂鸣器响起 
-            print('​Warn!!!'​) 
-            oled.text("​Warn!!!",​35,​20) 
-            oled.show() 
-            for j in range(NUM_LEDS):​ 
-                ar[j]=3840 
-            sm.put(ar, 8) 
-            time.sleep(0.4) 
-            for j in range(NUM_LEDS):​ 
-                ar[j]=0 
-            sm.put(ar, 8) 
-            time.sleep(0.4) 
-        else:#​正常状态 
-            pwm0.deinit() 
-            print('​Normal'​) 
-            oled.text("​Normal",​35,​20) 
-            oled.show() 
-            for j in range(NUM_LEDS):​ 
-                ar[j]=983040 
-            sm.put(ar, 8) 
-        time.sleep(1) 
- 
- 
- 
  
 ### 4. 电阻温度计 ### 4. 电阻温度计
行 209: 行 56:
  
 电阻温度计(Resistance Temperature Detector,RTD)利用电阻温度系数的特性来测量温度。它使用一种电阻材料(通常是铂)作为敏感元件,随着温度的变化,电阻值相应地发生变化。其电阻值随温度的变化呈现线性关系。根据电阻与温度之间的关系,可以确定与温度相关的值。 电阻温度计(Resistance Temperature Detector,RTD)利用电阻温度系数的特性来测量温度。它使用一种电阻材料(通常是铂)作为敏感元件,随着温度的变化,电阻值相应地发生变化。其电阻值随温度的变化呈现线性关系。根据电阻与温度之间的关系,可以确定与温度相关的值。
 +
 +{{ :​rtdwork.jpg?​600 |}}{{ :​rtd.png?​600 |}}
  
 ####​种类: ####​种类:
行 243: 行 92:
  
 热电偶温度传感器利用热电效应来测量温度。它由两种不同金属导线(通常是铂和铂铑合金)焊接在一起形成的热电接点。当热电偶的一端暴露在被测温度下时,产生的温差会在两个接点之间形成电动势。这个电动势与接点温度差以及导线材料的热电系数有关。通过测量热电偶产生的电动势,可以确定与温度相关的值。 热电偶温度传感器利用热电效应来测量温度。它由两种不同金属导线(通常是铂和铂铑合金)焊接在一起形成的热电接点。当热电偶的一端暴露在被测温度下时,产生的温差会在两个接点之间形成电动势。这个电动势与接点温度差以及导线材料的热电系数有关。通过测量热电偶产生的电动势,可以确定与温度相关的值。
 +
 +{{ :​reou.jpg?​600 |}}
  
 ####​种类: ####​种类:
行 290: 行 141:
  
 红外温度传感器基于物体的热辐射特性。物体在一定温度下会发出红外辐射,传感器通过红外线传感器接收物体发出的红外辐射能量,并将其转换为与物体表面温度相关的电信号。这个转换过程利用了热电效应或红外吸收的原理。 红外温度传感器基于物体的热辐射特性。物体在一定温度下会发出红外辐射,传感器通过红外线传感器接收物体发出的红外辐射能量,并将其转换为与物体表面温度相关的电信号。这个转换过程利用了热电效应或红外吸收的原理。
 +
 +{{ :​hongwai.png?​600 |}}
  
 ####​种类: ####​种类:
行 326: 行 179:
  
 需要考虑环境因素:大气湿度、粉尘、烟雾等环境因素可能对测量结果产生影响,需要适当的补偿和防护措施。 需要考虑环境因素:大气湿度、粉尘、烟雾等环境因素可能对测量结果产生影响,需要适当的补偿和防护措施。
- 
-####​使用案例: 
- 
-**火焰红外传感器KY-026** 
- 
-KY-026火焰传感器模块可检测火灾发出的红外光。该模块具有数字和模拟输出以及用于调节灵敏度的电位计。常用于火灾探测系统。注:该模块只可监测火焰的红外光,不能测出准确的温度值 
- 
-{{ :​ky-026.jpg?​300 |}} 
- 
-{{:​ky-026.mp4|}} 
- 
-使用KY-026来监测火灾的发生,调节模块上的可变电阻器使其在正常环境下报警输出引脚输出为低电平,将传感器连接到树莓派拓展板上。 
- 
-树莓派——-KY-028 
- 
-3.3——+ 
- 
-GND——G 
- 
-DO——-GPIO20 
- 
-A0——-GPIO26(ADC0) 
- 
-当温度正常时RGB灯为常绿,oled显示屏显示Normal 
- 
-当温度升高时发出报警信息RGB灯变为红色闪烁,oled显示屏显示Fire!!!,同时蜂鸣器响起 
- 
-    from machine import Pin,ADC,PWM 
-    from oled import oled 
-    from ssd1306 import SSD1306_SPI 
-    from board import pin_cfg 
-    import framebuf 
-    import array 
-    import rp2 
-    import time 
-    import math 
- 
-    D0 = Pin(20,​Pin.IN) 
-    A0 = ADC(0) 
-    pwm0 = PWM(Pin(19)) ​     # 从引脚创建 PWM 对象 
-    pwm0.freq(7000) ​        # 设置频率 
-    pwm0.duty_u16(500) ​     # 设置占空比,​ 范围 0-65535 
- 
-    status=1 
-    temp=1 
- 
-    NUM_LEDS = 12 
- 
-    #​设置pio工作模式 
-    @rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW,​ out_shiftdir=rp2.PIO.SHIFT_LEFT,​ autopull=True,​ pull_thresh=24) 
- 
- 
-    def ws2812(): 
-        T1 = 2 
-        T2 = 5 
-        T3 = 3 
-        wrap_target() 
-        label("​bitloop"​) 
-        out(x, 1)               ​.side(0) ​   [T3 - 1] 
-        jmp(not_x, "​do_zero"​) ​  ​.side(1) ​   [T1 - 1] 
-        jmp("​bitloop"​) ​         .side(1) ​   [T2 - 1] 
-        label("​do_zero"​) 
-        nop()                   ​.side(0) ​   [T2 - 1] 
-        wrap() 
- 
-    #使用 ws2812 程序创建状态机,输出到 Pin(22)上。 
-    sm = rp2.StateMachine(0,​ ws2812, freq=8_000_000,​ sideset_base=Pin(18)) 
- 
-    # 启动状态机,它将等待其FIFO上的数据。 
-    sm.active(1) 
- 
-    # 通过一系列 LED RGB 值在 LED 上显示图案。 
-    ar = array.array("​I",​ [0 for _ in range(NUM_LEDS)]) 
- 
-    while True: 
-        Analogvalue=A0.read_u16()#​读取ADC值 
-        voltage=3.3*float(Analogvalue)/​65535#​将ADC值转换为电压值 
-        status=D0.value() 
-        oled.fill(0) 
-        oled.show()#​oled清屏 
-        if(status==1):#​报警状态 
-            pwm0.freq(7000) 
-            pwm0.duty_u16(500)#​使蜂鸣器响起 
-            print('​Fire!!!'​) 
-            oled.text("​Fire!!!",​35,​20) 
-            oled.show() 
-            for j in range(NUM_LEDS):​ 
-                ar[j]=3840 
-            sm.put(ar, 8) 
-            time.sleep(0.4) 
-            for j in range(NUM_LEDS):​ 
-                ar[j]=0 
-            sm.put(ar, 8) 
-            time.sleep(0.4) 
-        else:#​正常状态 
-            pwm0.deinit() 
-            print('​Normal'​) 
-            oled.text("​Normal",​35,​20) 
-            oled.show() 
-            for j in range(NUM_LEDS):​ 
-                ar[j]=983040 
-            sm.put(ar, 8) 
-        time.sleep(1) 
- 
- 
- 
  
 ### 7. 半导体温度传感器 ### 7. 半导体温度传感器
行 438: 行 185:
  
 半导体温度传感器是利用半导体材料的电特性随温度变化而变化来测量温度的传感器。它使用半导体材料中的温度相关的电阻、电压或电流来确定温度值。根据具体的设计,半导体温度传感器可以利用PN结、热敏电阻效应、反向热电效应等原理工作。 半导体温度传感器是利用半导体材料的电特性随温度变化而变化来测量温度的传感器。它使用半导体材料中的温度相关的电阻、电压或电流来确定温度值。根据具体的设计,半导体温度传感器可以利用PN结、热敏电阻效应、反向热电效应等原理工作。
 +
 +{{ :​bandaoti.png?​600 |}}
  
 ####​种类: ####​种类:
行 470: 行 219:
  
 测量范围相对较窄,不能适用于极高温度和极低温度的测量。 测量范围相对较窄,不能适用于极高温度和极低温度的测量。
- 
-####​使用案例: 
- 
-{{ :​pico.jpg?​600 |}} 
- 
-使用RP2040驱动DS18B20的示例 
- 
-    import machine 
-    import onewire 
-    import ds18x20 
-    import time 
- 
-    # 定义连接到DS18B20数据线的引脚 
-    data_pin = machine.Pin(2) 
- 
-    # 创建单总线类 
-    ow = onewire.OneWire(data_pin) 
- 
-    # 创建DS18B20类 
-    temp_sensor = ds18x20.DS18X20(ow) 
- 
-    # 扫描OneWire总线上的DS18B20器件 
-    devices = temp_sensor.scan() 
- 
-    if len(devices) == 0: 
-        print("​No DS18B20 devices found"​) 
-    else: 
-        print("​Found",​ len(devices),​ "​DS18B20 device(s)"​) 
-        print("​Device addresses:",​ devices) 
- 
-    while True: 
-        # 执行温度转换和读取温度 
-        temp_sensor.convert_temp() 
-        time.sleep_ms(750) ​ # 等待转换完成 
- 
-        for device in devices: 
-            temperature = temp_sensor.read_temp(device) 
-            print("​Temperature:",​ temperature,​ "​°C"​) 
- 
-        time.sleep(1) ​ # 等待 1 秒,然后进行下一次读数 
  
 ### 8. 如何应用温度传感器 ### 8. 如何应用温度传感器
行 533: 行 242:
 1.[[https://​www.honeywell.com/​cn/​zh-cn|honeywell]] (霍尼韦尔国际公司) 1.[[https://​www.honeywell.com/​cn/​zh-cn|honeywell]] (霍尼韦尔国际公司)
  
-2.[[https://​www.te.com/​chn-zh/​home.html|外部链接]] (泰科电子有限公司)+2.[[https://​www.te.com/​chn-zh/​home.html|泰科]] (泰科电子有限公司)
  
-3.[[https://​www.ti.com/​cn/​|外部链接]] (德州仪器公司)+3.[[https://​www.ti.com/​cn/​|TI]] (德州仪器公司)
  
-4.[[https://​www.st.com/​content/​st_com/​zh.html|外部链接]] (意法半导体有限公司)+4.[[https://​www.st.com/​content/​st_com/​zh.html|ST]] (意法半导体有限公司)
  
-5.[[https://​www.omron.com.cn/​|外部链接]] (欧姆龙公司)+5.[[https://​www.omron.com.cn/​|OMRON]] (欧姆龙公司)
  
-6.[[https://​www.panasonic.com/​cn/​|外部链接]] (松下电器产业株式会社)+6.[[https://​www.panasonic.com/​cn/​|Panasonic]] (松下电器产业株式会社)
  
-7.[[ https://​www.amphenol.com/​|外部链接]] (安费诺集团)+7.[[ https://​www.amphenol.com/​|Amphenol]] (安费诺集团)
  
-8.[[https://​www.nxp.com/​|外部链接]] (恩智浦半导体有限公司)+8.[[https://​www.nxp.com/​|NXP]] (恩智浦半导体有限公司)
  
-9.[[https://​www.sensirion.com/​cn/​|外部链接]] (Sensirion公司)+9.[[https://​www.sensirion.com/​cn/​|Sensirion]] (Sensirion公司)
  
-10.[[https://​www.maximintegrated.com/​|外部链接]] (美信集成产品公司)+10.[[https://​www.maximintegrated.com/​|Maxim]] (美信集成产品公司)
  
-11.[[https://​www.analog.com/​cn/​index.html|外部链接]] (安纳洛格设备公司)+11.[[https://​www.analog.com/​cn/​index.html|ANLOK]] (安纳洛格设备公司)
  
-12.[[https://​www.microchip.com/​zh/​|外部链接]] (微芯科技公司)+12.[[https://​www.microchip.com/​zh/​|Microship]] (微芯科技公司)
  
-13.[[https://​www.siemens.com/​cn/​zh/​home.html|外部链接]] (西门子公司)+13.[[https://​www.siemens.com/​cn/​zh/​home.html|Siemens]] (西门子公司)
  
-14.[[https://​www.emerson.com/​cn-zh|外部链接]] (艾默生电气公司)+14.[[https://​www.emerson.com/​cn-zh|Emerson]] (艾默生电气公司)
  
 ### 10. 常用的温度传感器介绍 ### 10. 常用的温度传感器介绍
行 756: 行 465:
 ### 11. 参考使用案例 ### 11. 参考使用案例
  
 +**NTC热敏电阻转化为温度值**
  
 +NTC热敏电阻温度计算方法,B值法
  
 +{{ :​bzhi.jpg?​300 |}}
  
 +这里T1和T2指的是K度即开尔文温度,K度=273.15(绝对温度)+摄氏度;其中T2=(273.15+25)[通常都是用25℃]
 +
 +R1是热敏电阻在T1温度下的阻值;
 +
 +R2是热敏电阻在T2温度下的标称阻值,​T2一般是常温25℃
 +
 +B值是热敏电阻的重要参数(参考具体型号热敏电阻datasheet)
 +
 +exp是e的n次方;
 +
 +NTC热敏电阻随环境温度(T)升高,电阻值(R)会下降,反之,当温度(T)下降,电阻值(R)会上升。其对温度感应非常灵敏,NTC热敏电阻电路相对简单,价格低廉,组件精确,可以轻松获取项目的温度数据,因此广泛应用于各种温度的感测与补偿中。
 +
 +常规NTC热敏电阻参数:温度为(R25℃)时,阻值为10kΩ,B值(25/​85)为3435。温度为(R25℃)时,阻值为100kΩ,B值(25/​50)为3950
 +
 +转换代码如下:
 +
 +    from machine import Pin,ADC
 +    import time
 +    import math
 +
 +    A0 = ADC(0)
 +
 +    temp=1
 +    temp1=1
 +
 +    while True:
 +        Analogvalue=A0.read_u16()
 +        print("​Analogvalue=",​Analogvalue)
 +        voltage=3.32*float(Analogvalue)/​65535
 +        print("​voltage=",​voltage)
 +        Rt=10000*voltage/​(3.32-voltage)
 +        print("​Rt=",​Rt)
 +
 +        temp=1/​(((math.log(Rt/​10000))/​3950)+(1/​(273.15+25)))
 +        temp=temp-273.15
 +        print('​temperature=',​temp,'​c'​)
 +        if(temp>​34):​
 +            print('​hot'​)
 +        else:
 +            print('​cold'​)
 +        time.sleep(1)
 +
 +
 +
 +
 +**NTC热敏电阻模拟温度传感器模块:KY-028**
 +
 +KY-028数字温度传感器根据热敏电阻测量温度变化。该模块具有数字和模拟输出,有一个电位计用于调整数字接口上的检测阈值。注:该模块不能精准的测量温度,只能测量温度相对变化,可做固定环境下的温度报警器使用。
 +
 +{{ :​ky-028.jpg?​300 |}}
 +
 +{{:​ky_028.mp4|}}
 +
 +使用KY-028来监测温度变化,调节模块上的可变电阻器使其在正常环境下报警输出引脚输出为低电平,将传感器连接到树莓派拓展板上。
 +
 +树莓派-------KY-028
 +
 +3.3------+
 +
 +GND------G
 +
 +DO-------GPIO20
 +
 +A0-------GPIO26(ADC0)
 +
 +当温度正常时RGB灯为常绿,oled显示屏显示Normal
 +
 +当温度升高时发出报警信息RGB灯变为红色闪烁,oled显示屏显示Warn!!!,同时蜂鸣器响起
 +
 +    from machine import Pin,ADC,PWM
 +    from oled import oled
 +    from ssd1306 import SSD1306_SPI
 +    from board import pin_cfg
 +    import framebuf
 +    import array
 +    import rp2
 +    import time
 +    import math
 +
 +    D0 = Pin(20,​Pin.IN)
 +    A0 = ADC(0)
 +    pwm0 = PWM(Pin(19)) ​     # 从引脚创建 PWM 对象
 +    pwm0.freq(7000) ​        # 设置频率
 +    pwm0.duty_u16(500) ​     # 设置占空比,​ 范围 0-65535
 +
 +    status=1
 +    temp=1
 +
 +    NUM_LEDS = 12
 +
 +    #​设置pio工作模式
 +    @rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW,​ out_shiftdir=rp2.PIO.SHIFT_LEFT,​ autopull=True,​ pull_thresh=24)
 +
 +
 +    def ws2812():
 +        T1 = 2
 +        T2 = 5
 +        T3 = 3
 +        wrap_target()
 +        label("​bitloop"​)
 +        out(x, 1)               ​.side(0) ​   [T3 - 1]
 +        jmp(not_x, "​do_zero"​) ​  ​.side(1) ​   [T1 - 1]
 +        jmp("​bitloop"​) ​         .side(1) ​   [T2 - 1]
 +        label("​do_zero"​)
 +        nop()                   ​.side(0) ​   [T2 - 1]
 +        wrap()
 +
 +    #使用 ws2812 程序创建状态机,输出到 Pin(22)上。
 +    sm = rp2.StateMachine(0,​ ws2812, freq=8_000_000,​ sideset_base=Pin(18))
 +
 +    # 启动状态机,它将等待其FIFO上的数据。
 +    sm.active(1)
 +
 +    # 通过一系列 LED RGB 值在 LED 上显示图案。
 +    ar = array.array("​I",​ [0 for _ in range(NUM_LEDS)])
 +
 +    while True:
 +        Analogvalue=A0.read_u16()#​读取ADC值
 +        voltage=3.3*float(Analogvalue)/​65535#​将ADC值转换为电压值
 +        status=D0.value()
 +        oled.fill(0)
 +        oled.show()#​oled清屏
 +        if(status==1):#​报警状态
 +            pwm0.freq(7000)
 +            pwm0.duty_u16(500)#​使蜂鸣器响起
 +            print('​Warn!!!'​)
 +            oled.text("​Warn!!!",​35,​20)
 +            oled.show()
 +            for j in range(NUM_LEDS):​
 +                ar[j]=3840
 +            sm.put(ar, 8)
 +            time.sleep(0.4)
 +            for j in range(NUM_LEDS):​
 +                ar[j]=0
 +            sm.put(ar, 8)
 +            time.sleep(0.4)
 +        else:#​正常状态
 +            pwm0.deinit()
 +            print('​Normal'​)
 +            oled.text("​Normal",​35,​20)
 +            oled.show()
 +            for j in range(NUM_LEDS):​
 +                ar[j]=983040
 +            sm.put(ar, 8)
 +        time.sleep(1)
 +
 +**火焰红外传感器KY-026**
 +
 +KY-026火焰传感器模块可检测火灾发出的红外光。该模块具有数字和模拟输出以及用于调节灵敏度的电位计。常用于火灾探测系统。注:该模块只可监测火焰的红外光,不能测出准确的温度值
 +
 +{{ :​ky-026.jpg?​300 |}}
 +
 +{{:​ky-026.mp4|}}
 +
 +使用KY-026来监测火灾的发生,调节模块上的可变电阻器使其在正常环境下报警输出引脚输出为低电平,将传感器连接到树莓派拓展板上。
 +
 +树莓派——-KY-028
 +
 +3.3——+
 +
 +GND——G
 +
 +DO——-GPIO20
 +
 +A0——-GPIO26(ADC0)
 +
 +当温度正常时RGB灯为常绿,oled显示屏显示Normal
 +
 +当温度升高时发出报警信息RGB灯变为红色闪烁,oled显示屏显示Fire!!!,同时蜂鸣器响起
 +
 +    from machine import Pin,ADC,PWM
 +    from oled import oled
 +    from ssd1306 import SSD1306_SPI
 +    from board import pin_cfg
 +    import framebuf
 +    import array
 +    import rp2
 +    import time
 +    import math
 +
 +    D0 = Pin(20,​Pin.IN)
 +    A0 = ADC(0)
 +    pwm0 = PWM(Pin(19)) ​     # 从引脚创建 PWM 对象
 +    pwm0.freq(7000) ​        # 设置频率
 +    pwm0.duty_u16(500) ​     # 设置占空比,​ 范围 0-65535
 +
 +    status=1
 +    temp=1
 +
 +    NUM_LEDS = 12
 +
 +    #​设置pio工作模式
 +    @rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW,​ out_shiftdir=rp2.PIO.SHIFT_LEFT,​ autopull=True,​ pull_thresh=24)
 +
 +
 +    def ws2812():
 +        T1 = 2
 +        T2 = 5
 +        T3 = 3
 +        wrap_target()
 +        label("​bitloop"​)
 +        out(x, 1)               ​.side(0) ​   [T3 - 1]
 +        jmp(not_x, "​do_zero"​) ​  ​.side(1) ​   [T1 - 1]
 +        jmp("​bitloop"​) ​         .side(1) ​   [T2 - 1]
 +        label("​do_zero"​)
 +        nop()                   ​.side(0) ​   [T2 - 1]
 +        wrap()
 +
 +    #使用 ws2812 程序创建状态机,输出到 Pin(22)上。
 +    sm = rp2.StateMachine(0,​ ws2812, freq=8_000_000,​ sideset_base=Pin(18))
 +
 +    # 启动状态机,它将等待其FIFO上的数据。
 +    sm.active(1)
 +
 +    # 通过一系列 LED RGB 值在 LED 上显示图案。
 +    ar = array.array("​I",​ [0 for _ in range(NUM_LEDS)])
 +
 +    while True:
 +        Analogvalue=A0.read_u16()#​读取ADC值
 +        voltage=3.3*float(Analogvalue)/​65535#​将ADC值转换为电压值
 +        status=D0.value()
 +        oled.fill(0)
 +        oled.show()#​oled清屏
 +        if(status==1):#​报警状态
 +            pwm0.freq(7000)
 +            pwm0.duty_u16(500)#​使蜂鸣器响起
 +            print('​Fire!!!'​)
 +            oled.text("​Fire!!!",​35,​20)
 +            oled.show()
 +            for j in range(NUM_LEDS):​
 +                ar[j]=3840
 +            sm.put(ar, 8)
 +            time.sleep(0.4)
 +            for j in range(NUM_LEDS):​
 +                ar[j]=0
 +            sm.put(ar, 8)
 +            time.sleep(0.4)
 +        else:#​正常状态
 +            pwm0.deinit()
 +            print('​Normal'​)
 +            oled.text("​Normal",​35,​20)
 +            oled.show()
 +            for j in range(NUM_LEDS):​
 +                ar[j]=983040
 +            sm.put(ar, 8)
 +        time.sleep(1)
 +
 +**半导体温度传感器DS18B20**
 +
 +{{ :​pico.jpg?​600 |}}
 +
 +使用RP2040驱动DS18B20的示例
 +
 +    import machine
 +    import onewire
 +    import ds18x20
 +    import time
 +
 +    # 定义连接到DS18B20数据线的引脚
 +    data_pin = machine.Pin(2)
 +
 +    # 创建单总线类
 +    ow = onewire.OneWire(data_pin)
 +
 +    # 创建DS18B20类
 +    temp_sensor = ds18x20.DS18X20(ow)
 +
 +    # 扫描OneWire总线上的DS18B20器件
 +    devices = temp_sensor.scan()
 +
 +    if len(devices) == 0:
 +        print("​No DS18B20 devices found"​)
 +    else:
 +        print("​Found",​ len(devices),​ "​DS18B20 device(s)"​)
 +        print("​Device addresses:",​ devices)
 +
 +    while True:
 +        # 执行温度转换和读取温度
 +        temp_sensor.convert_temp()
 +        time.sleep_ms(750) ​ # 等待转换完成
 +
 +        for device in devices:
 +            temperature = temp_sensor.read_temp(device)
 +            print("​Temperature:",​ temperature,​ "​°C"​)
 +
 +        time.sleep(1) ​ # 等待 1 秒,然后进行下一次读数
 +
 +**数字温度传感器TCN75A**
 +
 +TCN75AVUA是一种温度传感器芯片其测温物理原理基于热敏电阻原理。
 +
 +在TCN75AVUA芯片中,使用了一种称为负温度系数(NTC)的热敏电阻。
 +
 +NTC热敏电阻的电阻值随温度升高而下降,而在温度下降时电阻值则上升。
 +
 +该芯片中的热敏电阻与温度敏感元件组成一个温度敏感电路。
 +
 +在特定的温度下,电路会产生一个电压,该电压与温度成比例。
 +
 +芯片内部的模拟电路和ADC将该电压转换为相应的数字值,这个数字值就代表测量到的温度。
 +
 +由芯片TCN75A设计了一款数字温度传感器,该传感器使用I2C通信,可直接读取温度。
 +
 +{{ :​20230801163603.jpg?​600 |}}
 +
 +{{ :​20230728165827.jpg?​600 |}}
 +
 +    from machine import I2C,Pin
 +    import math
 +    import time
 +
 +    # I2C 地址
 +    TCN75A = 0x48
 +
 +    #​I2C设备内部寄存器
 +    TA = 0x00#​温度寄存器地址
 +    CONFIG = 0x01#​配置寄存器地址
 +    THYST = 0x02#​温度报警下限地址
 +    TSET = 0x03#​温度报警上限地址
 +
 +    #​常用参数
 +    Temp_9bit = 0x00#​设置温度精度为0.5 C
 +    Temp_10bit = 0x20#​设置温度精度为0.25 C
 +    Temp_11bit = 0x40#​设置温度精度为0.125 C
 +    Temp_12bit = 0x60#​设置温度精度为0.0625 C
 +    Comparator = 0x00#​设置报警输出为比较器模式
 +    Interrupt = 0x02#​设置报警输出为中断模式
 +    Alert_high = 0x04#​设置报警输出为高
 +    Alert_low = 0x00#​设置报警输出为低
 +
 +
 +    code=0
 +    temp=0
 +    #​初始化I2C
 +    i2c = I2C(id=0,​scl=Pin(21),​sda=Pin(20),​freq=50_000)
 +
 +    #​向指定寄存器写入数据
 +    def reg_write(i2c,​ addr, reg, data):
 +        # Construct message
 +        msg = bytearray()
 +        msg.append(data)
 +
 +        i2c.writeto_mem(addr,​ reg, msg)
 +
 +    #​从指定寄存器中读取指定字节的数据
 +    def reg_read(i2c,​ addr, reg, nbytes):
 +
 +        data = i2c.readfrom_mem(addr,​ reg, nbytes)
 +        return data
 +
 +    #​读取总线上挂载的I2C设备并返回其地址
 +    addr_list = i2c.scan()
 +    print(addr_list)
 +
 +    reg_write(i2c,​TCN75A,​TA,​Temp_12bit)#​设置温度精度
 +
 +    while True:
 +        code=reg_read(i2c,​TCN75A,​TA,​ 2)
 +        temp=code[0]+code[1]*0.00390625#​将接收到的数据转换为温度
 +        print("​Temperature = "​+str(temp)+"​ C")
 +        time.sleep(1)