让我们造一把红外测温枪来感受夏天 -使用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进行编程,降低了软件开发的难度。
选用的元件
部件清单: 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 print- right part.stl 3D打印文件
制作步骤: 1、 如下图焊接好各个部件
接线图
2、 使用PCtoLCD2002液晶取模软件将需要用到的图片和16X24字体转换为16进制代码
按照上图模式来进行设置和取模
3、使用uPyCraft MicroPython IDE 进行编程,烧写代码到FireBeetleESP32主板上
烧写好代码后测试程序是否可以工作
- 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、 根据部件尺寸设计外壳
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- right part.stl 3D打印文件
至此一个实用的非接触测温枪就制作完成了。大家可以根据自己的实际需求修改程序。例如使用FireBeetle ESP32主板的WiFi和BLE蓝牙将测温数据上传到物联网或者手机上。(我经常出门后想不起来有没有关闭燃气灶,我们可以通过一款物联网的测温枪远程查看是否有关闭燃气灶。)
|