红外测温模块 :LU90614

红外温度传感器

AD\Test\2024\April\TestLU90614.PcbDoc

D:\zhuoqing\window\ARM\Keil\STM32\Test\2024\April\TestUL90164F103\Core\Src\main.c

 

01 外测温


  到一个红外测温模块, 型号为 LU90614 。 可以非接触测量 100摄氏度范围内物体温度。  网络购买的模块刚刚到货了。  下面对于它的性能进行测试一下。

GM1711953751_1920_1080.MP4|_-3

一、模块特性

  在测温模块正面有测温传感器以及处理芯片。  在上面有两个小芯片。  其中一个显示未 HK 02C2, 对应型号为 HK24C02, 这是一颗 2k bit 的 EEPROM。  另外一个丝印文字为 HT33 , 是一颗 3.3V 的稳压芯片。   对于 TSOP48封装的芯片, 表面没有任何丝印文字信息。 不知道是什么 芯片。   主要的测温组件, 是一个空心金属圆柱体。  对于它的原理, 现在我还不是太清楚。

GM1711954631_1920_1080.MP4|_-8

▲ 图1.1.1 LU90614接口定义

▲ 图1.1.1 LU90614接口定义

二、测试电路

  测温模块通过串口输出测量数据,  设计一个单片机,  通过串口读取测温数据,  使用 OLED 显示温度,  并通过 USB和上位机进行通讯。   设计单面PCB, 适合一分钟制版。

GM1711968664_1920_1080.MP4|_-6

▲ 图1.2.1 测试电路原理图

▲ 图1.2.1 测试电路原理图

AD\Test\2024\April\TestLU90614.SchDoc

▲ 图1.2.2 测试电路PCB

▲ 图1.2.2 测试电路PCB

  一分钟之后, 获得测试电路板,  制作的非常完美。  下面使用上午刚刚到货的镀锡液,  给电路板镀锡。  一分钟之后取出电路板, 可以看到它的表面已经均匀镀上一层锡。  线路表面呈现均匀的银色。 下面焊接电路。

GM1711969209_1920_1080.MP4|_-7

三、焊接调试

  焊接电路板,  对其进行清洗。  使用了超声震动器辅助芯片对正。 电路板上包括七个飞线, 利用 0 欧姆进行飞线。

GM1711972371_1920_1080.MP4|_-4
  通过探针夹子连接ST-LINK。 下载测试软件, 可以看到单片机已经可以正常运行了。 接下来编写传感器读取程序。

GM1711972816_1920_1080.MP4|_-2
  移植 OLED 程序, 用于显示测量温度数值。  将测温模块插在电路板上。 它通过 UART2 与 F103单片机相连。  下面, 按照模块的通讯协议读取温度值。

GM1711973354_1920_1080.MP4|_-3

四、读取温度

  在 OLED 上显示测量的结果。 令人感到奇怪的是 , 显示的数据不太稳定。  利用数据的校验位, 将错误的数据丢掉之后, 可以看到数据就比较稳定了。
GM1711975943_1920_1080.MP4|_-2

▲ 图1.4.1  读取的温度

▲ 图1.4.1 读取的温度

  下面看一下, 读取温度的数值, 总觉的有点奇怪。  比如刚才黑色的热缩管, 输出的温度很高。  而使用手指, 则立即恢复到 36摄氏度。  那么这个传感器究竟应该读取什么样的物体表面呢?  这应该是传感器读取体温和物体温度功能不一样。

GM1711976891_1920_1080.MP4|_-5

  下面, 通过发送测量物体温度命令之后, 可以看到, 此时测量温度数据就比较正常了。 可以传感器在测量体温和物体温度的功能是不一样。 使用热风枪加热热缩管, 测量温度达到了 90 多度。  现在环境温度为 27.3 度。  和热电偶温度计读取的数值基本相同。  这儿也验证了该传感器的数值是在合理的范围之内。  手拿着温度传感器测量 LED 灯罩的温度。 可以达到 48 摄氏度。

GM1711977288_1920_1080.MP4|_-5

 

  结 ※


  文测试了红外温度传感器。  通过串口可以读取测量的数值。  测量得到的数值在室温下比较合理。

GM1711977392_1920_1080.MP4|_-3

通讯协议

    //--------------------------------------------------------------------------
    if(USBCDC_CANRECE) {
        unsigned char ucChar;
        USBCDCReceChar(&ucChar);
        printf("%02x ", ucChar);
        
        if(ucChar == 0x55) {
        
            nUSBFlag = 1;            
            
        }
        else if(ucChar == 0x0) {
            g_nTempFlag = 0;
            SetBodyTemp();
            nUSBFlag = 1;            
        } else if(ucChar == 0x1) {
            g_nTempFlag = 1;
            SetObjectTemp();
            nUSBFlag = 1;            
        }
        
    }
    
    
    //--------------------------------------------------------------------------
    if(++nShowCount > 20) {
        nShowCount = 0;
        
        nMeasure ++;
        char szString[32];
        int i, nNumber;
        nNumber = nMeasure % 0xf;
        for(i = 0; i < 16; i ++) {
            if(i <= nNumber) szString[i] = '*';
            else szString[i] = ' ';
        }
        
        szString[16] = 0;
        LCD_Print(0, 2, szString);
        
                
        float fTemp = ReadTemp();
        
        if(fTemp == 0) {
            fTemp = ReadTemp();
            if(fTemp == 0) fTemp = ReadTemp();
        }
        
        nNumber = (int)(fTemp * 100);
        
        
        if(g_nTempFlag == 0) {
            sprintf(szString, "Body  :%6.2f", fTemp);
        } else sprintf(szString, "Object:%6.2f", fTemp);
        
        LCD_Print(0, 4, szString);

        if(nUSBFlag != 0 ) {
            int i;
            unsigned char ucDim[4];
            
            for(i = 0; i < 4; i ++) {
                ucDim[3 - i] = (unsigned char)(nNumber & 0xff);
                nNumber >>= 8;
            }
            
            ucDim[0] = (unsigned char) g_nTempFlag;
            
            for(i = 0; i < 4; i ++) {
                printf("%02x ", ucDim[i]);
                USBCDCSendChar(ucDim[i]);
            }
            
            nUSBFlag = 0;
        }

        
    }
    
    //--------------------------------------------------------------------------
    if(VAL(BTN_PIN) == 0) {
        WaitTime(25);
        if(VAL(BTN_PIN) == 0) {
            for(;;) {
                if(VAL(BTN_PIN) != 0) break;
            }
            
            WaitTime(25);
            if(g_nTempFlag == 0) {
                g_nTempFlag = 1;
                SetObjectTemp();
            } else {
                g_nTempFlag = 0;
                SetBodyTemp();
            }
        }
    }


■ 相关文献链接:

● 相关图表链接:

以下是基于51单片机,使用Lu90614红外传感器,LCD1602显示屏和蜂鸣器的报警代码示例: ```C #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit beep = P2^3; // 蜂鸣器控制引脚 sbit RS = P0^0; // LCD1602命令/数据选择引脚 sbit RW = P0^1; // LCD1602读/写选择引脚 sbit EN = P0^2; // LCD1602使能引脚 sbit temp = P3^7; // 红外传感器数据引脚 void delay(uint z); // 延时函数声明 void Init_Lcd1602(); // LCD1602初始化函数声明 void LcdWriteCom(uchar com); // LCD1602写命令函数声明 void LcdWriteData(uchar dat); // LCD1602写数据函数声明 void LcdShowStr(uchar x,uchar y,uchar *str); // LCD1602显示字符串函数声明 void main() { uchar str1[]=" FIRE!"; // 显示的报警信息 uchar str2[]=" WARNING!"; uchar str3[]="No Fire."; uchar flag = 0; // 报警标志位,0表示无报警,1表示有报警 Init_Lcd1602(); // 初始化LCD1602 LcdShowStr(0,0,str3); // 初始化显示"NO FIRE." while(1) { if(temp == 0) // 如果红外传感器探测到火焰 { if(flag == 0) // 如果之前无报警 { flag = 1; // 设置报警标志位 beep = 1; // 开启蜂鸣器 LcdWriteCom(0x01); // 清屏 LcdShowStr(0,0,str1); // 显示报警信息 LcdShowStr(0,1,str2); } } else // 如果红外传感器未探测到火焰 { if(flag == 1) // 如果之前有报警 { flag = 0; // 清除报警标志位 beep = 0; // 关闭蜂鸣器 LcdWriteCom(0x01); // 清屏 LcdShowStr(0,0,str3); // 显示"NO FIRE." } } } } void delay(uint z) // 延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void Init_Lcd1602() // LCD1602初始化函数 { LcdWriteCom(0x38); // 显示模式设置,8位数据总线,2行显示,5*7点阵字符 LcdWriteCom(0x0c); // 显示开关控制,显示开,光标关,光标闪烁关 LcdWriteCom(0x06); // 光标/显示移位,光标右移,字符不移动 LcdWriteCom(0x01); // 清屏,光标回到起始位置 } void LcdWriteCom(uchar com) // LCD1602写命令函数 { RS = 0; // 命令模式 RW = 0; // 写入模式 P2 = com; // 写入数据 EN = 1; // 使能 _nop_(); // 空操作 EN = 0; // 禁能 delay(1); // 延时 } void LcdWriteData(uchar dat) // LCD1602写数据函数 { RS = 1; // 数据模式 RW = 0; // 写入模式 P2 = dat; // 写入数据 EN = 1; // 使能 _nop_(); // 空操作 EN = 0; // 禁能 delay(1); // 延时 } void LcdShowStr(uchar x,uchar y,uchar *str) // LCD1602显示字符串函数 { uchar i=0; if(y==0) LcdWriteCom(0x80+x); // 第1行 else if(y==1) LcdWriteCom(0xc0+x); // 第2行 while(str[i] != '\0') // 循环显示字符串 { LcdWriteData(str[i]); i++; } } ``` 在上述代码中,红外传感器数据引脚接在P3.7上,蜂鸣器控制引脚接在P2.3上,LCD1602显示屏的命令/数据选择引脚、读/写选择引脚和使能引脚分别接在P0.0、P0.1和P0.2上。在主函数中,程序会不断检测红外传感器的状态,如果探测到火焰,就会开启蜂鸣器并显示报警信息到LCD1602上,如果未探测到火焰,则关闭蜂鸣器并显示"NO FIRE."。需要注意的是,本示例中的报警信息和警告信息都是静态的,实际应用中可以根据具体需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值