查看: 2597|回复: 14

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

[复制链接]
本帖最后由 Rockets 于 2017-9-13 09:40 编辑

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

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

2-测温.PNG



主板选用了DFRobot最新出的FireBeetleESP32主板,体积比传统的Arduino Uno主板小很多,另外FireBeetle ESP32主板自带电池接口和充电电路,非常适合用于低功耗便携设备的制作。

传感器使用了DFRobot出品的MLX90614非接触式红外测温传感器,和传统的LM35、DS18B20这些传统的温度传感器比较,这款传感器可以非接触的方式测量到目标物体的温度。传感器是IIC接口,非常方便连接到主板上使用。

显示部分使用了一块 DFRobot最近新生产的 GravityIIC OLED-2864显示屏,它是一款非常漂亮的蓝色自发光屏幕,这个屏幕有金属边框可以防止屏幕在制作和使用过程中玻璃破裂损坏。软件使用了DFRobot开发的uPyCraftMicroPython IDE,使用python进行编程,降低了软件开发的难度。

3-图片-所用部件.jpg
选用的元件


部件清单:
3.7V 400mAh锂电池          1只
6mm直径红光激光发射器     1只
C&K滑动开关                1只

工具:
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、  如下图焊接好各个部件
4-图片-接线图.jpg
   接线图

2、  使用PCtoLCD2002液晶取模软件将需要用到的图片和16X24字体转换为16进制代码
PCtoLCD2002液晶取模字体设置为16X24.jpg
PCtoLCD2002 液晶取模设置.jpg
按照上图模式来进行设置和取模

3、使用uPyCraft  MicroPython IDE 进行编程,烧写代码到FireBeetleESP32主板上
编写代码.PNG
烧写好代码后测试程序是否可以工作
[Python] 纯文本查看 复制代码
import MLX90614
from machine import Pin,I2C
import time
import ssd1306
from piclib import *
# This code will show you how to make a Infra Red Thermometer using the MLX90614 sensor.


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

#Display a picture 72*64 
def DisplayPicture(x,y,picture):
  for line in range(0,64):
    for bytes in range(0,9):
      for bits in range(0,8):
        if picture[9*line+bytes]&0x80>>bits:
          lcd.pixel(x+bytes*8+bits,y+line,1)
        else:
          lcd.pixel(x+bytes*8+bits,y+line,0)
  return

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

#---------------------run here------------------------------------  
#display logo
DisplayPicture(28,0,picture) 
lcd.show()
time.sleep(1)
lcd.fill(0)

#display O:123.4C
#        A:123.4C 
DisplayCharacter16X24(0,0,charArray[10]) #O
DisplayCharacter16X24(16*1,0,charArray[12]) #:
DisplayCharacter16X24(16*7,0,charArray[13]) #C

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


while True:
  time.sleep(0.2)
  Object = ir.getObjCelsius() #  *C
  Ambient = ir.getEnvCelsius() # *C
  #Object = ir.getObjFahrenheit() # *F
  #Ambient = ir.getEnvFahrenheit() # *F
  #print("Object  %s *C"% Object)
  #print("Ambient %s *C"% Ambient)
  #print()
  ObjectInt = int(Object*10)
  AmbientInt = int(Ambient*10)
  if ObjectInt < 0:
    ObjectInt = abs(ObjectInt)
    DisplayCharacter16X24(16*2,0,charArray[15])# -
    temp1 = (ObjectInt%1000)//100
    if(temp1 == 0):
      DisplayCharacter16X24(16*3,0,charArray[16]) # space
    else:
      DisplayCharacter16X24(16*3,0,charArray[temp1])
    DisplayCharacter16X24(16*4,0,charArray[(ObjectInt%100)//10])
    DisplayCharacter16X24(16*5,0,charArray[14]) # .
    DisplayCharacter16X24(16*6,0,charArray[ObjectInt%10]) 
   
  else:
    temp1 = ObjectInt//1000
    temp2 = (ObjectInt%1000)//100
    if temp1 == 0:
      DisplayCharacter16X24(16*2,0,charArray[16]) # space
    else:
      DisplayCharacter16X24(16*2,0,charArray[temp1])
    if temp1 == 0 and temp2 == 0:
      DisplayCharacter16X24(16*3,0,charArray[16]) # space
    else:
      DisplayCharacter16X24(16*3,0,charArray[temp2])
    DisplayCharacter16X24(16*4,0,charArray[(ObjectInt%100)//10])
    DisplayCharacter16X24(16*5,0,charArray[14]) # .
    DisplayCharacter16X24(16*6,0,charArray[ObjectInt%10]) 
 
  if AmbientInt < 0:
    ObjectInt = abs(AmbientInt)
    DisplayCharacter16X24(16*2,24,charArray[15])# -
    temp1 = (AmbientInt%1000)//100
    if temp1 == 0:
      DisplayCharacter16X24(16*3,24,charArray[16]) # space
    else:
      DisplayCharacter16X24(16*3,24,charArray[temp1])
    DisplayCharacter16X24(16*4,24,charArray[(AmbientInt%100)//10])
    DisplayCharacter16X24(16*5,24,charArray[14]) # .
    DisplayCharacter16X24(16*6,24,charArray[AmbientInt%10]) 
   
  else:
    temp1 = AmbientInt//1000
    temp2 = (AmbientInt%1000)//100
    if temp1 == 0:
      DisplayCharacter16X24(16*2,24,charArray[16]) # space
    else:
      DisplayCharacter16X24(16*2,24,charArray[temp1])
    if temp1 == 0 and temp2 == 0:
      DisplayCharacter16X24(16*3,24,charArray[16]) # space
    else:
      DisplayCharacter16X24(16*3,24,charArray[temp2])
    DisplayCharacter16X24(16*4,24,charArray[(AmbientInt%100)//10])
    DisplayCharacter16X24(16*5,24,charArray[14]) # .
    DisplayCharacter16X24(16*6,24,charArray[AmbientInt%10])  
  lcd.show()

4、  根据部件尺寸设计外壳
3D设计.PNG

3D模型.png

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

6、  使用Overlord 3D打印机打印出外壳
3D打印过程截图.PNG

3D打印外壳.PNG

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

胶水密封.PNG

8、测试温度
测量手掌温度


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

测量冰箱冷冻室温度.PNG
测量冰箱冷冻室温度

附件资料下载:
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蓝牙将测温数据上传到物联网或者手机上。(我经常出门后想不起来有没有关闭燃气灶,我们可以通过一款物联网的测温枪远程查看是否有关闭燃气灶。)


InfraRedThermometer-download.zip

4.46 MB, 下载次数: 15, 下载积分: 创造力 -1

hnyzcj  超级版主

发表于 2017-8-2 17:33:29

赞一个,哈哈
回复 支持 反对

使用道具 举报

hnyzcj  超级版主

发表于 2017-8-3 11:16:51

对于烈日下的车坐垫,我通常是带一瓶矿泉水去!
回复 支持 反对

使用道具 举报

bobo  NPC
 楼主|

发表于 2017-8-3 11:31:55

hnyzcj 发表于 2017-8-3 11:16
对于烈日下的车坐垫,我通常是带一瓶矿泉水去!

加水烤出来不香
回复 支持 反对

使用道具 举报

Niko  中级技师

发表于 2017-8-3 21:29:31

土豪玩家……淘宝的测温枪都在四五十左右……
回复 支持 反对

使用道具 举报

dbc0301  初级技匠

发表于 2017-8-4 17:25:17

自带环境温度进行比较,好方便啊
不过不是很懂为什么要激光器,是瞄准吗?
回复 支持 反对

使用道具 举报

dbc0301  初级技匠

发表于 2017-8-4 17:43:50

       不过楼主说的用测温枪远程查看是否有关闭燃气灶不是很现实,因为空气太稀薄了,即使是热空气也很难放出多少热辐射(P.S.除非是可燃气体,你把它点燃了,这样燃气就会燃烧并产生一个大火球,并释放出大量热辐射。。。不过这样一来你的厨房也没了),更有可能的是被其它物体的热辐射所掩盖,给张图参考一下。吹风机头部的温度很高,吹出来的风却几乎看不见,就是这个意思。

热成像下的吹风机.jpg

(图片来源于网络)


      所以说楼主还是老老实实装个燃气报警器吧。
回复 支持 反对

使用道具 举报

bobo  NPC
 楼主|

发表于 2017-8-5 15:28:01

Niko 发表于 2017-8-3 21:29
土豪玩家……淘宝的测温枪都在四五十左右……

回复 支持 反对

使用道具 举报

bobo  NPC
 楼主|

发表于 2017-8-5 15:28:56

dbc0301 发表于 2017-8-4 17:25
自带环境温度进行比较,好方便啊
不过不是很懂为什么要激光器,是瞄准吗? ...

我能说主要是装饰下吗
回复 支持 反对

使用道具 举报

bobo  NPC
 楼主|

发表于 2017-8-5 15:37:41

dbc0301 发表于 2017-8-4 17:43
不过楼主说的用测温枪远程查看是否有关闭燃气灶不是很现实,因为空气太稀薄了,即使是热空气也很难 ...

特别是用小火的时候,没什么动静。很容易忘记关火。能直接测量加热的地方。关门的时候可以提醒一下。
回复 支持 反对

使用道具 举报

安卓机器人  高级技匠

发表于 2017-8-5 19:17:23

hnyzcj 发表于 2017-8-3 11:16
对于烈日下的车坐垫,我通常是带一瓶矿泉水去!

降温贼快
回复 支持 反对

使用道具 举报

dbc0301  初级技匠

发表于 2017-8-6 08:47:38

bobo 发表于 2017-8-5 15:28
我能说主要是装饰下吗

装饰 23333
回复 支持 反对

使用道具 举报

418566903  学徒

发表于 2017-8-6 08:48:26

燃气灶没关请用摄像头
回复 支持 反对

使用道具 举报

胡秩通  高级技师

发表于 2017-8-9 22:45:00

成本多少?
回复 支持 反对

使用道具 举报

FBI-C  中级技师

发表于 2017-8-29 17:57:57

我比较担心3D打印的外壳会不会在室外高温下融掉。。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2016 Comsenz Inc. Powered by Discuz! X3.4 Licensed

QQ