极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16981|回复: 9

让我们造一把红外测温枪来感受夏天 - 使用FireBeetle ESP32

[复制链接]
发表于 2017-8-4 12:04:49 | 显示全部楼层 |阅读模式
本帖最后由 DFRobot官方 于 2017-8-7 11:53 编辑

让我们造一把红外测温枪来感受夏天
-使用FireBeetleESP32主板和 MLX90614非接触式红外温度传感器


最近天气太热了,进入汽车车厢秒变烤鸭。去骑个共享单车,我的天,这不是骑车,简直是在烤肉。所以我琢磨是不是搞一个测温枪来检测下座椅的温度。这种小儿科的问题怎么能难倒我这个maker呢。手上正好有DFRobot 出的FireBeetle ESP32主板和 MLX90614非接触式红外温度传感器,自己造一款测温枪出来。





让我们造一把红外测温枪来感受夏天
-使用FireBeetleESP32主板和 MLX90614非接触式红外温度传感器

最近天气太热了,进入汽车车厢秒变烤鸭。去骑个共享单车,我的天,这不是骑车,简直是在烤肉。所以我琢磨是不是搞一个测温枪来检测下座椅的温度。这种小儿科的问题怎么能难倒我这个maker呢。手上正好有DFRobot 出的FireBeetle ESP32主板和 MLX90614非接触式红外温度传感器,自己造一款测温枪出来。




主板选用了DFRobot最新出的FireBeetleESP32主板,体积比传统的Arduino Uno主板小很多,另外FireBeetle ESP32主板自带电池接口和充电电路,非常适合用于低功耗便携设备的制作。
传感器使用了DFRobot出品的MLX90614非接触式红外测温传感器,和传统的LM35、DS18B20这些传统的温度传感器比较,这款传感器可以非接触的方式测量到目标物体的温度。传感器是IIC接口,非常方便连接到主板上使用。
显示部分使用了一块 DFRobot最近新生产的 GravityIIC OLED-2864显示屏,它是一款非常漂亮的蓝色自发光屏幕,这个屏幕有金属边框可以防止屏幕在制作和使用过程中玻璃破裂损坏。软件使用了DFRobot开发的uPyCraftMicroPython IDE,使用python进行编程,降低了软件开发的难度。



选用的元件


部件清单:
FireBeetle ESP32 主板     1  只  
MLX90614非接触式红外测温传感器   1只
Gravity IIC OLED-2864 显示屏  1只  
3.7V 400mAh锂电池          1只
6mm直径红光激光发射器     1只
C&K滑动开关                1只
3D打印外壳上盖和下盖       1套

工具:
安泰信AT936A无铅恒温焊台
Overlord Pro 3D打印机
401 胶水
热熔胶枪

所用到的软件:
MLX90614.py MLX90614非接触式红外测温传感器 库文件
SSD1306.py  Gravity IIC OLED-2864 显示屏 库文件
piclib.py      项目使用的显示图片和16*24字体 库文件
InfraRedThermometer.py  项目代码源文件
uPyCraftMicroPython IDE  (点击下载)
PCtoLCD2002液晶取模软件
3D打印切片软件Cura
3D print- left part.stl   3D打印文件 可直接使用 Overlord Pro 3D打印机 打印
3D print- right part.stl  3D打印文件


制作步骤:
1、  如下图焊接好各个部件

   接线图

2、  使用PCtoLCD2002液晶取模软件将需要用到的图片和16X24字体转换为16进制代码


按照上图模式来进行设置和取模

3、使用uPyCraft  MicroPython IDE 进行编程,烧写代码到FireBeetleESP32主板上

烧写好代码后测试程序是否可以工作

  1. import MLX90614
  2. from machine import Pin,I2C
  3. import time
  4. import ssd1306
  5. from piclib import *
  6. # This code will show you how to make a Infra Red Thermometer using the MLX90614 sensor.


  7. i2c = I2C(scl=Pin(22), sda=Pin(21), freq=100000)
  8. ir=MLX90614.MLX90614(i2c)
  9. lcd=ssd1306.SSD1306_I2C(128,64,i2c)

  10. #Display a picture 72*64
  11. def DisplayPicture(x,y,picture):
  12.   for line in range(0,64):
  13.     for bytes in range(0,9):
  14.       for bits in range(0,8):
  15.         if picture[9*line+bytes]&0x80>>bits:
  16.           lcd.pixel(x+bytes*8+bits,y+line,1)
  17.         else:
  18.           lcd.pixel(x+bytes*8+bits,y+line,0)
  19.   return

  20. #Display a character 16*24
  21. def DisplayCharacter16X24(x,y,character):
  22.   for line in range(0,24):
  23.     for bytes in range(0,2):
  24.       for bits in range(0,8):
  25.         if character[line*2+bytes]&0x80>>bits:
  26.           lcd.pixel(x+bytes*8+bits,y+line,1)
  27.         else:
  28.           lcd.pixel(x+bytes*8+bits,y+line,0)
  29.   return

  30. #---------------------run here------------------------------------  
  31. #display logo
  32. DisplayPicture(28,0,picture)
  33. lcd.show()
  34. time.sleep(1)
  35. lcd.fill(0)

  36. #display O:123.4C
  37. #        A:123.4C
  38. DisplayCharacter16X24(0,0,charArray[10]) #O
  39. DisplayCharacter16X24(16*1,0,charArray[12]) #:
  40. DisplayCharacter16X24(16*7,0,charArray[13]) #C

  41. DisplayCharacter16X24(0,24,charArray[11]) #A
  42. DisplayCharacter16X24(16*1,24,charArray[12]) #:
  43. DisplayCharacter16X24(16*7,24,charArray[13]) #C
  44. lcd.show()


  45. while True:
  46.   time.sleep(0.2)
  47.   Object = ir.getObjCelsius() #  *C
  48.   Ambient = ir.getEnvCelsius() # *C
  49.   #Object = ir.getObjFahrenheit() # *F
  50.   #Ambient = ir.getEnvFahrenheit() # *F
  51.   #print("Object  %s *C"% Object)
  52.   #print("Ambient %s *C"% Ambient)
  53.   #print()
  54.   ObjectInt = int(Object*10)
  55.   AmbientInt = int(Ambient*10)
  56.   if ObjectInt < 0:
  57.     ObjectInt = abs(ObjectInt)
  58.     DisplayCharacter16X24(16*2,0,charArray[15])# -
  59.     temp1 = (ObjectInt%1000)//100
  60.     if(temp1 == 0):
  61.       DisplayCharacter16X24(16*3,0,charArray[16]) # space
  62.     else:
  63.       DisplayCharacter16X24(16*3,0,charArray[temp1])
  64.     DisplayCharacter16X24(16*4,0,charArray[(ObjectInt%100)//10])
  65.     DisplayCharacter16X24(16*5,0,charArray[14]) # .
  66.     DisplayCharacter16X24(16*6,0,charArray[ObjectInt%10])
  67.    
  68.   else:
  69.     temp1 = ObjectInt//1000
  70.     temp2 = (ObjectInt%1000)//100
  71.     if temp1 == 0:
  72.       DisplayCharacter16X24(16*2,0,charArray[16]) # space
  73.     else:
  74.       DisplayCharacter16X24(16*2,0,charArray[temp1])
  75.     if temp1 == 0 and temp2 == 0:
  76.       DisplayCharacter16X24(16*3,0,charArray[16]) # space
  77.     else:
  78.       DisplayCharacter16X24(16*3,0,charArray[temp2])
  79.     DisplayCharacter16X24(16*4,0,charArray[(ObjectInt%100)//10])
  80.     DisplayCharacter16X24(16*5,0,charArray[14]) # .
  81.     DisplayCharacter16X24(16*6,0,charArray[ObjectInt%10])
  82.   
  83.   if AmbientInt < 0:
  84.     ObjectInt = abs(AmbientInt)
  85.     DisplayCharacter16X24(16*2,24,charArray[15])# -
  86.     temp1 = (AmbientInt%1000)//100
  87.     if temp1 == 0:
  88.       DisplayCharacter16X24(16*3,24,charArray[16]) # space
  89.     else:
  90.       DisplayCharacter16X24(16*3,24,charArray[temp1])
  91.     DisplayCharacter16X24(16*4,24,charArray[(AmbientInt%100)//10])
  92.     DisplayCharacter16X24(16*5,24,charArray[14]) # .
  93.     DisplayCharacter16X24(16*6,24,charArray[AmbientInt%10])
  94.    
  95.   else:
  96.     temp1 = AmbientInt//1000
  97.     temp2 = (AmbientInt%1000)//100
  98.     if temp1 == 0:
  99.       DisplayCharacter16X24(16*2,24,charArray[16]) # space
  100.     else:
  101.       DisplayCharacter16X24(16*2,24,charArray[temp1])
  102.     if temp1 == 0 and temp2 == 0:
  103.       DisplayCharacter16X24(16*3,24,charArray[16]) # space
  104.     else:
  105.       DisplayCharacter16X24(16*3,24,charArray[temp2])
  106.     DisplayCharacter16X24(16*4,24,charArray[(AmbientInt%100)//10])
  107.     DisplayCharacter16X24(16*5,24,charArray[14]) # .
  108.     DisplayCharacter16X24(16*6,24,charArray[AmbientInt%10])  
  109.   lcd.show()
复制代码


4、  根据部件尺寸设计外壳





5、  使用3D打印切片软件Cura制作3D打印文件


6、  使用Overlord 3D打印机打印出外壳




7、使用热熔胶和胶水将部件安装到打印的外壳内




8、测试温度

测量手掌温度


测量摩拜共享单车桌垫温度


测量冰箱冷冻室温度

附件资料下载:
MLX90614.py MLX90614非接触式红外测温传感器 库文件
SSD1306.py  Gravity IIC OLED-2864 显示屏 库文件
piclib.py      项目使用的显示图片和16*24字体 库文件
InfraRedThermometer.py  项目代码源文件
uPyCraftMicroPython IDE  (点击下载)
PCtoLCD2002液晶取模软件
3D print- left part.stl   3D打印文件 可直接使用 Overlord Pro 3D打印机 打印
3D print- right part.stl  3D打印文件

至此一个实用的非接触测温枪就制作完成了。大家可以根据自己的实际需求修改程序。例如使用FireBeetle ESP32主板的WiFi和BLE蓝牙将测温数据上传到物联网或者手机上。(我经常出门后想不起来有没有关闭燃气灶,我们可以通过一款物联网的测温枪远程查看是否有关闭燃气灶。)

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2017-8-4 13:09:07 | 显示全部楼层
Ansifa 发表于 2017-8-4 12:31
df也来了大公司就是厉害,一套流水线都是自己的产品。。

出初来乍到,请多关照~(捂脸)
回复 支持 1 反对 0

使用道具 举报

发表于 2017-8-4 12:31:54 | 显示全部楼层
df也来了大公司就是厉害,一套流水线都是自己的产品。。
回复 支持 反对

使用道具 举报

发表于 2017-8-5 09:05:14 | 显示全部楼层
真的不是粘贴过来的帖子吗?那些下载链接是怎么了?
回复 支持 反对

使用道具 举报

发表于 2017-8-7 11:29:08 | 显示全部楼层
老胖熊 发表于 2017-8-5 09:05
真的不是粘贴过来的帖子吗?那些下载链接是怎么了?

难道不是当附件上传了就可以?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-7 11:49:10 | 显示全部楼层
老胖熊 发表于 2017-8-7 11:29
难道不是当附件上传了就可以?

我试一下哦~
回复 支持 反对

使用道具 举报

发表于 2017-8-9 18:34:48 | 显示全部楼层
虽然有广告性质,但是质量很高!
谢谢提供!
回复 支持 反对

使用道具 举报

发表于 2017-8-12 08:00:06 | 显示全部楼层
被成功安利,正在浏览某宝,哈哈。
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 20:43 , Processed in 0.046855 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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