搜索

[活动] 我的硬件狂想作品-接触式电子体温计

[复制链接]
247|13
 楼主 | 2020-10-24 14:02 | 显示全部楼层 |阅读模式
本帖最后由 gaoyang9992006 于 2020-10-28 09:53 编辑

       感谢贸泽电子提供这次活动赞助,让我体验到了村田制作所的这款NTC温度传感器,Murata Electronics MTHMR-N-0002A NTC热敏电阻评估板上板载了村田制作所的NXFT15XH103FA2B030NTC型热敏电阻,具有体积小,响应灵敏,精度高的特点,这得益于村田制作所多年的积累,以及提供了技术全面的技术手册。
这次活动参与的初衷是活动中提到了电子体温计,让我突然觉得这值得一试,以前生病测量体温用水银温度计,冰凉的难受,而非接触式的,又担心测的不准。这次看到了这么小的传感器(传感器只有芝麻粒那么大)觉得是时候寻找一个替代品了。
我参考部分可自动收回数据线与自动收回卷尺的想法,觉得这个传感器非常适合制作一款不用担心冰凉和水银破碎风险的电子体温计,同时还可以测量环境温度。
        再次感谢贸泽电子,之前我在贸泽电子下单买过好多次开发板与元件,发货及时,质量有保证,大的平台值得信赖。
测量提纲
第一步:查找资料,实现ADC测量
第二步:实现温度转换
第三步:实现体温计功能该方案的优点:该方案可以用于取代有危险的水银温度计,水银温度计冰凉,测量慢,由于特别冰凉,接触时候感觉很不舒适,升温较慢,测量周期长,该方案,利用该微型的温度传感器实现体温
的快速测量,体积较小,升温较快,响应灵敏。
-----------------------------------------------
第一步
在活动主页找到相关资料,关键内容如下所示,这是开发板的整体电路。
870885f93c3c99d5aa.png 798825f93c3df3c42a.png
我们可以根据该图知道如何使用该开发板,输出为Vout=Vcc*(R/(R+Ref));
r44e-3685.pdf (856.73 KB, 下载次数: 5)

使用特权

评论回复
 楼主 | 2020-10-24 14:26 | 显示全部楼层
本帖最后由 gaoyang9992006 于 2020-10-24 14:29 编辑

869175f93c90678734.png
在串口助手打印出测量结果,完全正确。 764195f93c97747d6b.png
用手加热,温度立马升高,该温度传感器由于体积特别小,跟个大头针一样,加热和散热速度非常快,可以很快的响应环境温度变化。
679905f93c9ce1a187.png
测试电路连接图。效果非常好。

使用特权

评论回复
 楼主 | 2020-10-24 14:32 | 显示全部楼层
先占楼,后面一步一步实现样机,接下来就是增加测量体温的逻辑:每个测量周期内将会记录最高温度,这个思路和水银体温计是原理一样的,只不过把危险的水印换成了这个电子的传感器。当温度升高时候,保持最大记录,直到下一个测量周期被触发,重新记录新的最大值。

使用特权

评论回复
 楼主 | 2020-10-24 15:44 | 显示全部楼层
本帖最后由 gaoyang9992006 于 2020-10-24 18:36 编辑

522855f9403698f41a.png
这是测量嘎子窝体温的结果36.62
人体的正常体温是36.3~37.2℃。

649685f93db5c1a3e8.png
通过Excel绘制出手册给的查表值。
通过6阶曲线拟合
291465f93dd0821c6a.png
674735f93dd1d3b71e.png
不过这是通过温度求R值的,我们是测量温度,所以需要知道通过R值求温度的拟合公式
交换坐标轴后,发现拟合的很不好,算了,还是用推荐的公式。之后再研究如何利用这些给定的点校准。

使用特权

评论回复
 楼主 | 2020-10-25 00:28 | 显示全部楼层
本帖最后由 gaoyang9992006 于 2020-10-26 09:44 编辑

优化一下源代码
  1. //***********************************************************************************************************
  2. //  File Function: ML51 series ADC software trigger on shot demo code
  3. //***********************************************************************************************************
  4. #include "ML51.h"
  5. #include "math.h"
  6. /******************************************************************************
  7. The main C function.  Program execution starts
  8. here after stack initialization.
  9. ******************************************************************************/

  10. #define K 273.15
  11. #define T0 (25.0+K)
  12. #define R0 10000.0
  13. #define B 3455.0        

  14. void main ()
  15. {
  16.   unsigned int ADCRESULT;
  17.         float Rval;
  18.         float temp;

  19. /*
  20. For UART0 P0.5 TXD output setting
  21. * include gipo.c in Library for GPIO mode setting
  22. * include uart.c in Library Setting for UART0
  23. */
  24.     MFP_P31_UART0_TXD;                              // UART0 TXD use P0.5
  25.     P31_QUASI_MODE;                                 // set P0.5  as Quasi mode for UART0 trasnfer
  26.     UART_Open(24000000,UART0_Timer3,115200);        // Open UART0 use timer1 as baudrate generate and baud rate = 115200
  27.     ENABLE_UART0_PRINTF;  
  28. /*
  29.   ADCS to trig ADC convert
  30.   * include adc.c in Library for ADC initial setting
  31. */
  32.     ADC_Open(ADC_SINGLE,1);                                        //Enable ADC_CH4
  33.     ADC_ConvertTime(3,7);
  34. //* find ADC result in ADC interrupt*/
  35.                                             
  36.     while(1)
  37.     {
  38.         set_ADCCON0_ADCS;                           // Software trig adc start
  39.         while((ADCCON0|CLR_BIT7)==CLR_BIT7);         // wait ADCF = 1;
  40.         ADCRESULT = (ADCRH<<4)+ADCRL;
  41.         printf("\n ADC result = %d  ", ADCRESULT);
  42.         Timer0_Delay(24000000,100,5000);
  43.                         
  44.          Rval=1000*((ADCRESULT*6.2)/(4095-ADCRESULT));
  45.          printf("\n Rval=%d Ohm",(unsigned int)Rval);
  46.          temp=1/((1/T0)+(log(Rval/R0)/B));
  47.          printf("\n temp=%.2f",temp-K);
  48.          printf("\n----------------");                                       
  49.     }
  50.   
  51. }

复制代码

使用特权

评论回复
 楼主 | 2020-10-27 16:39 | 显示全部楼层
本帖最后由 gaoyang9992006 于 2020-11-17 17:36 编辑

266175f97db673d0b1.png
这是该作品的原理图,很简单,只需要一个超低功耗单片机,1片3V纽扣电池或者3.7V锂电池,一个数码管显示屏,1个按钮,一个电阻,1个NTC电阻。
而设计的产品外观如下所示
214825f97dc35257a6.png
采用自动收线设计,传感器探头为一条较细的导线连接,可以收入设备内部,拉出线缆后,可以有约一米长,按下收回按键,线缆自动收回盒子内部。
线缆可以采用类似耳机线缆那种线缆制作,韧性强,柔软。
还可以设置若干LED灯,超出正常体温显示红色,正常体温范围内显示绿色。

将串口打印改成OLED屏幕显示
756165fb3997c6dea7.png
GPIO_I2C_OLED.rar (100.87 KB, 下载次数: 0)

使用特权

评论回复
 楼主 | 2020-10-27 23:41 | 显示全部楼层

使用特权

评论回复
| 2020-10-28 09:03 | 显示全部楼层
不错不错

使用特权

评论回复
| 2020-10-28 09:17 | 显示全部楼层
老高研究的透彻,多谢分享。

使用特权

评论回复
 楼主 | 2020-11-5 20:35 | 显示全部楼层
再次更新该贴,将电阻转换成温度的函数单独摘出来,作为一个独立的头文件,方便移植到其他平台调用。

NTC.h

  1. #define K 273.15
  2. #define T0 (25.0+K)
  3. #define R0 10000.0
  4. #define B 3455.0       

  5. /*
  6. 电阻值换算到温度
  7. adc_val:NTC当前的阻抗值,单位欧姆
  8. 返回值:摄氏度
  9. */

  10. float Res_to_Tem(float adc_val)
  11. {
  12.         float temp;
  13.         temp=1/((1/T0)+(log(adc_val/R0)/B));
  14.         return temp-K;
  15. }
复制代码


使用特权

评论回复

评论

gaoyang9992006 2020-11-5 20:35 回复TA
根据需要可以修改上面几个宏的对应值。 
| 2020-11-13 09:30 | 显示全部楼层
gaoyang9992006 发表于 2020-11-5 20:35
再次更新该贴,将电阻转换成温度的函数单独摘出来,作为一个独立的头文件,方便移植到其他平台调用。

NTC. ...

这个有阻抗偏移吗?楼主是怎么进行矫正的?内部有矫正的寄存器吗?

使用特权

评论回复
 楼主 | 2020-11-13 09:55 | 显示全部楼层
gaochy1126 发表于 2020-11-13 09:30
这个有阻抗偏移吗?楼主是怎么进行矫正的?内部有矫正的寄存器吗?

不需要,单片机ADC内部一般都有输入缓冲器。

使用特权

评论回复
| 2020-11-13 10:14 | 显示全部楼层
围观大佬

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /6 下一条

在线客服 快速回复 返回顶部 返回列表