查看: 2102|回复: 20

[项目] DIY高性能额温枪

[复制链接]

该用户从未签到

发表于 2020-3-18 13:43 | 显示全部楼层 |阅读模式
本帖最后由 fisher512 于 2020-3-18 13:56 编辑

前段时间购买不到额温枪,萌生自己做一款的冲动,利用几个休息日的时间,做了本款,性能很不错,哈哈。
制作过程中也遇到1-2个小问题,花了些时间,其余的没有什么难度,主要难度在于 OLED显示器和MLX90614都用I2C总线,调试的时候都正常工作,一旦这两个东西同时使用则不能工作,OLED没有显示,MLX90614温度传感器返回值也不对,一时不知所措,后来经过仔细查阅U8G2库文件资料,才发现I2C总线的频率设置出了问题,U8G2默认把I2C频率设置在100KHz,然而在这个频率上,MLX90614不能正常工作,因此必须把I2C频率强行设置在100KHz,这样两个设备都可以正常工作了。

另外因为疫情的原因,MLX90614(GY-906模块)都已经涨到200元左右了,真是奇贵无比,本人储备的几个都是年前购买的,价格约20元, 现在后悔年前怎么没有多买几个。

欢迎感兴趣的朋友们交流或拍砖~~~




右侧面

右侧面


左侧面

左侧面


正反面

正反面


物品清单

物品清单


[mw_shl_code=arduino,true]/***************************************************
  程序名称:非接触式温度测量仪
  程序概要:
  显示器OLED,采用U8G2类库控制,SSD1306驱动。
  温度传感器,MLX90614,

  两个传感器采用I2C的方式连接Arduino开发板,基础BUS频率必须设定在100KHz,否则不能正常工作,
  因为U8G2启动的时候,自动把频率设为400KHz,在这个频率上,MLX90164不能工作。

****************************************************/

#include <Adafruit_MLX90614.h>
#include <U8g2lib.h>
#include <Wire.h>

/*---定义引脚--*/
#define Blue  12  //蓝LED
#define Green 11  //绿LED
#define Red 10    //红LED
#define laser 3   //激光器
#define Triger 9  //启动按钮
#define operateButton 2 //黄色选择按钮
#define Buz 6  //蜂鸣器



/*------在I2C上有两个以上从设备,则必须使用_HW_I2C,如果只有一个则可以使用_SW_I2C------*/
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

/* -----------------------MLX90614------------------------------*/
Adafruit_MLX90614 mlx = Adafruit_MLX90614();

const char PROGMEM C[] = {0x0E, 0x00, 0x9B, 0x7F, 0xFB, 0x70, 0x7E, 0x60, 0x30, 0x60, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, 0x60, 0xE0, 0x30, 0x80, 0x1F, 0x00, 0x00};
const char PROGMEM Fan[] = {0x10, 0x04, 0xFF, 0x7F, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x88, 0x08, 0x90, 0x04, 0xFF, 0x7F, 0x90, 0x04, 0x0C, 0x18, 0xFB, 0x6F, 0x88, 0x08, 0xF8, 0x0F, 0x88, 0x08, 0xF8, 0x0F, 0x08, 0x08};
const char PROGMEM Xiu[] = {0x00, 0x0E, 0xF8, 0x01, 0x80, 0x00, 0x80, 0x00, 0xFE, 0x3F, 0xA0, 0x02, 0x90, 0x04, 0x8C, 0x18, 0xF3, 0x67, 0x20, 0x04, 0x20, 0x02, 0x20, 0x1E, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0A, 0x06, 0x04};
const char PROGMEM Ke[] = {0x10, 0x08, 0xB8, 0x08, 0x0F, 0x09, 0x08, 0x09, 0x08, 0x08, 0xBF, 0x08, 0x08, 0x09, 0x1C, 0x09, 0x2C, 0x08, 0x0A, 0x78, 0xCA, 0x0F, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08};
const char PROGMEM Xue[] = {0x44, 0x10, 0x88, 0x10, 0x88, 0x08, 0x00, 0x04, 0xFE, 0x7F, 0x02, 0x40, 0x01, 0x20, 0xF8, 0x07, 0x00, 0x02, 0x80, 0x01, 0xFF, 0x7F, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xA0, 0x00, 0x40, 0x00};
float temp = 0.0;


void showTempture() {
  u8g2.firstPage();
  do {
    u8g2.setFontPosTop();
    u8g2.setFontDirection(0);
    u8g2.setFont(u8g2_font_ncenB24_tf);  //u8g2_font_unifont_t_chinese2
    u8g2.setCursor(20, 10);
    u8g2.print(temp);
    //drawXBMP()绘制存储在FLASH中的图片信息,drawXBM()绘制存储在RAM中的图片信息
    u8g2.drawXBMP(110, 10, 16 , 16, C);
    //u8g2.setFont(u8g2_font_unifont_t_chinese2);  //u8g2_font_unifont_t_chinese2
    u8g2.drawXBMP(30, 45, 16 , 16, Fan);
    u8g2.drawXBMP(48, 45, 16 , 16, Xiu);
    u8g2.drawXBMP(66, 45, 16 , 16, Ke);
    u8g2.drawXBMP(84, 45, 16 , 16, Xue);

  } while ( u8g2.nextPage() );

}


void setup() {
  Serial.begin(9600);
  pinMode(Blue, OUTPUT);
  pinMode(Green, OUTPUT);
  pinMode(Red, OUTPUT);
  pinMode(laser, OUTPUT);
  pinMode(Buz, OUTPUT);
  pinMode(Triger, INPUT);
  pinMode(operateButton, INPUT);
  
  //关闭蜂鸣器和激光灯
  digitalWrite(Buz, HIGH);
  digitalWrite(laser,HIGH);

  u8g2.setBusClock(100000);// 设置I2C总线的频率,100KHz会适用所有的client设备
  u8g2.begin();
  u8g2.enableUTF8Print();    // enable UTF8 support for the Arduino print() function
  mlx.begin();
}


void loop() {

  //取出两个按键的状态值
  byte trigerValue = digitalRead(Triger);
  byte operatingValue = digitalRead(operateButton);

  if (trigerValue == HIGH) {
    //点亮红灯开始测温
    digitalWrite(Red, HIGH);

    //打开红色激光
    digitalWrite(laser,LOW);

    //从红外温度传感器中读取温度值,并通过串口打印
    temp = mlx.readObjectTempC();
    Serial.print(temp); Serial.println("*C");

    //用OLED显示读取的温度值
    showTempture();
    delay(450);

    //发出提示音和关闭红灯,表示测量完毕
    digitalWrite(laser,HIGH);
   
    //发出提示音
    analogWrite(Buz,100);
    delay(50);
    digitalWrite(Buz,HIGH);
   
    //关闭红灯,表示测量完毕
    digitalWrite(Red, LOW);

    delay(1000);
  }

  if (operatingValue == HIGH) {
    //清空数据
     temp = 0.0;
     showTempture();
     }


}[/mw_shl_code]




该用户从未签到

发表于 2020-3-18 22:42 | 显示全部楼层
牛人,手头没有红外模块只能等疫情过去以后再说了。
  • TA的每日心情
    郁闷
    2020-7-2 07:20
  • 签到天数: 508 天

    [LV.9]以坛为家II

    发表于 2020-3-19 08:17 | 显示全部楼层
    很强大,支持!

    该用户从未签到

     楼主| 发表于 2020-3-19 08:22 | 显示全部楼层
    U8G2默认把I2C频率设置在400KHz, 错误更正。

    该用户从未签到

    发表于 2020-3-20 17:47 | 显示全部楼层
    前二周本来也想自制一个的,发现模块根本买不到,而且价格超贵,今天看你的作品外型,忽然就没有做了动力了。。。。

    该用户从未签到

     楼主| 发表于 2020-3-20 21:12 | 显示全部楼层
    hawkling 发表于 2020-3-20 17:47
    前二周本来也想自制一个的,发现模块根本买不到,而且价格超贵,今天看你的作品外型,忽然就没有做了动力了 ...

    怎么? 我的这个造型就倒你胃口? 用雪糕片是最简洁的制作,疫情期间功能是一位的,美观其次。当然主要原因是本人没有3D打印机,如果有条件我也希望做的更漂亮些。
  • TA的每日心情
    奋斗
    2020-3-29 09:28
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    发表于 2020-3-24 08:01 来自手机 | 显示全部楼层
    太好了,我之前一直在找这个个无法通讯的问题,原来是频率问题

    该用户从未签到

    发表于 2020-3-25 01:36 | 显示全部楼层
    真的好强大
  • TA的每日心情
    开心
    2019-12-31 16:43
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2020-3-31 10:01 | 显示全部楼层
    2月27号就上淘宝买了一个32块的,至今没发货。我看他能拖到哪天发货。朋友,你要是暂没用,出一个给我呗

    该用户从未签到

     楼主| 发表于 2020-4-2 20:26 | 显示全部楼层
    swztxy 发表于 2020-3-31 10:01
    2月27号就上淘宝买了一个32块的,至今没发货。我看他能拖到哪天发货。朋友,你要是暂没用,出一个给我呗:lo ...

    我也没有什么余粮呀
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    Arduino如何输出ASCii 的控制字符串ENQ为05H
    Arduino如何输出ASCii 的
    程序段 void loop() { Serial.print("ENQ1234"); } Arduino会转换成ASCii码发送
    点阵时钟 验证报错 求大神帮个忙
    点阵时钟 验证报错 求大神
    智慧食堂,让吃饭有着不一样的体验!
    智慧食堂,让吃饭有着不一
    以后凭脸吃饭啦!不在乎颜值、不管是谁,小编告诉你:只要“脸”就可以! “吃饭5分
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表