通过订阅的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的亮灭
然后我们发布一下消息测试,可以看到,测试成功