红外温度传感器

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();
            }
        }
    }


■ 相关文献链接:

● 相关图表链接:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐