极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 46002|回复: 15

DIY红外非接触式温度计

[复制链接]
发表于 2014-2-26 11:13:10 | 显示全部楼层 |阅读模式
本帖最后由 sinbadcool 于 2014-2-26 11:18 编辑

2014年2月10日
小伢的第409天
过完春节从武汉回到北京的第3天
第一次发烧了
拿水银温度计给小伢凉体温
怎么都不愿意
喝了退烧药
折腾了好几次
才量出了体温
还好温度已经降下来了



想到原来有个朋友的小伢发烧
妈妈用电子体温计一下就测出了体温
于是上淘宝一搜
果真好多
但价格都要2、300元



但既然是红外线的温度计
就一定有传感器
还是淘宝
果然
找到了这个台湾燃太的TN901红外测温模块
150元。
OK
那就DIY一个红外体温计吧!



焊上引线



拿泡棉把PCB包住
防止裸露的元件短路



用两个零件给夹着
固定住
红外测温模块的安装就差不多了



准备好必要的arduino UNO、扩展板和oled



还有金属零件
一顿锁螺丝
一顿拆啊装装啊拆
(都是探索者的东西,暂时不一一打广告啦)



大功告成!



来个三视图:正面



背面。性感的绕线。



OLED显示屏。现在显示的是室温。



红外温度探头和距离传感器
暴露了凌乱的走线


最关键的程序在这里
arduino万岁
极大的参考了这些资料,表示致敬:
TN901的库:[深入浅出Energia开发第二讲]如何自己编写Arduino支持的C++类库
OLED的库:MultiLCD,https://github.com/stanleyhuangyc/MultiLCD
  1. #include <TN901.h> //TN901的库
  2. TN901 tn;                 //创建TN901的对象

  3. #include <Arduino.h>
  4. #include <Wire.h>
  5. #include <MicroLCD.h> //OLED的库
  6. LCD_SSD1306 lcd; /* for SSD1306 OLED module */
  7. static const PROGMEM uint8_t tick[16 * 16 / 8] =
  8. {0x00,0x80,0xC0,0xE0,0xC0,0x80,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0x78,0x30,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x1F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00}; //显示勾
  9. static const PROGMEM uint8_t cross[16 * 16 / 8] =
  10. {0x00,0x0C,0x1C,0x3C,0x78,0xF0,0xE0,0xC0,0xE0,0xF0,0x78,0x3C,0x1C,0x0C,0x00,0x00,0x00,0x30,0x38,0x3C,0x1E,0x0F,0x07,0x03,0x07,0x0F,0x1E,0x3C,0x38,0x30,0x00,0x00}; //显示叉

  11. #include "LedControl.h" //8*8点阵的库
  12. LedControl lc=LedControl(12,11,13,1);

  13. #include <MsTimer2.h> //定时器的库

  14. void setup()
  15. {
  16.     pinMode(A0,INPUT); //设置距离传感器的端口
  17.     tn.Init(8,2,7);  //tn901初始化
  18.     lcd.begin(); //oled启动
  19.     lcd.setFont(FONT_SIZE_LARGE); //设置字体尺寸
  20.     lcd.setCursor(0, 3);
  21.     lc.shutdown(0,false); //8*8点阵启动
  22.     lc.setIntensity(0,8);
  23.     lc.clearDisplay(0);
  24.     MsTimer2::set(100, flash); // 500ms period //定时器设置,主要让8*8点阵产生呼吸灯效果
  25.     MsTimer2::start();
  26.     ShowHeart();//8*8点阵上显示个心形
  27. }

  28. void loop()
  29. {
  30.   static int temp;  
  31.   int t;
  32.   boolean mode=false; //true - BODY; false - ROOM
  33.   tn.Read(); //读取TN901的温度
  34.   mode=!digitalRead(A0);  //检测距离传感器是否接近人体
  35.   if(mode)  //如果接近人体
  36.   {
  37.        t=tn.OT+180; //tn.OT读取人体温度
  38.        if(temp<t)temp=t;
  39.   }
  40.   else temp=tn.ET-400; //tn.ET,读取环境温度
  41.    LCD_Value(temp,mode); //oled上显示人体温度或环境温度
  42.    delay(200); //延时,以便TN901刷新
  43. }

  44. void LCD_Value(int temp,boolean mode)
  45. {
  46.   lcd.setCursor(30, 3);
  47.   lcd.print((float)temp/100);
  48.   lcd.print(" C");
  49.   if(mode) lcd.draw( tick, 54, 48, 16, 16);
  50.   else     lcd.draw(cross, 54, 48, 16, 16);
  51. }

  52. void flash()
  53. {
  54.   static int i=0;
  55.   static boolean d=true;
  56.   if(d)i++;
  57.   else i--;
  58.   if(i==15 || i==0) d=!d;
  59.   lc.setIntensity(0,i);
  60. }

  61. void ShowHeart()
  62. {
  63.   lc.setRow(0,0,B00110000);
  64.   lc.setRow(0,1,B01111000);
  65.   lc.setRow(0,2,B01111100);
  66.   lc.setRow(0,3,B00111110);
  67.   lc.setRow(0,4,B00111110);
  68.   lc.setRow(0,5,B01111100);
  69.   lc.setRow(0,6,B01111000);
  70.   lc.setRow(0,7,B00110000);
  71. }
复制代码



好了
谁发个烧
让我来测一测吧



36.02度
冻着了吧



摄影师亚伦老坦克:来,作者亮个像。http://weibo.com/aaronstory
作者Sinbadz.Mao:亮个毛啊。http://weibo.com/sinbadcool




希所有的小朋友都健康快乐的成长
少发烧
少打针
少吃药哦^_^d

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-2-26 11:35:04 | 显示全部楼层
真不错啊~  建议加入一个激光头用来瞄准位置(一般的红外提问测试仪上都有)

另外,探索者 全称是什么? 在淘宝上怎么搜?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-26 11:43:58 | 显示全部楼层
zoologist 发表于 2014-2-26 11:35
真不错啊~  建议加入一个激光头用来瞄准位置(一般的红外提问测试仪上都有)

另外,探索者 全称是什么? ...

激光头是个好主意!!!
探索者就在百度上搜robotway好了
回复 支持 反对

使用道具 举报

发表于 2014-2-26 12:22:05 | 显示全部楼层
好厉害的造型
这个东西的精确度如何啊?
回复 支持 反对

使用道具 举报

发表于 2014-2-26 12:28:06 | 显示全部楼层
这两天正琢磨做个这个来,大神就做出来了,那个红外测距是干什么用的?
回复 支持 反对

使用道具 举报

发表于 2014-2-26 12:32:52 | 显示全部楼层
但是做这么一个东西的成本明显高于市场成品价格的说。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-26 13:04:15 | 显示全部楼层
wing 发表于 2014-2-26 12:22
好厉害的造型
这个东西的精确度如何啊?

精度还不错。
还没做温度补偿。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-26 13:04:51 | 显示全部楼层
Cupid 发表于 2014-2-26 12:28
这两天正琢磨做个这个来,大神就做出来了,那个红外测距是干什么用的?

就是提示一下,应该离多近才有效
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-26 13:08:15 | 显示全部楼层
Cupid 发表于 2014-2-26 12:32
但是做这么一个东西的成本明显高于市场成品价格的说。

成本还可以。
外形要是手工拿硬纸壳做的话
就买这些东西就够了:
tn901红外温度传感器150元
arduino uno 30元
电池盒 2元
合计182元。属于中档价位哦,哈哈

回复 支持 反对

使用道具 举报

发表于 2014-2-27 01:09:11 | 显示全部楼层
没见到板子上有基准源电压校正哦?温度准么?烧一锅试试?

Arduino入门教程-第二十六课 关于基准源 将3.3V作为外部基准源使用 - Powered by Discuz!
http://www.geek-workshop.com/thread-5717-1-1.html

回复 支持 反对

使用道具 举报

发表于 2014-2-28 08:53:59 | 显示全部楼层
赞一个 如此贴近生活
也祝楼主家的小朋友健健康康 快快乐乐的成长
回复 支持 反对

使用道具 举报

发表于 2014-4-23 18:43:58 | 显示全部楼层
好厉害!楼主你的元器件除了那三个主要的还有其他的吗?我想模仿这自己做一个,求原理图谢谢!
回复 支持 反对

使用道具 举报

发表于 2014-8-9 12:33:17 | 显示全部楼层
本帖最后由 zoologist 于 2014-8-9 13:24 编辑

请教一下楼主,我也买了一个 tn901的模块,但是不知道为什么送出来的值一直是零?  运行的是 tn901库中自带的例子

#include <TN901.h>
TN901 tn;
void setup()
{
    Serial.begin(9600);
    tn.Init(7,9,8);
}

void loop()
{
   tn.Read();
   SerialValue();
   delay(200);
}

void SerialValue()
{
   Serial.print("OT: ");
   Serial.print(tn.OT, DEC);
   Serial.println(" C");
   Serial.print("ET: ");
   Serial.print(tn.ET, DEC);
   Serial.println(" C");
}

搞定了.......原因是我线序搞错了

参考 http://wenku.baidu.com/link?url= ... BYq7ig_BFKATuUpYS1W

顺序是
V  D  C G A
回复 支持 反对

使用道具 举报

发表于 2014-10-16 16:12:11 | 显示全部楼层
不错,看着挺酷的
回复 支持 反对

使用道具 举报

发表于 2014-12-6 20:18:04 | 显示全部楼层
长见识了,,,
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 20:53 , Processed in 0.045062 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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