前言

之前用 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 地址设置设施惟一标识 UID  sddc_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 上显示的信息
<font color=#999AAA >代码如下(示例):

#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 然而证实了这货色的确能够作为我本人的智能设施服务器应用!之后想方法写个小利用进去!

如果在具体应用上还有什么疑难的能够看看 简略无脑,上手即用 - 手把手教你应用 智能红外温度传感器代码以及依赖库! 我感觉写得十分具体了。

本文仅集体学习应用,如有谬误,欢送斧正, ( )谢谢老板!