社区导航

 

搜索
查看: 684|回复: 4

[分享] 让我们造一把红外测温枪

[复制链接]

572

TA的帖子

18

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2020-3-12 16:03 | 显示全部楼层 |阅读模式
本帖最后由 兰博 于 2020-3-12 14:02 编辑

1_70398515.jpg

 

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

 

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

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

 

选用的元件

部件清单:

FireBeetle ESP32 主板 1 只

MLX90614非接触式红外测温传感器

Gravity IIC OLED-2864 显示屏

3.7V 400mAh锂电池

6mm直径红光激光发射器

 

工具:

安泰信AT936A无铅恒温焊台

 

所用到的软件:

MLX90614.py MLX90614非接触式红外测温传感器 库文件

SSD1306.py Gravity IIC OLED-2864 显示屏 库文件

piclib.py 项目使用的显示图片和16*24字体 库文件

InfraRedThermometer.py 项目代码源文件

uPyCraftMicroPython IDE 

PCtoLCD2002液晶取模软件

 

制作步骤:

1、 如下图焊接好各个部件

3_70468140.jpg
接线图

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

4_70492187.jpg

 

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()

 

此帖出自RF/无线论坛
2_70440734.jpg


回复

使用道具 举报

2028

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2020-3-12 23:15 | 显示全部楼层

看了觉得能力很强啊,如果有更加详细的制作过程就好了



回复

使用道具 举报

29

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2020-3-13 07:24 | 显示全部楼层

請教一下樓主:我也用過MLX906014測溫,看您的作品還加上了紅外激光發射器,請問這對量測結果影響如何?不加的話可以嗎?感謝~  

 



回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2020-3-17 10:40 | 显示全部楼层

天天在用



回复

使用道具 举报

2071

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2020-3-17 17:41 | 显示全部楼层

不知道这个测温效果怎么样啊。



回复

使用道具 举报

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

关闭

站长推荐上一条 1/6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-3-29 23:17 , Processed in 0.173013 second(s), 18 queries , Gzip On, MemCache On.

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