通過訂閱的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的亮滅
然後我們發佈一下消息測試,可以看到,測試成功