锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-05-30 07:07:00 wl系列传感器wlcal5230b在线红外温度传感器

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

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


前言

之前用 arduino(arduino 开发制导) 做个傻吧唧 红外测温枪后来跟着 Spirit 1 成功制作官方文件可以使设备和 Spirit 1 通讯的 调试用 demo,虽然 BUG 有一亿多但是!至少可以用!
( ? ˙?˙ )?牛逼!!,通信解决了,服务器有了,就不能开始了 做事!>?

硬件选择

以前的硬件 红外测温枪 安信可完全一致 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 (iFi.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 上显示的信息
代码如下(示例):

#include "Arduino.h" 
#include  
#include 
#include 
#include 
#include 
#include 

#define SDDC_CFG_PORT 680U // SDDC 协议使用的端口号
#define PIN_INPUT 0 // 选择 IO0 进行控制
#define ESP_KEY_TASK_STACK_SIZE 4096
#define ESP_KEY_TASK_PRIO 25

static 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 但是证明了这东西确实可以作为我自己的智能设备服务器使用!之后想办法写个小应用出来!

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

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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章