红外测温枪,超进化!--智能温度传感器!基于 arduino 的智能测温模块。

  • 前言
  • 硬件选择
  • 代码讲解
    • 通过 SDDC 协议接入 Spirit 1 部分
    • 配置设备信息
    • 数据获取与发送流程
  • 融合!特殊召唤:智能温度传感器!
  • 效果
  • 总结

前言

之前用 arduino(arduino 开发制导) 做了一个傻了吧唧的 红外测温枪,后来又照着 Spirit 1 官方文档成功做出来一个能让设备和 Spirit 1 通讯的 调试用 demo,虽然 BUG 有亿点点多,但是!好歹能用了!
( ੭ ˙ᗜ˙ )੭牛逼!!!,通讯解决了,服务器有了,那不得开始 搞事情!!!٩(๑>◡<๑)۶ 开始利用 Spirit 1 做一个能通过手机控制和查看的智能红外测温模块。

硬件选择

硬件与之前的 红外测温枪 完全一致,安信可 ESP32S 开发板+ GY906 (MLX90614ESF ) 红外测温传感器。详细介绍和引脚图可以看之前红外测温枪的文档。

而 Spirit 1 的使用和介绍可以看我之前的 搭载着EdgerOS 的 Spirit 1 开箱 和 超便宜的个人智能设备服务器!-- 边缘计算机 Spirit 1 初体验,也是淘宝就能搜到。

代码讲解

我自己移植了一个他们的 sddc 库,在 Spirit 1 官方的 demo 的基础上对 arduino 做了适配,接入了红外测温枪流程。

通过 SDDC 协议接入 Spirit 1 部分

在 setup 函数中初始化 SDDC 协议,然后在 loop 函数运行 SDDC 协议主循环,

void setup() {byte mac[6];char *data;int ret;// 初始化打印串口Serial.begin(115200);Serial.setDebugOutput(true);Serial.println();// 启动红外模块mlx.begin();// 清除一下按键状态机的状态button.reset();// 创建按键扫描线程,长按 IO0 按键,松开后ESP32 将会进入 SmartConfig 模式sddc_printf("长按按键进入 Smartconfig...\n");button.attachLongPressStop(esp_io0_key_task);xTaskCreate(esp_tick_task, "button_tick", ESP_KEY_TASK_STACK_SIZE, NULL, ESP_KEY_TASK_PRIO, NULL);// 启动 WiFi 并且连接网络WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}// 获取并打印 IP 地址Serial.println("");Serial.println("WiFi connected");Serial.print("'ip :");Serial.print(WiFi.localIP());Serial.println("' to connect");   // 创建 SDDC 协议对象g_sddc = sddc_create(SDDC_CFG_PORT);// 设置事件响应函数sddc_set_on_message(g_sddc, iot_pi_on_message);                              // 设置接收消息请求时的回调函数sddc_set_on_message_ack(g_sddc, iot_pi_on_message_ack);                      // 设置接收消息确认时的回调函数sddc_set_on_message_lost(g_sddc, iot_pi_on_message_lost);                    // 设置丢失消息时的回调函数sddc_set_on_invite(g_sddc, iot_pi_on_invite);                                // 设置接受邀请请求时的回调函数sddc_set_on_invite_end(g_sddc, iot_pi_on_invite_end);                        // 设置发送邀请后的回调函数sddc_set_on_update(g_sddc, iot_pi_on_update);                                // 设置接收更新请求时的回调函数sddc_set_on_edgeros_lost(g_sddc, iot_pi_on_edgeros_lost);                    // 设置 EdgerOS 断连时的回调函数// 设置设备密码
#if SDDC_CFG_SECURITY_EN > 0                                                   // SDDC_CFG_SECURITY_EN 宏控制是否支持数据加密通信ret = sddc_set_token(g_sddc, "1234567890");
#endif // 创建并设置 Report 报文数据data = iot_pi_report_data_create();sddc_return_if_fail(data);sddc_set_report_data(g_sddc, data, strlen(data));// 创建并设置 Invite 报文数据data = iot_pi_invite_data_create();sddc_return_if_fail(data);sddc_set_invite_data(g_sddc, data, strlen(data));// 获取并打印网卡 mac 地址WiFi.macAddress(mac);sddc_printf("MAC addr: %02x:%02x:%02x:%02x:%02x:%02x\n",mac[5], mac[4], mac[3], mac[2], mac[1], mac[0]);// 使用网卡 mac 地址设置设备唯一标识 UIDsddc_set_uid(g_sddc, mac);
}void loop() {// 运行 SDDC 协议循环while (1) {sddc_printf("SDDC running...\n");sddc_run(g_sddc);sddc_printf("SDDC quit!\n");}// 销毁 SDDC 协议sddc_destroy(g_sddc);
}

配置设备信息

这部分代码可以配置 WiFi 名字和 WiFi 密码,按键引脚和按键状态,并且配置设备在 Spirit 1 上显示的信息
代码如下(示例):

#include "Arduino.h"
#include <OneButton.h>
#include <WiFi.h>
#include <sddc.h>
#include <cJSON.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>#define SDDC_CFG_PORT             680U             // SDDC 协议使用的端口号
#define PIN_INPUT 0                                // 选择 IO0 进行控制
#define ESP_KEY_TASK_STACK_SIZE   4096
#define ESP_KEY_TASK_PRIO         25static sddc_t *g_sddc;
static const char* ssid = "EOS-000045";            // WiFi 名
static const char* password = "1234567890";        // WiFi 密码OneButton button(PIN_INPUT, true);
Adafruit_MLX90614 mlx = Adafruit_MLX90614();/** 创建 REPORT 数据*/
static char *iot_pi_report_data_create(void)
{cJSON *root;cJSON *report;char *str;root = cJSON_CreateObject();sddc_return_value_if_fail(root, NULL);report = cJSON_CreateObject();sddc_return_value_if_fail(report, NULL);cJSON_AddItemToObject(root, "report", report);cJSON_AddStringToObject(report, "name",   "红外测温模块");cJSON_AddStringToObject(report, "type",   "device");cJSON_AddBoolToObject(report,   "excl",   SDDC_FALSE);cJSON_AddStringToObject(report, "desc",   "ESP32S");cJSON_AddStringToObject(report, "model",  "1");cJSON_AddStringToObject(report, "vendor", "灵感桌面");str = cJSON_Print(root);sddc_return_value_if_fail(str, NULL);sddc_printf("REPORT DATA: %s\n", str);cJSON_Delete(root);return str;
}
/** 创建 INVITE 数据*/
static char *iot_pi_invite_data_create(void)
{cJSON *root;cJSON *report;char *str;root = cJSON_CreateObject();sddc_return_value_if_fail(root, NULL);report = cJSON_CreateObject();sddc_return_value_if_fail(report, NULL);cJSON_AddItemToObject(root, "report", report);cJSON_AddStringToObject(report, "name",   "红外测温模块");cJSON_AddStringToObject(report, "type",   "device");cJSON_AddBoolToObject(report,   "excl",   SDDC_FALSE);cJSON_AddStringToObject(report, "desc",   "ESP32S");cJSON_AddStringToObject(report, "model",  "1");cJSON_AddStringToObject(report, "vendor", "灵感桌面");str = cJSON_Print(root);sddc_return_value_if_fail(str, NULL);sddc_printf("INVITE DATA: %s\n", str);cJSON_Delete(root);return str;
}

数据获取与发送流程

iot_pi_on_message() 是在 setup 设置的接收消息请求时的回调函数,设备收到 Spirit 1 发过来的 message 后就会进入这个函数,我们就在这写我们需要的处理流程。

/** 事件响应函数*/
static sddc_bool_t iot_pi_on_message(sddc_t *sddc, const uint8_t *uid, const char *message, size_t len)
{cJSON *root = cJSON_Parse(message);cJSON *item;cJSON *temperature;char *str;char *msg;sddc_return_value_if_fail(root, SDDC_TRUE);str = cJSON_Print(root);sddc_goto_error_if_fail(str);sddc_printf("iot_pi_on_message: %s\n", str);cJSON_free(str);// 判断收到的是否是红外测温传感器命令if((item = cJSON_GetObjectItem(root, "unit")) != NULL){sddc_return_value_if_fail(item, SDDC_TRUE);msg = cJSON_Print(item);sddc_printf("iot_pi_on_msg: %s\n", msg);temperature = cJSON_CreateObject();sddc_return_value_if_fail(temperature, SDDC_TRUE);// 判断需要发送的是否是摄氏温度if ((strcmp(item->valuestring, "Centigrade")) == 0){Serial.print("环境温度 Ambient = "); Serial.print(mlx.readAmbientTempC()); Serial.print("*C\t 目标温度 Object = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C");cJSON_AddNumberToObject(temperature, "Ambient temperature C", mlx.readAmbientTempC());cJSON_AddNumberToObject(temperature, "Object temperature C", mlx.readAmbientTempC());}// 判断需要发送的是否是华氏温度if ((strcmp(item->valuestring, "Degree")) == 0){Serial.print("环境温度 Ambient = "); Serial.print(mlx.readAmbientTempF()); Serial.print("*F\t 目标温度 Object = "); Serial.print(mlx.readObjectTempF()); Serial.println("*F");cJSON_AddNumberToObject(temperature, "Ambient temperature F", mlx.readAmbientTempF());cJSON_AddNumberToObject(temperature, "Object temperature F", mlx.readAmbientTempF());}// 发送消息msg = cJSON_Print(temperature);sddc_send_message(sddc, uid, msg, strlen(msg), 1, SDDC_FALSE, NULL);cJSON_free(msg);
//        cJSON_Delete(temperature);}error:cJSON_Delete(temperature);cJSON_Delete(root);return SDDC_TRUE;
}

代码写完之后烧录进去就完事了,和之前完全一样,点一下保存,然后上传OK,具体可以看上一篇文档 我就懒得再写一遍啦 (/ω\)

融合!特殊召唤:智能温度传感器!

传感器设备准备完毕!现在我的场上有一只可以连接 WIFI 的温度传感器,还有一只可以作为服务器的 Spirit 1 !现在就可以发动融合卡!设备连接,特殊召唤出一只智能温度传感器!

具体过程参考:官方的 SDDC 协议介绍 中Wi-Fi 智能配网的章节。

第一步:打开我们那空空如也设备应用,点击下方的 + :

第二部:点击加号之后,等了一会就看见我的设备了!

添加成功!:点击添加,输入自己设定的密码(官方代码里默认是 1234567890)就能完成添加:

效果

打开我们之前写的 调试工具 输入命令可以看到确实收到了传感器返回的温度!ヾ(゚∀゚ゞ) 不过目前只能用这个 demo 手动构筑报文,还是比较 LOW 以后想办法自己写一个专门的应用吧!(๑>ڡ<)✿

总结

现在自制智能家居设备的小目标又近了一步!(๑>ڡ<)✿ 虽然现在只是个小小的 demo 但是证明了这东西确实可以作为我自己的智能设备服务器使用!之后想办法写个小应用出来!

如果在具体使用上还有什么疑问的可以看看 简单无脑,上手即用 - 手把手教你使用 智能红外温度传感器代码以及依赖库! 我觉得写得非常详细了。

本文仅个人学习使用,如有错误,欢迎指正, ( ੭ ˙ᗜ˙ )੭谢谢老板!

红外测温枪,超进化 -- 智能温度传感器 基于 arduino 的智能测温模块相关推荐

  1. 【毕业设计】基于Arduino的智能灌溉系统 - 嵌入式 单片机 物联网

    文章目录 1 简介 1 硬件要求 2 项目背景 3 实现功能 4 OLDE显示屏 5 IO扩展器 6 系统构建 7 完整代码 8 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片 ...

  2. 基于Arduino的智能家居系统设计

    基于Arduino的智能家居系统设计 一.设计要求 1.利用DHT11温湿度检测模块和光敏电阻采集环境温度.湿度和光强信息: 2.通过Arduino开发板对DS1302时钟模块进行初始设置,并每隔一定 ...

  3. arduino灯光装置_基于Arduino的智能家居灯控系统设计

    &能应用 ------ T X 阵 W S 2 8 1 2 全 彩 灯 带 R X 工 G N D r 0 引言 智能家居的概念虽然已经有了几十年,但进入我国并取 得一定发展还是最近几年的事, ...

  4. 基于Arduino的智能洗手机

    目录 引言 1 ATMEGA328P 芯片简介 1.1 理论介绍 1.2 芯片引脚定义图 1.3 最小系统制作原理图 2 框架及组成结构 2.1 系统框架 2.2 主要模块介绍 2.2.1 HC-SR ...

  5. 基于Arduino之智能小夜灯项目

    基于Arduino之智能小夜灯项目 目录 基于Arduino之智能小夜灯项目 前言 一.功能介绍 二.实物图 三.设置代码 总结 前言 此小灯是我第一次使用Arduino进行操作的实验,它包含了小夜灯 ...

  6. 基于Arduino的智能晾衣架

    前段时间,由于个人原因没有及时更新,今天准备写一个基于Arduino的智能晾衣架. 摘要: 智能晾衣架是应用物联网工程技术,通过网络和物品的连接得以控制晾衣架的状态.智能晾衣架通过多个传感器来对外界环 ...

  7. 基于arduino单片机智能避障小车

    基于arduino单片机智能避障小车 思路简介 本文简要介绍了基于arduino单片机智能小车可以通过手机端蓝牙助手对其进行遥控操作'可以切换手动操作和自动避障两个模式,避障基于蝙蝠超声波测距的原理, ...

  8. 基于Arduino的智能家居语音识别系统设计

    基于Arduino的智能家居语音识别系统设计 前言:       随着这两年深入中国本土企业,在移动智能终端市场疯狂抢食,英特尔早已"摸清"了中国厂商和市场的情况.现在顺势推出智能 ...

  9. Arduino项目实战——基于Arduino【智能垃圾桶】设计

       Arduino项目实战        -基于Arduino[智能垃圾桶]设计 第一次接触Arduino是在大一的时候,距离现在已经五年,当时一个简单的"电子琴"项目就让我抓耳 ...

最新文章

  1. 知识点讲解七:Python中的异常处理机制
  2. jdk重启后步行_向后介绍步行以一种新颖的方式来预测未来
  3. php常见的面试题目
  4. 多迪技术总监告诉你:学习Python语言有哪些就业方向?
  5. MATLAB数学建模方法与实践(第3版)程序及数据
  6. 百度文库 复制文本 下载文档
  7. java同步和异步概念
  8. 水彩画笔效果PS笔刷
  9. js一键复制并调起微信客户端
  10. Codeblocks 新建操作(单c文件新建和c工程创建)
  11. 光学赛道打响中场战事,康耐特如何掘金万物智能时代?
  12. FinFET与芯片制程
  13. win10连接不上wifi、经常断连问题(高质量修复指南)
  14. LArea 微信端 地址选择
  15. 200 万年薪!西交大 2 位计算机博士入选华为天才少年
  16. 快看!千亿蓝海一触即发,lazada越南致富风口逢卖必爆
  17. 检测鼠标上滑还是下滑
  18. 如何快速校准时间继电器?
  19. 华为OD一次机试的记录
  20. ​Kali-linux无线网络嗅探工具Kismet​

热门文章

  1. 虚拟机网络的拓扑结构
  2. BZOJ5042: LWD的分科岛
  3. Android面试题大全,2021最新Android常用开源库总结
  4. 23届秋招百度笔试算法题
  5. Hellow word!
  6. C++实现_数据分类处理(牛客网华为机试题)
  7. mysql删除工具_有没有mysql卸载工具
  8. 十万首MTV音乐播放器 V6.47
  9. Steam流应用--排序
  10. windows ccproxy下配置ubuntu代理