esp32_amg8833

介绍

用基于ESP32+amg8833模块开发的红外热成像测温仪,开发板用的是TTGO T-Display ESP32,测温模块用的是AMG8833 IR 8x8红外热像传感器。
在新冠战疫的环境下,不仅一罩(口罩)难求,还有一枪(测温枪)难求。咱就自己搞个测温枪吧。
最初的想法是红外测温枪+人脸识别,放在学校门口,就可以为师生每天自动记录体温了。趁全国人民做月子期间,试着做做吧。

接线说明

AMG8833 ESP32 说明
VIM 5V
GND GND
SDA 21 wire_sda
SCL 22 wire_scl


我淘来的amg8833板子有两排针脚的。刚开始想不明白为什么为么多针脚,了解了才知道,AMG8833字那排针脚没有啥实际意义的,就是为了方便固定用的。有针脚说明那排才有意义。

开发环境

我用的是vs code+platformio,也可以直接用arduino ide。
安装Adafruit AMG88xx Library库,人家已经为你写好驱动库了,调用即可
本代码基于example里的thermal_cam_interpolate

AMG8833的分辨是88的,要显示成图像的话,就看到一个88的格子,很粗,很粗,很粗。根本成不了像,thermal_cam_interpolate里的算法,是根据格子单的温度做拆分的,形成更细的分辨率,有兴趣的同学可以看看interpolate_image,该部分功能在项目里我放到了interpolation.cpp .h里了。

程序中增加了温度对比条显示,中心点温度、最高温度、最低温度。

代码在gitee仓库自行取。

测温效果

测个水杯的温度

测个手的温度

我用测温枪实测对比后,发现温度还是挺准的。
这个红红的外壳请忽视,做其它项目时的半成品。

main代码

#include <Arduino.h>
#include <TFT_eSPI.h>
#include <Button2.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_AMG88xx.h>
#include "interpolation.h"TFT_eSPI tft = TFT_eSPI();
Button2 btn1(35);
Button2 btn2(0);/*256位的温度颜色对照表*/
const uint16_t camColors[] = {0x480F,
0x400F,0x400F,0x400F,0x4010,0x3810,0x3810,0x3810,0x3810,0x3010,0x3010,
0x3010,0x2810,0x2810,0x2810,0x2810,0x2010,0x2010,0x2010,0x1810,0x1810,
0x1811,0x1811,0x1011,0x1011,0x1011,0x0811,0x0811,0x0811,0x0011,0x0011,
0x0011,0x0011,0x0011,0x0031,0x0031,0x0051,0x0072,0x0072,0x0092,0x00B2,
0x00B2,0x00D2,0x00F2,0x00F2,0x0112,0x0132,0x0152,0x0152,0x0172,0x0192,
0x0192,0x01B2,0x01D2,0x01F3,0x01F3,0x0213,0x0233,0x0253,0x0253,0x0273,
0x0293,0x02B3,0x02D3,0x02D3,0x02F3,0x0313,0x0333,0x0333,0x0353,0x0373,
0x0394,0x03B4,0x03D4,0x03D4,0x03F4,0x0414,0x0434,0x0454,0x0474,0x0474,
0x0494,0x04B4,0x04D4,0x04F4,0x0514,0x0534,0x0534,0x0554,0x0554,0x0574,
0x0574,0x0573,0x0573,0x0573,0x0572,0x0572,0x0572,0x0571,0x0591,0x0591,
0x0590,0x0590,0x058F,0x058F,0x058F,0x058E,0x05AE,0x05AE,0x05AD,0x05AD,
0x05AD,0x05AC,0x05AC,0x05AB,0x05CB,0x05CB,0x05CA,0x05CA,0x05CA,0x05C9,
0x05C9,0x05C8,0x05E8,0x05E8,0x05E7,0x05E7,0x05E6,0x05E6,0x05E6,0x05E5,
0x05E5,0x0604,0x0604,0x0604,0x0603,0x0603,0x0602,0x0602,0x0601,0x0621,
0x0621,0x0620,0x0620,0x0620,0x0620,0x0E20,0x0E20,0x0E40,0x1640,0x1640,
0x1E40,0x1E40,0x2640,0x2640,0x2E40,0x2E60,0x3660,0x3660,0x3E60,0x3E60,
0x3E60,0x4660,0x4660,0x4E60,0x4E80,0x5680,0x5680,0x5E80,0x5E80,0x6680,
0x6680,0x6E80,0x6EA0,0x76A0,0x76A0,0x7EA0,0x7EA0,0x86A0,0x86A0,0x8EA0,
0x8EC0,0x96C0,0x96C0,0x9EC0,0x9EC0,0xA6C0,0xAEC0,0xAEC0,0xB6E0,0xB6E0,
0xBEE0,0xBEE0,0xC6E0,0xC6E0,0xCEE0,0xCEE0,0xD6E0,0xD700,0xDF00,0xDEE0,
0xDEC0,0xDEA0,0xDE80,0xDE80,0xE660,0xE640,0xE620,0xE600,0xE5E0,0xE5C0,
0xE5A0,0xE580,0xE560,0xE540,0xE520,0xE500,0xE4E0,0xE4C0,0xE4A0,0xE480,
0xE460,0xEC40,0xEC20,0xEC00,0xEBE0,0xEBC0,0xEBA0,0xEB80,0xEB60,0xEB40,
0xEB20,0xEB00,0xEAE0,0xEAC0,0xEAA0,0xEA80,0xEA60,0xEA40,0xF220,0xF200,
0xF1E0,0xF1C0,0xF1A0,0xF180,0xF160,0xF140,0xF100,0xF0E0,0xF0C0,0xF0A0,
0xF080,0xF060,0xF040,0xF020,0xF800,};//low range of the sensor (this will be blue on the screen)
#define MINTEMP 14
//high range of the sensor (this will be red on the screen)
#define MAXTEMP 30/*32*32为优化后的分辨率,不宜太高,提升分辨率修改此处即可*/
#define INTERPOLATED_COLS 32
#define INTERPOLATED_ROWS 32
#define AMG_COLS 8
#define AMG_ROWS 8Adafruit_AMG88xx amg;
unsigned long delayTime;
float pixels[AMG_COLS * AMG_ROWS];
uint16_t displayPixelWidth, displayPixelHeight;
uint16_t displayPixelX, displayPixelY;/* 画温度颜色对比条 */
void drawTemperateBar () {const int colorSize = 256;const int barHeight = 128;const int barWidth = 10;const int posY = (tft.height()-barHeight)/2-1;for(int i=0; i<colorSize; i++) {int x = i/barHeight;tft.drawLine(14+x*barWidth, barHeight-i%barHeight+posY, 14+x*barWidth+barWidth, barHeight-i%barHeight+posY, camColors[i]);}tft.setTextSize(1);tft.setTextDatum(BL_DATUM);tft.setTextColor(camColors[0]);tft.drawString(String(MINTEMP), 0, tft.height());tft.setTextColor(camColors[barHeight]);tft.drawString(String(MINTEMP+int(MAXTEMP-MINTEMP)/2), 38, tft.height());tft.setTextDatum(TL_DATUM);tft.setTextColor(camColors[barHeight-1]);tft.drawString(String(MINTEMP+int(MAXTEMP-MINTEMP)/2), 0, 0);tft.setTextColor(camColors[colorSize-1]);tft.drawString(String(MAXTEMP), 38, 0);
}/* 画热成像素点 */
void drawpixels(float *p, uint8_t rows, uint8_t cols, uint8_t boxWidth, uint8_t boxHeight, boolean showVal) {int colorTemp;float curMax = get_point(p, rows, cols, 0, 0), curMin = get_point(p, rows, cols, 0, 0), curMid = get_point(p, rows, cols, cols/2, rows/2);uint16_t colorMax = camColors[0], colorMin = camColors[0],colorMid = camColors[0]; //画热成像for (int y=0; y<rows; y++) {for (int x=0; x<cols; x++) {float val = get_point(p, rows, cols, x, y);if(val >= MAXTEMP) colorTemp = MAXTEMP;else if(val <= MINTEMP) colorTemp = MINTEMP;else colorTemp = val;uint8_t colorIndex = map(colorTemp, MINTEMP, MAXTEMP, 0, 255);colorIndex = constrain(colorIndex, 0, 255);//draw the pixels!tft.fillRect(displayPixelX + boxWidth * x, displayPixelY + boxHeight * y, boxWidth, boxHeight, camColors[colorIndex]);//取最大值if(val >= curMax){    curMax = val;colorMax = camColors[colorIndex];}          //取最小值 if(val <= curMin){curMin = val;colorMin = camColors[colorIndex];}//取中心点if(y == rows/2 && x == cols/2){colorMid = camColors[colorIndex];}if (showVal) {tft.setCursor(boxWidth * y + boxWidth/2 - 12, 40 + boxHeight * x + boxHeight/2 - 4);tft.setTextSize(1);tft.setTextColor(TFT_WHITE);tft.print(val,1);}} }//画中心点十字uint8_t midX = displayPixelX+cols*boxWidth/2;uint8_t midY = displayPixelY+rows*boxHeight/2;tft.drawLine(midX-10, midY, midX+10, midY, TFT_WHITE);tft.drawLine(midX, midY-10, midX, midY+10, TFT_WHITE);char temp[7];tft.setTextSize(1);tft.setTextColor(TFT_WHITE);//显示最高温度tft.setTextDatum(TL_DATUM);tft.drawString(F("MAX"), tft.width()-40, 0);    tft.fillRect(tft.width()-45, 10, 40, 30, colorMax);  tft.setTextDatum(CL_DATUM);memset(temp, 0, sizeof(temp));sprintf(temp, "%0.1f", curMax);tft.drawString(String(temp), tft.width()-40, 25);//显示最低温度tft.setTextDatum(TL_DATUM);tft.drawString(F("MIN"), tft.width()-40, 47);    tft.fillRect(tft.width()-45, 57, 40, 30, colorMin); tft.setTextDatum(CL_DATUM);     memset(temp, 0, sizeof(temp));sprintf(temp, "%0.1f", curMin);tft.drawString(String(temp), tft.width()-40, 72);//显示中心点温度tft.setTextDatum(TL_DATUM);tft.drawString(F("POINT"), tft.width()-40, 94);    tft.fillRect(tft.width()-45, 104, 40, 30, colorMid); tft.setTextDatum(CL_DATUM);memset(temp, 0, sizeof(temp));sprintf(temp, "%0.1f", curMid);tft.drawString(String(temp), tft.width()-40, 119);
}void setup() {Serial.begin(9600); //初始化屏幕tft.init();tft.setRotation(1);tft.fillScreen(TFT_BLACK);tft.setTextColor(TFT_WHITE);tft.setTextSize(2);tft.setTextDatum(MC_DATUM);tft.drawString(F("Thermal Camera"), tft.width()/2, tft.height()/2);delay(2000);tft.fillScreen(TFT_BLACK);  displayPixelWidth = tft.height() / 8;displayPixelHeight = tft.height() / 8;displayPixelX = (tft.width() - displayPixelWidth*8)/2;displayPixelY = (tft.height() - displayPixelHeight*8)/2;drawTemperateBar();bool status;// default settingsstatus = amg.begin();if (!status) {Serial.println("Could not find a valid AMG8833 sensor, check wiring!");while (1);}Serial.println("-- Thermal Camera Test --");delay(100); // let sensor boot up}void loop() {//read all the pixelsamg.readPixels(pixels);/* for(int i=0; i<AMG88xx_PIXEL_ARRAY_SIZE; i++){uint8_t colorIndex = map(pixels[i], MINTEMP, MAXTEMP, 0, 255);colorIndex = constrain(colorIndex, 0, 255);//draw the pixels!tft.fillRect(displayPixelX+displayPixelHeight * floor(i / 8), displayPixelY+displayPixelWidth * (i % 8),displayPixelHeight, displayPixelWidth, camColors[colorIndex]);} *//* Serial.print("[");for(int i=1; i<=AMG88xx_PIXEL_ARRAY_SIZE; i++){Serial.print(pixels[i-1]);Serial.print(", ");if( i%8 == 0 ) Serial.println();}Serial.println("]");Serial.println(); */float dest_2d[INTERPOLATED_ROWS * INTERPOLATED_COLS];//int32_t t = millis();interpolate_image(pixels, AMG_ROWS, AMG_COLS, dest_2d, INTERPOLATED_ROWS, INTERPOLATED_COLS);/* Serial.print("Interpolation took "); Serial.print(millis()-t); Serial.println(" ms"); */uint16_t boxsize = min(tft.width() / INTERPOLATED_COLS, tft.height() / INTERPOLATED_COLS);drawpixels(dest_2d, INTERPOLATED_ROWS, INTERPOLATED_COLS, boxsize, boxsize, false);//delay(100);
}

待完成内容

加个锂电池,再加上电源管理代码,能在屏上再显示个电量。
用smartconfig一键配置连接wifi,把测温数据上传服务器。
加个外壳,用3D打印机打印。

高大上的32*32分辨率的物联网红外成像测温仪就完成了。

基于ESP32+AMG8833的物联网红外成像测温枪相关推荐

  1. 基于ESP32+AMG8833+微信小程序的可联网红外线感应仪

    背景: 在新冠疫情的时代大背景之下,保持安全距离,避免密集接触是环境所致,同时测量体温也是出入公共场合不可或缺的一环,所以实行非接触测温有很大的必要性. 本项目开发了一款在Arduino开发环境下基于 ...

  2. ESP32启明云端又有新玩法|基于ESP32+热像仪传感的物联网非接触智能测温终端为高考护航了

    今天是高考第一天,想想N年前的自己,高考前抱着破罐子破摔的心态,书丢一边,好吃好喝迎高考!所以结局惨淡无比! 不提伤心事了,今天祝所有的高考考生都能取得自己满意的成绩! 今天提到的ESP32的新玩法跟 ...

  3. 【物联网初探】- 09 - 基于 ESP32 和微信小程序的土壤湿度监测【完结篇】

    文章目录 1. 硬件.接线.环境配置 2. 项目简介 2.1 初衷 2.2 技术路线 3. 实现方法 3.1 接线及电源选型 3.2 ESP32 端程序 3.2.1 源码 3.2.2 特别说明 3.3 ...

  4. 【毕业设计项目】基于ESP32的家庭气象站系统 - stm32 物联网 嵌入式 单片机

    文章目录 1 简介 2 主要器件 引脚连接 3 实现效果 4 部分实现代码 5 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍一个学长做的单片机项目 基于ESP32的家庭气象站系统 大家 ...

  5. 红眼睛微型红外成像仪

    现在自己在做红外成像仪的越来越多了,两年前有个井下机电设备运行状态的科研项目,当时使用了 AMG8833(8*8 像素),科研毕竟就是科研,后来也没有听说成果得到应用的消息, 我想也是, 8*8 能干 ...

  6. MLX90640 开发 微型红外成像仪

    现在自己在做红外成像仪的越来越多了,两年前有个井下机电设备运行状态的科研项目,当时使用了 AMG8833(8*8 像素),科研毕竟就是科研,后来也没有听说成果得到应用的消息, 我想也是, 8*8 能干 ...

  7. 基于ESP32的智能家庭健康系统

    M5Stick-c ESP8266 项目背景及概述: 项目最初的想法来源于当下疫情局势,每个人都关心自己及家人的健康状况.因此本产品旨在应用于人们居家隔离或复工复产过程中,对个人身体情况的实时监测.同 ...

  8. 基于stm32+amg8833+openmv实现的人脸跟随测温仪

    基于stm32+amg8833+openmv实现的人脸跟随测温仪 资料链接: 前言 概括 项目实物图 方案 AMG8833温度传感器驱动和目标温度的计算 openmv人脸识别部分 1 .云台舵机PID ...

  9. 基于ESP32的竞赛裁判系统功能调试-计时线圈功能

    简 介: 对于智能车竞赛比赛系统中的电磁检测功能进行了调试,设置了程序运行的主要框架. 关键词: 智能车竞赛,比赛系统,计时系统,ESP32,电磁检测 §01 智能车竞赛裁判系统   中间间隔了一段时 ...

最新文章

  1. new Date(2019-05-10 08:00:00) 格式在IE内核或者低版本浏览器中显示NaN或者Invalid Date的问题...
  2. MTK radiooptions 分析
  3. php中的魔术函数以及魔术常量
  4. Ansible学习实战手记-你想要知道的可能都在这里了
  5. Asp.Net服务器控件开发的Grid实现(二)Html标记渲染
  6. 前端学习(1313):get请求参数
  7. 如何将图片序列化_PS如何将图片制作成gif动态图 ps制作gif动态图教程
  8. 客户端(前端)Ajax中Get请求和Post请求的区别
  9. centos操作系统版本获取
  10. 利用matlab函数创建数组
  11. 谷歌地图的API应用
  12. 输入框字数统计--过滤拼音
  13. CentOS LiveCD U盘安装方法
  14. python绘制3d点云_python – 来自点云的3D凸包
  15. Android 启动过程介绍
  16. PhotoShop永久序列号
  17. 文本 字体 图像 列表
  18. 基于jsp+mysql+Spring+SpringMVC+mybatis的ssm妇女联合会管理系统
  19. AG9300:安格TypeC To VGA单芯片中文设计方案
  20. 2022年天梯赛题目记录

热门文章

  1. 【机器学习】如何理解vias和bias?
  2. Datawhale组队学习周报(第028周)
  3. 软件项目经理需要了解的法律法规
  4. 关于单级PID及串级PID
  5. 变态级JAVA程序员面试32问(转)
  6. svn客户端在服务器创建项目,win7下安装svn服务器端及客户端详细步骤
  7. xss-labs通关大详解
  8. 如何生成tfrecord
  9. Android————一个简单的新闻面板
  10. 分布式事务框架lcn入门demo