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的亮灭
在这里插入图片描述
然后我们发布一下消息测试,可以看到,测试成功
在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值