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

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

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

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

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

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

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秒钟读取一次传感器。

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、效果演示

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

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

5、项目源码
感谢园长帮忙上传,将压缩包解压后放到“Ai-Thinker-WB2/applications/get-started”目录下,即可实现编译、烧写。
附件:wb2-mqtt-demo(1).zip