AI-WB2-32s-Kit开发板测试,测评第6项目:结合外设开发实际场景
说明
- 使用AI-WB2-32s-Kit+雷达模块制+蓝牙信标作安防检测。灵感来源是想着马上毕业要外出租房,担心陌生人进入房间,所以制作这个项目,以实现当有人进入房间时起到提示作用。但如果仅用雷达检查,每次自己回家都也会触发报告,那样就太烦了,所以我决定通过蓝牙信标来过滤指定目标。
材料
1、AI-WB2-32s-Kit
2、雷达模块(自带uart串口,通过串口输出数据)
3、蓝牙模块
4、服务器,用来做中转发送消息


雷达部分的代码
#include <stdio.h>
#include <string.h>
#include <FreeRTOS.h>
#include <task.h>
#include <blog.h>
#include "bl_sys.h"
#include <stdio.h>
#include <cli.h>
#include <hosal_uart.h>
#include <bl_gpio.h>
#include "bl_uart.h"
#define TAG "uart_demo"
#define GPIO_LED_PIN 3
hosal_uart_dev_t uart_dev_log = {
.config = {
.uart_id = 0,
.tx_pin = 16, // TXD GPIO
.rx_pin = 7, // RXD GPIO
.cts_pin = 255,
.rts_pin = 255,
.baud_rate = 115200,
.data_width = HOSAL_DATA_WIDTH_8BIT,
.parity = HOSAL_NO_PARITY,
.stop_bits = HOSAL_STOP_BITS_1,
.mode = HOSAL_UART_MODE_POLL,
},
};
//UART radar
void uart_radar_data(void *param)
{
char data[64];
int ret;
while (1)
{
/* UART receive poll */
ret = hosal_uart_receive(&uart_dev_log, data, sizeof(data)-1);
if (ret > 0)
{
bl_gpio_output_set(GPIO_LED_PIN, 1);//set led
}
else{
bl_gpio_output_set(GPIO_LED_PIN, 0);//set led
}
/* sscanf 是 C 语言标准库中的一个函数,
* 用于从字符串中按照指定的格式读取数据,
* 并将数据存储到指定的变量中123。
* 它的原型定义在 <stdio.h> 头文件中
*/
//雷达串口输出数据的格式: v=-0.6 km/h, str=208
float velocity;
int str_value;
if (2 == sscanf(data, "v=%f km/h, str=%d", &velocity, &str_value)) {
printf("Parsed: v=%.1f, str=%d\r\n", velocity, str_value);
}
vTaskDelay(200);
}
}
void main(void)
{
/* UART InIt device */
hosal_uart_init(&uart_dev_log);
/*LED*/
bl_gpio_enable_output(GPIO_LED_PIN, 0, 0);
xTaskCreate(uart_radar_data, "radar", 1024, NULL, 15, NULL);
}
因为我最近要期末考,等考完再把项目做完整。项目暂时先搁置一下,所以先通过这个小项目,测试了点灯和串口,以及结合外设实现安防功能。
接下来要做的:蓝牙信标(该部分以完成)。开发板以主机模式扫描设备,雷达发现有人进屋且扫描到指定MAC设备,表示是自己回家,否则就是陌生人闯入。
蓝牙部分代码
- 我是在bl_interface.c库文件里添加如下代码实现mac比对和rssi的
//
int ble_master_get_rssi_by_mac(uint8_t *target_mac){
if(target_mac==NULL)return -127;
int ret=0;
int rssi=0;
int retry=3;
struct bt_le_scan_param scan_param;
char scan_data[250];
scan_param.type = BT_LE_SCAN_TYPE_ACTIVE;
scan_param.filter_dup = BT_LE_SCAN_FILTER_DUPLICATE;
scan_param.interval = 320;
scan_param.window = 48;
master_current_scan = 0;
memset(scan_le_addr, 0, sizeof(scan_le_addr));
memset(master_scan_tbl, 0, sizeof(master_scan_tbl));
//scan
ret = bt_le_scan_start(&scan_param, scan_device_found);
if(ret!=0){rssi=-127;}
vTaskDelay(800 / portTICK_PERIOD_MS);//持续扫描的时间
for (int i = 0; i < master_current_scan; i++) {
ble_reverse_byte(master_scan_tbl[i].mac, 6);
if(memcmp(target_mac,master_scan_tbl[i].mac, 6)==0){
sprintf(scan_data,"My BLE MAC:%02X%02X%02X%02X%02X%02X RSSI:%i name:%s\r\n",
master_scan_tbl[i].mac[0],master_scan_tbl[i].mac[1],master_scan_tbl[i].mac[2],
master_scan_tbl[i].mac[3],master_scan_tbl[i].mac[4],master_scan_tbl[i].mac[5],
master_scan_tbl[i].rssi, master_scan_tbl[i].name);
bleuart_printf(scan_data);
rssi=master_scan_tbl[i].rssi;
break;
}
else{
//bleuart_printf("Not Found MAC Device\r\n");
rssi= -127;
}
}
return rssi;
}
有了雷达数据和蓝牙数据,剩下的就是消息发送了,待有时间完成。