939|2

40

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【安信可BW16-Kit开发板】非接触式温度传感器D6T传感器接入测试 [复制链接]

本帖最后由 hollyedward 于 2024-3-8 13:55 编辑

一、传感器介绍

        D6T MEMS非接触温度传感器

        主要特点:高精度,定向扫描,红外传感

        一些应用场景:室内测温,人体感应检测(热释电),异常高温检测等等

        官方网站:MEMS非接触温度传感器 D6T | OMRON电子部品网站 - China

        

 

        欧姆龙D6T系列温度传感器,采用MEMS技术和ASIC芯片,精度高、灵敏度高、响应速度快,可用于工业、医疗、家用电器等领域。在工业领域,可用于生产线温度监测,确保产品质量;在医疗领域,可用于体温测量,提高医疗效率;在家用电器领域,可用于空调、冰箱等电器的温度控制,提升用户体验。D6T系列产品有多种型号,可根据不同应用需求进行选择。

       

 

       一些传传感器原理图,最终可以通过MCU控制单元的I2C总线读取数据

       

 

       测温范围

       我使用的这款传感器的具体型号是D6T-44L-06H,可以测量一个4x4区域内的温度,大概是每个方块内的温度用一个值表示,精度越高测温的分辨率也越高

       

 

       大概意思就是距离越近,测量格子内的范围就越小,温度就越可信。

        

 

二、传感器连接板卡

        已经引出了四个接口,用板卡上的5V供电就可以

       

 

        板卡的引脚上已经接入了上拉电阻

        

 

        用一根GH1.25转杜邦线4p连接

        

 

        对应的I2C总线读取

        

 

三、板卡烧录代码

开发板读取传感器信息,处理后输出至串口。电脑上位机读取串口数据,解析并且以一张4x4的温度分布图片显示。

开发板代码:

  • #include <Wire.h>
  • /* defines */
  • #define D6T_ADDR 0x0A // for I2C 7bit address
  • #define D6T_CMD 0x4C // for D6T-44L-06/06H, D6T-8L-09/09H, for D6T-1A-01/02
  • #define N_ROW 4
  • #define N_PIXEL (4 * 4)
  • #define N_READ ((N_PIXEL + 1) * 2 + 1)
  • uint8_t rbuf[N_READ];
  • double ptat;
  • double pix_data[N_PIXEL];
  • uint8_t calc_crc(uint8_t data) {
  • int index;
  • uint8_t temp;
  • for (index = 0; index < 8; index++) {
  • temp = data;
  • data <<= 1;
  • if (temp & 0x80) {data ^= 0x07;}
  • }
  • return data;
  • }
  • /** <!-- D6T_checkPEC {{{ 1--> D6T PEC(Packet Error Check) calculation.
  • * calculate the data sequence,
  • * from an I2C Read client address (8bit) to thermal data end.
  • */
  • bool D6T_checkPEC(uint8_t buf[], int n) {
  • int i;
  • uint8_t crc = calc_crc((D6T_ADDR << 1) | 1); // I2C Read address (8bit)
  • for (i = 0; i < n; i++) {
  • crc = calc_crc(buf[i] ^ crc);
  • }
  • bool ret = crc != buf[n];
  • if (ret) {
  • Serial.print("PEC check failed:");
  • Serial.print(crc, HEX);
  • Serial.print("(cal) vs ");
  • Serial.print(buf[n], HEX);
  • Serial.println("(get)");
  • }
  • return ret;
  • }
  • /** <!-- conv8us_s16_le {{{1 --> convert a 16bit data from the byte stream.
  • */
  • int16_t conv8us_s16_le(uint8_t* buf, int n) {
  • uint16_t ret;
  • ret = (uint16_t)buf[n];
  • ret += ((uint16_t)buf[n + 1]) << 8;
  • return (int16_t)ret; // and convert negative.
  • }
  • /** <!-- setup {{{1 -->
  • * 1. Initialize
  • - initialize a Serial port for output.
  • - initialize I2C.
  • */
  • void setup() {
  • Serial.begin(115200); // Serial baudrate = 115200bps
  • Wire.begin(); // i2c master
  • delay(620);
  • }
  • /** <!-- loop - Thermal sensor {{{1 -->
  • * 2. read data.
  • */
  • void loop() {
  • int i = 0;
  • int16_t itemp = 0;
  • // Read data via I2C
  • // I2C buffer of "Arduino MKR" is 256 buffer. (It is enough)
  • memset(rbuf, 0, N_READ);
  • Wire.beginTransmission(D6T_ADDR); // I2C slave address
  • Wire.write(D6T_CMD); // D6T register
  • Wire.endTransmission();
  • delay(1);
  • Wire.requestFrom(D6T_ADDR, N_READ);
  • while (Wire.available()) {
  • rbuf[i++] = Wire.read();
  • }
  • D6T_checkPEC(rbuf, N_READ - 1);
  • //Convert to temperature data (degC)
  • ptat = (double)conv8us_s16_le(rbuf, 0) / 10.0;
  • for (i = 0; i < N_PIXEL; i++) {
  • itemp = conv8us_s16_le(rbuf, 2 + 2*i);
  • pix_data[i] = (double)itemp / 10.0;
  • }
  • //Output results
  • Serial.print("PTAT:");
  • Serial.print(ptat, 1);
  • Serial.print(" [degC], Temperature: ");
  • for (i = 0; i < N_PIXEL; i++) {
  • Serial.print(pix_data[i], 1);
  • Serial.print(", ");
  • }
  • Serial.println(" [degC]");
  • delay(300);
  • }

电脑上位机代码

  • import serial
  • import time
  • import matplotlib.pyplot as plt
  • # 设置串口参数
  • port = serial.Serial('COM10', 115200, timeout=1)
  • # 图片保存路径
  • image_path = 'your_image.png'
  • def parse_serial_data(data):
  • # 提取PTAT和温度数据
  • ptat_start_index = data.find("PTAT:") + len("PTAT:")
  • ptat_end_index = data.find("[degC]")
  • ptat = float(data[ptat_start_index:ptat_end_index].strip())
  • temp_start_index = data.find("Temperature:") + len("Temperature:")
  • temp_end_index = data.find("[degC]", ptat_end_index + len("[degC]"))
  • temperature_data = data[temp_start_index:temp_end_index].strip().split(", ")
  • # 去除温度数据中的逗号
  • temperature_data = [temp.replace(',', '') for temp in temperature_data]
  • # 处理温度数据的转换错误
  • try:
  • temperature_data = [float(temp) for temp in temperature_data]
  • except ValueError:
  • # 温度数据转换错误,可以进行适当的处理
  • print("Invalid temperature data:", temperature_data)
  • temperature_data = []
  • return ptat, temperature_data
  • # 绘制温度数据图形并保存为图片
  • def draw_temperature_data(temperature_data):
  • tcolor = ['#400040', '#000080', '#006060', '#008000', '#C0C000', '#E0A000', '#F08080', '#E00000']
  • fig, ax = plt.subplots(4, 4, figsize=(8, 8))
  • plt.subplots_adjust(hspace=0.3)
  • for i, temp in enumerate(temperature_data):
  • row = i // 4
  • col = i % 4
  • if temp < 0:
  • color = tcolor[0]
  • elif temp < 5:
  • color = tcolor[1]
  • elif temp < 10:
  • color = tcolor[2]
  • elif temp < 15:
  • color = tcolor[3]
  • elif temp < 20:
  • color = tcolor[4]
  • elif temp < 25:
  • color = tcolor[5]
  • elif temp < 30:
  • color = tcolor[6]
  • else:
  • color = tcolor[7]
  • ax[row, col].axis('off')
  • ax[row, col].add_patch(plt.Rectangle((0, 0), 1, 1, color=color))
  • ax[row, col].text(0.5, 0.5, str(temp), fontsize=20, ha='center', va='center')
  • # 保存温度图片
  • plt.savefig(image_path)
  • # 显示温度图片
  • plt.pause(0.001) # 暂停一段时间,使得图形窗口能够更新
  • # 创建温度数据图形
  • fig, ax = plt.subplots(4, 4, figsize=(8, 8))
  • plt.subplots_adjust(hspace=0.3)
  • plt.ion() # 打开交互模式
  • # 主循环
  • while True:
  • # 从串口读取数据
  • if port.in_waiting > 0:
  • data = port.readline().decode('utf-8').strip()
  • ptat, temperature_data = parse_serial_data(data)
  • # 打印PTAT和温度数据
  • print("PTAT:", ptat)
  • print("Temperature:", temperature_data)
  • # 绘制温度数据图形并保存为图片
  • draw_temperature_data(temperature_data)
  • # 可以在这里添加其他的处理逻辑
  • time.sleep(0.1) # 延迟一段时间,避免频繁读取串口数据

四、输出结果

开发板串口输出结果

 

 

上位机根据串口数据,显示温度分布

 

 

 

一些地方初学难免有错误,望大佬不吝批评指正

reference:

MEMS非接触温度传感器 D6T | OMRON电子部品网站 - China

MEMS Thermal Sensors D6T User’s Manual (omron.com)

D6T MEMS非接触温度传感器 (omron.com)

查看本帖全部内容,请登录或者注册
此帖出自无线连接论坛

最新回复

这一个传感器要多少米?   详情 回复 发表于 2024-3-8 16:55
点赞(1) 关注
 

回复
举报

7547

帖子

2

TA的资源

版主

沙发
 

这一个传感器要多少米?

此帖出自无线连接论坛

点评

得捷180,不过我是免费拿的样品  详情 回复 发表于 2024-3-8 17:16
 
 

回复

40

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
wangerxian 发表于 2024-3-8 16:55 这一个传感器要多少米?

得捷180,不过我是免费拿的样品

此帖出自无线连接论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
全国大学生电子设计竞赛训练教程

群里朋友传的 共享下 本书是针对全国大学生电子设计竞赛特点和需要,为高等院校电子信息工程、通信工程、自动化、电气控制类 ...

亚嵌教程

亚嵌教程

不是经典我不发--电子设计应用问答(21篇)

电子设计应用问答 目录 一、电压基准及时间基准 二、压频转换器 三、高速比较器 四、运算放大器 五、数模转换器 六、Σ ...

ubuntu下修改内核发生“ncurses libraries“错误(解决方法)

BSEC@bsec-server:~/kernel/Kernel$ make menuconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/basic/docproc HOSTCC script ...

NXP LPC1768宝马开发板 第三十六章 宝马1768——uC/OS-II

宝马LPC1768——uC/OS-II本部分主要讲解宝马LPC1768关于uC/OS-II的有关例程,包括移植,任务调度,信号量的使用,消息队列的使用 ...

TI 用于智能燃气表和水表的具有接收器功能的 wM-Bus 169MHz RF 子系统

506423 一种极低功耗 ETSI 1 类接收器功能型射频子系统,适用于 169 MHz 下的具有 wM-Bus 功能的智能燃气表和水表。此设计根据 ...

【STM32H5开发板】第四帖 stm32h563 真随机数测试

STM32H563芯片的TRNG模块是一种真随机数生成器,它可以在芯片内部生成高质量的随机数。这个模块基于物理随机过程,如热噪声、电 ...

【得捷电子Follow me第2期】+基于CircuitPython的温度传感器&光传感器

本帖最后由 手下败酱 于 2023-10-21 10:55 编辑 温度传感器&光传感器的使用 温度传感器(MCP9808) 742844 这款 ...

【嘉楠科技 CanMV K230测评】开发板开箱,开发环境搭建,Demo程序烧录测试

一、基础介绍 1.1板子介绍 此次测评使用的是01Studio CanMV K230 AI开发板,主控芯片是来自电赛神器K210的升级款,嘉楠科 ...

【MCXA156开发板测评】学习笔记01(开发环境搭建)

NCXA156学习笔记 目录 # 开发环境搭建 ## 帐号注册 ​ 在官网上下载工具,需要注册NXP的帐号,注册帐号的 ...

快速回复 返回顶部 返回列表