RT-Thread開發之路(7)— 通過訂閱的JSON格式主題消息配合BH1750控制LED亮滅

通過訂閱的JSON格式主題消息配合BH1750控制LED亮滅

基於之前的工程:RT-Thread開發之路(6)— 通過I2C獲取BH1750光傳感器數據

一、添加Json軟件包

打開【RT-Thread Settings】,點擊添加軟件包,搜索cjson,然後點擊添加:
在這裏插入圖片描述
保存使之生效後,我們可以看到,cJSON軟件包已經添加進來了:
在這裏插入圖片描述

二、編寫程序,解析主題信息

接下來定義如json格式的程序來控制LED的的亮滅:

{
	"is_auto": 1/0,  // 設置LED的亮滅是否由BH1750自動控制
	"light_sw": 1/0, // 若不是自動控制,則通過這個值來設定亮滅,若自動控制,則無效
	"lux_value": 1-65535 // 自動控制下,光照強度大於這個值,LED滅,小於則亮
}

修改app_mqtt.c代碼,首先添加json頭文件

#include "cJSON.h"

然後定義對應控制的變量

static int is_auto = 1;     // 設置LED的亮滅是否由BH1750自動控制,默認自動控制
static int light_sw = 0;    // 若不是自動控制,則通過這個值來設定亮滅,若自動控制,則無效
static int lux_value = 50;  // 自動控制下,光照強度大於這個值,LED滅,小於則亮

在收到主題消息回調函數裏解析json代碼:

/* 收到訂閱的"Bear_Pi"主題的消息時的回調函數*/
static void mqtt_sub_callback(MQTTClient *c, MessageData *msg_data)
{
    *((char *)msg_data->message->payload + msg_data->message->payloadlen) = '\0';
    rt_kprintf("Receive topic: %.*s, message data:\r\n", msg_data->topicName->lenstring.len, msg_data->topicName->lenstring.data);
    rt_kprintf("%.*s\r\n", msg_data->message->payloadlen, (char *)msg_data->message->payload);

    cJSON *root = RT_NULL, *object = RT_NULL;
    root = cJSON_Parse((const char *)msg_data->message->payload);
    if (!root)
    {
        rt_kprintf("No memory for cJSON root!\n");
        return;
    }
    object = cJSON_GetObjectItem(root, "is_auto");
    if(object->type == cJSON_Number)
        is_auto = object->valueint;

    object = cJSON_GetObjectItem(root, "light_sw");
    if(object->type == cJSON_Number)
        light_sw = object->valueint;

    object = cJSON_GetObjectItem(root, "lux_value");
    if(object->type == cJSON_Number)
        lux_value = object->valueint;
}

然後在線程while循環裏,檢測這三個變量的值,然後控制E53_SC1模組上LED的亮滅

rt_pin_mode(Light_PIN, PIN_MODE_OUTPUT);
while(1)
{
    //rt_sprintf(msg_buf, "publish %d times.", count++);
    //paho_mqtt_publish(&client, QOS1, "BearPi_Pub", msg_buf);
    if(is_auto == 0)
    {
        if(light_sw == 1)
        {
            rt_pin_write(Light_PIN, 1); //亮
            rt_kprintf("Auto is disable,light is on \n");
        }
        else {
            rt_pin_write(Light_PIN, 0); //滅
            rt_kprintf("Auto is disable,light is off \n");
        }
    }
    else
    {
        if(bh1750_lux < lux_value)
        {
            rt_pin_write(Light_PIN, 1); //亮
            rt_kprintf("Auto is enable, lux_value = %d, light is on \n",lux_value);
        }
        else {
            rt_pin_write(Light_PIN, 0); //滅
            rt_kprintf("Auto is enable, lux_value = %d, light is off \n",lux_value);
        }
    }
    rt_thread_mdelay(10![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200506234650951.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MTEzMDA2,size_16,color_FFFFFF,t_70)
00);
}

三、運行測試

我們下載程序,運行結果如下,遮擋BH1750的關照,可以看到其LED的亮滅
在這裏插入圖片描述
然後我們發佈一下消息測試,可以看到,測試成功
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章