发帖
2 0 0

Ai-WB2-32S开发板 连接百度物联网,并上传温湿度信息

aramy
金牌会员

9

主题

19

回帖

1456

积分

金牌会员

积分
1456
Ai-WB2系列 77 2 7 天前

1、任务选择

超级开心申请到了高性能WiFi+BLE双模Ai-WB2-32S-Kit的试用机会。看文档,该开发板硬件功能很强劲,内置SDIO、SPI、UART、I2C、PWM等十余种外设接口。不过看论坛的文档,这个开发板在软件开发上只有官方提供的SDK可以使用,没有看见对Arduino、MicroPython的支持。感觉在开发上对我这样的小白不是太友好。但还是禁不住诱惑,成功申请了开发板的试用,申请的评测内容为:云平台对接。使用阿里云、腾讯云等主流平台,实现数据上传/下发功能(如温湿度传感器数据上传),展示物联网应用场景。

为了满足以上功能,硬件上额外准备了一块ENV III SENSOR传感器模块,这是一个集成了SHT30芯片的温湿度传感器模块。搭配上Ai-WB2-32S-Kit实现温湿度与百度物联网的对接。

2、环境搭建

环境搭建参考了论坛各位老师的帖子,选择了一个最为简单的方法。准备了一台linux系统,在linux系统中搭建开发环境,然后使用vscode的远程ssh功能去编程,实现起来比较简单。

首先安装依赖包,依赖关系中还需要有python的支持,我的linux环境中已经预先安装了Anconda,创建了python的环境。

sudo apt install build-essential git

从gitee上拉取编译环境。这里边包含了编译环境和例程代码。

git clone --recursive https://gitee.com/Ai-Thinker-Open/Ai-Thinker-WB2

1.png

进入工具链的目录下,执行一下添加可执行权限的脚本 chmod755.sh

2.png

这样编译环境就搭建完成了。进入例程的目录Ai-Thinker-WB2/applications/get-started/helloworld,输入make,即可看见项目的编译过程。

3.png

编译没有报错后,就开始烧写。烧写是通过串口烧写的,板子上的Type-C口有转换为串口的电路了,可以通过USB直接烧写。烧写时需要按提示按一下rst按键。

5.png

最后打开串口,即可看见“Hello World.”的字符串,并且输出后系统重启的内容。我这里串口工具使用的是Minicom

6.png

使用vscode远程连接linux机器,即可看见对应的代码,并对源码可以进行编辑了。

4.png

3、功能实现

作为技术小白,只能做一个缝合怪,从各位老师的例子出发,实现自己的功能。参考着论坛中老师的这篇帖子作为基础,实现了到百度物联网的连接。参考着例程中"demo_sht3x"实现了sht30的读取。最终完成了将温湿度信息上送百度物联网的功能。

首先在WiFi连接后就去连接物联网。因为开发板这端只需要上送温湿度信息,所以在回调函数中并没有添加处理的内容。

`void wifi_connect_call()
{
printf("wifi connect\n");
axk_mqtt_client_config_t mqtt_cfg = {
.event_handle = event_cb,
//指定客户端名称
.host="afgsmmu.iot.gz.baidubce.com",
.username="thingidp@afgsmmu|AICAM|0|MD5",
.password="xxxxxxxxxxxxxxxxxx",
.client_id="AICAM",
.keepalive=60
};

static axk_err_t event_cb(axk_mqtt_event_handle_t event)
{
    int32_t event_id;
    axk_mqtt_client_handle_t client = event->client;  // 获取MQTT客户端结构体指针

    event_id = event->event_id;
    blog_debug("Event dispatched, event_id=%d", event_id);
    int msg_id;
    switch ((axk_mqtt_event_id_t)event_id) {
        case MQTT_EVENT_CONNECTED:    // MQTT连上事件
            //订阅
            msg_id = axk_mqtt_client_subscribe(client, TOPIC_MSG, 0);
            blog_info("sent subscribe successful, msg_id=%d", msg_id);
            break;
        case MQTT_EVENT_DISCONNECTED:           // MQTT断开连接事件
            blog_info("MQTT_EVENT_DISCONNECTED");
            break;

        case MQTT_EVENT_SUBSCRIBED:   // MQTT发送订阅成功事件
            blog_info("MQTT_EVENT_SUBSCRIBED, msg_id=%d,msg_topic=%s", event->msg_id, event->topic);
            blog_info("sent publish successful, msg_id=%d", event->msg_id);
            break;
        case MQTT_EVENT_UNSUBSCRIBED:       // MQTT取消订阅事件
            blog_info("MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id);
            break;
        case MQTT_EVENT_PUBLISHED:          // MQTT发布成功事件
            blog_info("MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
            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);
            break;
        case MQTT_EVENT_ERROR:
            blog_info("MQTT_EVENT_ERROR");
            if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) {
                log_error_if_nonzero("reported from axk-tls", event->error_handle->axk_tls_last_axk_err);
                log_error_if_nonzero("reported from tls stack", event->error_handle->axk_tls_stack_err);
                log_error_if_nonzero("captured as transport's socket errno", event->error_handle->axk_transport_sock_errno);
                blog_info("Last errno string (%s)", strerror(event->error_handle->axk_transport_sock_errno));
            }
            break;
        default:
            blog_info("Other event id:%d", event->event_id);
            break;
    }
    return AXK_OK;
}

学着例程,添加了一个读取sht30的任务,使用I2C方式去读取传感器,管脚使用GPIO3(SDA)和GPIO12(SCL)。每10秒钟读取一次传感器。

1.jpg

void sht30_task(void *param)
{
    char msg[80];
    uint8_t value = 1;
    static hosal_i2c_dev_t i2c0 = {
        .config = {
            .address_width = HOSAL_I2C_ADDRESS_WIDTH_7BIT,
            .freq = 100000,
            .mode = HOSAL_I2C_MODE_MASTER,
            .scl = 12,
            .sda = 3,
        },
        .port = 0,
    };

    hosal_i2c_init(&i2c0);
    vTaskDelay(30000);
    while (1)
    {
        struct sht3x_data data;

        uint8_t command[2] = { SHT31_MEAS_HIGHREP >> 8, SHT31_MEAS_HIGHREP & 0xff };
        hosal_i2c_master_send(&i2c0, SHT31_DEFAULT_ADDR, command, sizeof command, 100);
        hosal_i2c_master_recv(&i2c0, SHT31_DEFAULT_ADDR, (uint8_t*)&data, sizeof data, 100);
        char temperature_str[8];
        char humidity_str[8];

        if (crc8(&data.st_high, 2) == data.st_crc8) {
            uint16_t st = data.st_high;
            st <<= 8;
            st |= data.st_low;

            int temp = st;
            temp *= 17500;
            temp /= 0xffff;
            temp = -4500 + temp;

            int temperature_integer = temp / 100;
  
            if (temp < 0) {
                temp = -temp;
            }

            unsigned temperature_decimal = temp % 100;

            sprintf(temperature_str, "%d.%02u", temperature_integer, temperature_decimal);
        }
        else {
            sprintf(temperature_str, "%s", "0");
        }
  
        if (crc8(&data.srh_high, 2) == data.srh_crc8) {
            uint16_t srh = data.srh_high;
            srh <<= 8;
            srh |= data.srh_low;

            unsigned humidity = srh;
            humidity *= 10000;
            humidity /= 0xFFFF;

            unsigned humidity_integer = humidity / 100;

            sprintf(humidity_str, "%u", humidity_integer);
        }
        else {
            sprintf(humidity_str, "0");
        }

        blog_info("temperature: %s\thumidity: %s\r\n", temperature_str, humidity_str);
        snprintf(msg, 80, "{\"temperature\":%s,\"humidity\":%s}", temperature_str, humidity_str);
        axk_mqtt_client_publish(client,TOPIC_MSG,msg,0,0,0);
        vTaskDelay(10000);
    }

4、效果演示

9.png

系统启动后,通过WIFI连接互联网,然后读取传感器的温湿度,将温湿度上传到物联网。

7.png

用python写个简单的上位机,就能在任何地方,通过互联网收到下位机上送的温湿度信息了。

8.png

5、项目源码

感谢园长帮忙上传,将压缩包解压后放到“Ai-Thinker-WB2/applications/get-started”目录下,即可实现编译、烧写。

upload 附件:wb2-mqtt-demo(1).zip

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

使用道具 举报

作业质量挺不错~
优秀
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28435 个
  • 话题数: 40513 篇