发帖
3 0 0

【Ai-WB2评测】巴法云MQTT

sujingliang
论坛元老

19

主题

15

回帖

5720

积分

论坛元老

积分
5720
Ai-WB2系列 31 3 昨天 09:56

一、平台准备

1、登录https://bemfa.com/注册个用户

16.png

系统会分配个私钥

2、选择MQTT设备云

17.png

3、新建主题

主题名:AIWB2002,后3位002,表示设备为灯

后三位 说明
001 插座设备
002 灯泡设备
003 风扇设备
004 传感器
005 空调设备
006 开关设备
009 窗帘设备
010 温控器
011 热水器
012 电视
013 空气净化器

18.png

19.png

二、修改程序

以applications/protocols/mqtt/tcp为模板

1、main.c

#define ROUTER_SSID "SSID"
#define ROUTER_PWD "PWD"

修改WIFI登录SSID和密码

2、demo.c

void mqtt_start(void)
{
    pwm_led_init();//pwm 初始化
    axk_mqtt_client_config_t mqtt_cfg = {
        .uri = "mqtt://bemfa.com",//巴法云地址
        .port = 9501,//巴法云端口9501,不是1883
        .client_id = "平台提供的私钥",
        .event_handle = event_cb,//回调
    };
    axk_mqtt_client_handle_t client = axk_mqtt_client_init(&mqtt_cfg);
    axk_mqtt_client_start(client);
}

event_cb函数



static axk_err_t event_cb(axk_mqtt_event_handle_t event)
{
...
case MQTT_EVENT_CONNECTED://MQTT建立连接事件
        blog_info("MQTT_EVENT_CONNECTED");
        // 订阅主题(如 light001)
        axk_mqtt_client_subscribe(client, "AIWB2002", 0);//订阅前面注册的AIWB2002主题
      break;
case MQTT_EVENT_DATA://MQTT接收数据事件
        blog_info("MQTT_EVENT_DATA");
        printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
        printf("DATA=%.*s\r\n", event->data_len, event->data);

         // 判断指令并控制 GPIO
         if (strncmp(event->data, "on#", 3) == 0) {//收到on#44,设置LED亮度为44
            // 2. 提取亮度值(如 "44")
            char brightness_str[4] = {0};
            int brightness = 0;
            strncpy(brightness_str, event->data + 3, event->data_len - 3);
            brightness = atoi(brightness_str);  // 字符串转整数

            // 3. 限制亮度范围(0~255)
            if (brightness < 0) brightness = 0;
            if (brightness > 255) brightness = 255;

            rgb_control(255,255,255,brightness);
        }else if (strncmp(event->data, "on", event->data_len) == 0) {//收到on,设置LED亮度为255
            blog_info("Turn ON LED");
            rgb_control(255,255,255,255);
        } // 处理关闭指令(如 "off")
        else if (strncmp(event->data, "off", event->data_len) == 0) {//收到off,设置LED亮度为0
            rgb_control(255,255,255,0);
            blog_info("Turn OFF LED");
        }
        break;

...
}

pwmled.c

#include <FreeRTOS.h>
#include <task.h>
#include <blog.h>
#include <bl602.h>
#include <bl602_gpio.h>
#include <bl602_glb.h>
#include <bl_pwm.h>
#include "pwmled.h"

#define PWM_Get_Channel_Reg(ch)  (PWM_BASE+PWM_CHANNEL_OFFSET+(ch)*0x20)
#define PWM_STOP_TIMEOUT_COUNT          (160*1000)


GLB_GPIO_Cfg_Type cfg[3] = {
    {
        .drive = 0,
        .smtCtrl = 1,
        .gpioMode = GPIO_MODE_OUTPUT,
        .pullType = GPIO_PULL_DOWN,
        .gpioPin = 14,  /// red
        .gpioFun = 8,
    },
    {
        .drive = 0,
        .smtCtrl = 1,
        .gpioMode = GPIO_MODE_OUTPUT,
        .pullType = GPIO_PULL_DOWN,
        .gpioPin = 17,  /// green
        .gpioFun = 8,
    },
    {
        .drive = 0,
        .smtCtrl = 1,
        .gpioMode = GPIO_MODE_OUTPUT,
        .pullType = GPIO_PULL_DOWN,
        .gpioPin = 3,  /// blue
        .gpioFun = 8,
    },
};

/// @brief Copy from PWM_Smart_Configure. Use Bus Clock instead of External Crystal Clock for PWM Timer
/// @param ch PWM Channel
/// @param clkDiv PWM clock divider
/// @param period PWM period
/// @param threshold2
/// @return
BL_Err_Type PWM_Smart_Configure2(PWM_CH_ID_Type ch, uint16_t clkDiv, uint16_t period,uint16_t threshold2)
{
    uint32_t tmpVal;
    uint32_t timeoutCnt = PWM_STOP_TIMEOUT_COUNT;
    /* Get channel register */
    uint32_t PWMx = PWM_Get_Channel_Reg(ch);

    tmpVal = BL_RD_REG(PWMx, PWM_CONFIG);
    // if(BL_GET_REG_BITS_VAL(tmpVal, PWM_REG_CLK_SEL) != PWM_CLK_XCLK){
    if(BL_GET_REG_BITS_VAL(tmpVal, PWM_REG_CLK_SEL) != PWM_CLK_BCLK){
        BL_WR_REG(PWMx, PWM_CONFIG, BL_SET_REG_BIT(tmpVal, PWM_STOP_EN));
        while(!BL_IS_REG_BIT_SET(BL_RD_REG(PWMx, PWM_CONFIG), PWM_STS_TOP)){
            timeoutCnt--;
            if(timeoutCnt == 0){
                return TIMEOUT;
            }
        }
        // tmpVal = BL_SET_REG_BITS_VAL(tmpVal, PWM_REG_CLK_SEL, PWM_CLK_XCLK);
        tmpVal = BL_SET_REG_BITS_VAL(tmpVal, PWM_REG_CLK_SEL, PWM_CLK_BCLK);
    }
    tmpVal = BL_SET_REG_BITS_VAL(tmpVal, PWM_OUT_INV, PWM_POL_NORMAL);
    tmpVal = BL_SET_REG_BITS_VAL(tmpVal, PWM_STOP_MODE, PWM_STOP_GRACEFUL);
    BL_WR_REG(PWMx, PWM_CONFIG, tmpVal);

    /* Config pwm division */
    BL_WR_REG(PWMx, PWM_CLKDIV, clkDiv);

    /* Config pwm period and duty */
    BL_WR_REG(PWMx, PWM_PERIOD, period);
    BL_WR_REG(PWMx, PWM_THRE1, 0);
    BL_WR_REG(PWMx, PWM_THRE2, threshold2);

    return SUCCESS;
}

void pwm_led_init(void)
{
    for (int i = 0; i < 3; i++) {
        GLB_GPIO_Init(cfg + i);

        PWM_CH_ID_Type ch = cfg[i].gpioPin % PWM_CH_MAX;
        PWM_Channel_Disable(ch);
    }
}

void pwm_led_set(uint8_t red,uint8_t green,uint8_t blue)
{
    PWM_Smart_Configure2(2, 80, 255, green);
    PWM_Channel_Enable(2);

    PWM_Smart_Configure2(3, 80, 255, blue);
    PWM_Channel_Enable(3);

    PWM_Smart_Configure2(4, 80, 255, red);
    PWM_Channel_Enable(4);

}

void rgb_control(uint8_t red, uint8_t green, uint8_t blue,  uint8_t alpha)
{
    uint8_t t_red,t_green,t_blue;


    // 应用透明度/亮度
    t_red = red*alpha/255;
    t_green = green*alpha/255;
    t_blue = blue*alpha/255;

    pwm_led_set(t_red,t_green,t_blue);
}

三、运行

巴法云小程序

7.jpg

8.jpg

9.jpg

MQTTX调试

20.png

21.png

──── 0人觉得很赞 ────

使用道具 举报

厉害了
可以接入小度智能音箱吗
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28307 个
  • 话题数: 40311 篇