1、背景
在新冠舆情肆虐的今天,人们从来没有如此关注自己和身边人的体温,只要一听到有人发高烧那必定远远躲开。现在去公共场所,在入口的地方也必定需要进行测温。那作为工程师,就想到DIY一个云端一体测温仪。
能持续不断地监控家庭成员 和 到访朋友的温度哦,如果温度异常蜂鸣器就会警报,并且可推送消息到您的手机端。
2、方案
2.1、硬件选型
硬件就选用HaaS EDU K1做为一个主要模块。HaaS EDU K1集成阿里专用高性能MCU-HaaS1000,支持双频2.4G/5G Wi-Fi, BT5.0/BLE5.0,丰富的传感器,包含9轴运动传感器,磁力计,温湿度,大气压,光照,声音等传感器,双屏配置,适应各种场景,自带1200mA可充电锂电池,可脱离外接电源使用,标配type-c接口,充电/烧录/串口调试一口搞定。更重要的是有外接扩展接口,非常方便的可以扩展外部的传感器或其他器件。
同样的选用HaaS100的话,除了需要单独外接屏幕外,其他都是完全一致的。
由于HaaS EDU K1内置的温湿度只能测量内部的温度,无法测量人的体温。所以这里选用GY-906红外测温传感器模块,他是开源硬件平台上常用的红外测温模块。
这样的话,HaaS EDU K1搭配GY-906就形成一个简单的红外测温仪。
2.2、原理
测温方式一般可分为接触式和非接触式,接触式测温只能测量被测物体与测温传感器达到热平衡后的温度,所以响应时间长,且极易受环境温度的影响。而红外测温是根据被测物体的红外辐射能量来确定物体的温度,不与被测物体接触,具有影响动被测物体温度 分布场,温度分辨率高、响应速度快、测温范围广、不受测温上限的限制、稳定性好等特点。
由于物体红外辐射能量的大小和波长的分布与其表面温度关系密切,因此通过对物体自身红外辐射的测量,能准确地确定其表面温度,红外测温就是利用这一原理测量温度的。红外测温器由光学系统、光电探测器、信号放大器和信号处理及输出等部分组成。
GY-906红外测温传感器模块内部有一个MLX90614模块,他是一个通用的红外测温模块,他在出厂前改模块已进行了校验及线性化,具有非接触,体积小,精度高,成本低等优点。非常适合用在手持设备及医疗设备中。
3、制作
3.1、物料
3.2、组装
GY-906的管脚只有四个,名称和功能如下
名称 |
功能 |
VIN |
电源, 可直接使用3.3伏供电 |
SCL |
SMBus接口的时钟信号 |
SDA |
PWM或者SMBus接口的时钟信号 |
GND |
电源地 |
MLX90614支持PWM和SMBus方式,实际使用中, 发现SMBus能和I2C协议兼容,可以直接接CPU的I2C。本文中就采用SMBus方式。
HaaS EDU K1扩展接口中有I2C1接口,可以直接用,完整的接线如下所示
HaaS EDU K1 引脚 |
GY-906引脚 |
VCC_3V3 (2) |
VIN |
GND(30) |
GND |
I2C_SCL1(15) |
SCL |
I2C_SDA1(17) |
SDA |
3.3、云端配置
参考文章《阿里云物联网平台快速入门实践》创建一个名叫“HaaS抗疫测温仪”的产品,并添加一个设备“HaaS_Temp0”,并且有人体温度这个属性。
3.4、软件编码
HaaS EDU K1开源代码中有一个application/exaple/edu_demo,里面是出厂时随机示例程序的代码。本案例直接在此代码上新增软件编码。
3.4.1 读取温度
新增一个mlx90614.h和mlx90614.c, 读取温度的代码在mlx90614.c中
-
#include <stdio.h>
-
-
#include <stdlib.h>
-
-
#include "aos/hal/i2c.h"
-
-
#include "mlx90614.h"
-
-
-
-
static
i2c_dev_t i2c_dev;
-
-
-
-
void mlx90614_init(void)
-
-
{
-
-
i2c_dev.port =
1;
-
-
i2c_dev.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;
-
-
i2c_dev.config.freq = I2C_BUS_BIT_RATES_100K;
-
-
i2c_dev.config.mode = I2C_MODE_MASTER;
-
-
i2c_dev.config.dev_addr = SLAVE_ADDR;
-
-
hal_i2c_init(&i2c_dev);
-
-
}
-
-
-
-
uint16_t mlx90614_readreg(uint8_t regAddr) {
-
-
uint16_t data;
-
-
uint8_t in_buff[
3];
-
-
int32_t ret0 =
-1;
-
-
-
-
ret0 = hal_i2c_mem_read(&i2c_dev, i2c_dev.config.dev_addr, regAddr,
-
-
1, in_buff,
3,
1000);
-
-
data = (in_buff[
1] <<
8 | in_buff[
0]);
-
-
-
-
return data;
-
-
}
-
-
-
-
float mlx90614_readtemp(uint8_t regAddr) {
-
-
float temp;
-
-
uint16_t data;
-
-
-
-
data = mlx90614_readreg(regAddr);
-
-
temp = data*
0.02 -
273.15;
-
-
-
-
return temp;
-
-
}
3.4.2 本地显示
用于本地OLED显示的代码在thermometer.c中,按HaaS EDU K1示例框架代码增加thermometer_task 这个任务,里面每隔1秒去读取温度的值。并提供对外的获取温度的接口,外部需要比每次一秒更加高的频率来获取温度。而且可以增加当温度超过正常值蜂鸣器报警等功能。
-
void thermometer_task(void)
-
-
{
-
-
float temp;
-
-
uint8_t temp_str[
10];
-
-
-
-
while (
1)
-
-
{
-
-
temp = mlx90614_readtemp(RAM_TOBJ1);
-
-
sprintf(temp_str,
"T : %5.1fC", temp);
-
-
-
-
OLED_Icon_Draw(
14,
4+
20, &icon_thermo_24_24,
0);
-
-
OLED_Show_String(
42,
8+
20, temp_str,
16,
1);
-
-
OLED_Refresh_GRAM();
-
-
-
-
temp_notify = temp;
-
-
aos_msleep(
1000);
-
-
}
-
-
}
-
-
-
-
float get_temp()
-
-
{
-
-
return temp_notify;
-
-
}
3.4.3 上传云端
HaaS EDU K1上传数据到阿里云物联网平台只要是使用Linkkit这个SDK。这个每个600ms去读取一次温度,并上报到云端,在这里为了避免数据太多,可以过滤掉正常数据,比如只有当温度值大于37.5°C时才上传到云端。
-
void report_temp(void)
-
-
{
-
-
float temp =
0;
-
-
int res =
0;
-
-
char property_payload[
30] = {
0};
-
-
-
-
temp = get_temp();
-
-
LOGI(
"APP",
"temp -> %f\n",temp);
-
-
//if(temp > 37.5){
-
-
HAL_Snprintf(property_payload,
sizeof(property_payload),
"{\"BodyTemperature\": %5.1f}", temp);
-
-
res = IOT_Linkkit_Report(EXAMPLE_MASTER_DEVID, ITM_MSG_POST_PROPERTY,
-
-
(
unsigned
char *)property_payload,
strlen(property_payload));
-
-
// }
-
-
}
-
HaaS EDU K1本身自带wifi, 通过类似如下命令完成wifi联网,之后会自动连接云云端。
netmgr -t wifi -c haas-open 12345678
连上后,可以在云端查看到上传的温度。
4、总结
本案例通过HaaS EDU K1和GY-906红外测温模组,非常简单就制作了一个云端一体的抗疫测温仪。随时随地地保护您和家人的健康。从这个案例可以看出HaaS软硬件积木,硬件积木组合方便,且天生自带连云功能,是您学习开发非常好的助手。
5、开发者技术支持
如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号
更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/
转载:https://blog.csdn.net/HaaSTech/article/details/113780315