在新冠舆情肆虐的今天,人们从来没有如此关注自己和身边人的体温,只要一听到有人发高烧那必定远远躲开。现在去公共场所,在入口的地方也必定需要进行测温。那作为工程师,就想到DIY一个云端一体测温仪。
能持续不断地监控家庭成员 和 到访朋友的温度哦,如果温度异常蜂鸣器就会警报,并且可推送消息到您的手机端。
硬件就选用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就形成一个简单的红外测温仪。
测温方式一般可分为接触式和非接触式,接触式测温只能测量被测物体与测温传感器达到热平衡后的温度,所以响应时间长,且极易受环境温度的影响。而红外测温是根据被测物体的红外辐射能量来确定物体的温度,不与被测物体接触,具有影响动被测物体温度 分布场,温度分辨率高、响应速度快、测温范围广、不受测温上限的限制、稳定性好等特点。
由于物体红外辐射能量的大小和波长的分布与其表面温度关系密切,因此通过对物体自身红外辐射的测量,能准确地确定其表面温度,红外测温就是利用这一原理测量温度的。红外测温器由光学系统、光电探测器、信号放大器和信号处理及输出等部分组成。
GY-906红外测温传感器模块内部有一个MLX90614模块,他是一个通用的红外测温模块,他在出厂前改模块已进行了校验及线性化,具有非接触,体积小,精度高,成本低等优点。非常适合用在手持设备及医疗设备中。
材料清单 |
图片 |
购买链接 |
HaaS EDU K1 |
即将上市开售 |
|
GY-906红外测温传感器模块 |
购买链接 |
|
杜邦线 |
母对母10CM:链接1、链接2、链接3 |
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 |
参考文章《阿里云物联网平台快速入门实践》创建一个名叫“HaaS抗疫测温仪”的产品,并添加一个设备“HaaS_Temp0”,并且有人体温度这个属性。
HaaS EDU K1开源代码中有一个application/exaple/edu_demo,里面是出厂时随机示例程序的代码。本案例直接在此代码上新增软件编码。
新增一个mlx90614.h和mlx90614.c, 读取温度的代码在mlx90614.c中
#include
#include
#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;
}
用于本地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;
}
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
连上后,可以在云端查看到上传的温度。
本案例通过HaaS EDU K1和GY-906红外测温模组,非常简单就制作了一个云端一体的抗疫测温仪。随时随地地保护您和家人的健康。从这个案例可以看出HaaS软硬件积木,硬件积木组合方便,且天生自带连云功能,是您学习开发非常好的助手。
如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号
更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/