程序与技术分享:BL602&BL604综合项目2:dolphin蓝牙跳蛋

简介: 程序与技术分享:BL602&BL604综合项目2:dolphin蓝牙跳蛋

本项目为一款蓝牙跳蛋的设计,主控芯片为BL602,通过PWM控制震动马达的转速实现不同的震动强度变化,通过蓝牙连接设备,APP下发蓝牙指令实现设备的控制。


项目地址:


蓝牙初始化:


void do_ble_init(void){


// Initialize BLE controller


LOGI(TAG, //代码效果参考:http://hnjlyzjd.com/xl/wz_24241.html

"do_ble_init ");

ble_controller_init(configMAX_PRIORITIES - 1);


//Initialize BLE Host stack


hci_driver_init();


bt_enable(bt_ready_cb);


bt_set_name("LVS-Lush122-XT");


bt_gatt_service_register((struct bt_gatt_service )&dis);


notify_attrs = &ble_attrs【1】;


bt_conn_cb_register(&conn_callbacks);


ble_start_advertise();


}


蓝牙接收到的数据处理:


//蓝牙处理函数


static void ble_reve_cb(struct bt_conn conn, const char buf, u16_t len){


char cmd【30】 = "";


char data【15】 = "";


char ret_str【20】 = "OK";


//LOGI(TAG, "ble_reve_buf: %s", buf);


//do_ble_notify(conn, ret_str, strlen(ret_str));


char dp = strchr(buf,';');


if(dp == NULL){


return;


}else{


dp = '\0';


}


LOGI(TAG, "ble_reve_buf: %s", buf);


char p = strchr(buf,':');


if(p != NULL){


strncpy(cmd, buf, p-buf);


strncpy(data, p+1, len-(int)(p-buf)-2);


}else{


strcpy(cmd, buf);


cmd【len-1】 = '\0';


}


LOGI(TAG, "cmd: %s data: %s", cmd, data);


if(CDM_CMP(cmd, "Status")){


LOGI(TAG, "get Status");


do_ble_notify(conn, ret_str, strlen(ret_str));


}


else if(CDM_CMP(cmd, "Vibrate")){ //蓝牙在线模式控制


LOGI(TAG, "set Vibrate");


vibrate = atoi(data);


Preset=0;


current_Preset=0;


//do_ble_notify(conn, ret_str, strlen(ret_str));


}


else if(CDM_CMP(cmd, "Preset")){ //9种预设模式选择


LOGI(TAG, "set Vibrate");


Preset = atoi(data);


}


else if(CDM_CMP(cmd, "Battery")){ //获取电量


int32_t percent=get_battery(); //电池百分比


if(percent==100) {ret_str【0】='1';ret_str【1】='0';ret_str【2】='0';}


else{


int8_t shiwei= percent/10; int8_t gewei= percent%10;


ret_str【0】='0';


ret_str【1】=shiwei+'0';


ret_str【2】=gewei+'0';


}


ret_str【3】=';';


do_ble_notify(conn, ret_str, strlen(ret_str));//设备蓝牙回复当前电量


}


else if(CDM_CMP(cmd,"Light")){ //灯光闪烁开关


if(data【0】=='o'&&data【1】=='n'){


light_flag=true;


if(ble_connect) bl_gpio_output_set(LED_STATUS, 0);


}


if(data【0】=='o'&&data【1】=='f'&&data【2】=='f'){


light_flag=false;


}


}


else if(CDM_CMP(cmd,"PowerOff")){ //关闭设备


sleep_start();


}


else if(CDM_CMP(cmd,"OTA")){ //蓝牙发送 OTA; 进入OTA


LOGI(TAG, "OTA");


ota_flag=true;


flash_storage_init();


wifi_init(wifi_event_handler);


vTaskDelay(500 / portTICK_RATE_MS);


wifi_setup_sta();


ota_time= hal_timer_now_s(); //记录OTA开始的时间


char ota_ret【20】="OTA_START";


do_ble_notify(conn, ota_ret, strlen(ota_ret));


}


else if(CDM_CMP(cmd,"WIFI")){ //蓝牙配网指令: "WIFI:账号,密码;"


LOGI(TAG, "SET WIFI ");


user_ssid_t wifi_info = flash_get_user_ssid_config();


memset(wifi_info->ssid, 0, sizeof(wifi_info->ssid));


memset(wifi_info->password, 0, sizeof(wifi_info->password));


flash_ssid_config_write();


char p = strchr(data,',');


if(p != NULL){


strncpy(wifi_info->ssid, data, p-data);


strncpy(wifi_info->password, p+1, len-(int)(p-data)-2);


flash_ssid_config_write();


char ret【20】="SET_WIFI";


do_ble_notify(conn, ret, strlen(ret));


do_ble_notify(conn, wifi_info->ssid, strlen(wifi_info->ssid));


do_ble_notify(conn, wifi_info->password, strlen(wifi_info->password));


LOGI(TAG,"saved SSID: %s, passwd: %s", wifi_info->ssid, wifi_info->password);


}


}


vTaskDelay(100 / portTICK_RATE_MS);


//do_ble_notify(conn, ret_str, strlen(ret_str));


}


对蓝牙下发的指令进行解析,根据解析后的指令经行震动马达和灯光的控制:


void mada_task(void arg){ //mada模式


uint32_t duty = 0;


int i=0;


while(1){


if(!ble_connect&&(charge_status == DISCHARGE)){ //四档离线模式


if(Grade==0) motor_g_set_vibrate(0);


if(Grade==1) motor_g_set_vibrate(8);


if(Grade==2) motor_g_set_vibrate(12);


if(Grade==3) motor_g_set_vibrate(16);


if(Grade==4) motor_g_set_vibrate(20);


}


else if(ble_connect&&(charge_status == DISCHARGE)&&Preset==0){ //蓝牙在线模式


motor_g_set_vibrate(vibrate);


if(vibrate==0)led_status_flash(0);


}


else if(ble_connect&&(charge_status == DISCHARGE)&&Preset!=0){


memcpy(currentPreMod,presetMod【Preset-1】,8);


for(i=0;i[span style="color: rgba(128, 0, 128, 1)">8;i++){


duty =currentPreMod【i】100;


motor_g_set_duty(duty);


current_Preset=currentPreMod【i】;


if(light_flag){led_status_flash(115-current_Preset);} //9种预设模式灯光,在此实现跟马达同时变化


vTaskDelay(300 / portTICK_RATE_MS);


LOGI(TAG, "presetMod:%d",currentPreMod【i】);


}


}


else {motor_g_set_vibrate(0);Grade=0;vibrate=0;}


vTaskDelay(100/portTICK_RATE_MS);


}


}


9种预设模式变化频率,可以在此调整每个模式下的震动频率变化


const uint8_t presetMod【9】【8】 =


{


{ 100, 20, 100, 20, 100, 20, 100, 20 }, //Mod1


{ 50, 100, 50, 100, 50, 100, 50, 100 }, //Mod2


{ 40, 60, 80, 100, 100, 80, 60, 40 }, //Mod3


{ 100, 25, 100, 25, 100, 25, 100, 25 }, //Mod4


{ 75, 100, 75, 100, 75, 100, 75, 100 }, //Mod5


{ 20, 100, 60, 100, 60, 100, 30, 60 }, //Mod6


{ 75, 30, 20, 30, 100, 30, 25, 60 }, //Mod7


{ 100, 100, 100, 100, 100, 100, 100, 100 }, //Mod8


{ 38, 100, 80, 47, 28, 20, 28, 44 }, //Mod9


};


自动低功耗休眠任务:


void sleep_task(void *arg){ //大于1200S无震动,进入休眠模式


static int times=0;


while(1){


//LOGI(TAG, "start sleep");


if(Grade==0&&vibrate==0&&(charge_status == DISCHARGE)&&Preset==0) times++;


else times=0;


if(ota_flag) //代码效果参考:http://hnjlyzjd.com/hw/wz_24239.html

times =0;

//LOGI(TAG, "times:%d",times);


while(times>1200) {


hal_hbn_init(&key_weakup_pin, 1);


hal_hbn_enter(0);}


while(ota_flag&&(hal_timer_now_s()-ota_time>300)){


hal_hbn_init(&key_weakup_pin, 1);


hal_hbn_enter(0);


}


vTaskDelay(1000 /<span style="color: rgba(0, 0,

相关文章
|
5月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
129 0
|
8月前
|
Linux Android开发
全志平台A40I : I2C通讯问题调试笔记
全志平台A40I : I2C通讯问题调试笔记
227 0
|
8月前
|
数据采集 搜索推荐 JavaScript
Uniapp连接iBeacon设备——实现无线定位与互动体验(理论篇)
Uniapp连接iBeacon设备——实现无线定位与互动体验(理论篇)
302 0
|
8月前
|
小程序 JavaScript Java
基于微信小程序的公司后勤服务(设备)系统设计与实现(源码+lw+部署文档+讲解等)
基于微信小程序的公司后勤服务(设备)系统设计与实现(源码+lw+部署文档+讲解等)
73 0
|
传感器 移动开发 缓存
基于小熊派WIFI-ESP8266实践(中)-多功能处理显示等大杂烩
基于小熊派WIFI-ESP8266实践(中)-多功能处理显示等大杂烩
175 0
|
安全 5G 定位技术
IM开发者的零基础通信技术入门(十一):为什么WiFi信号差?一文即懂!
WiFi对于现在的家庭来说,属于司空见惯的上网方式,但很多情况下,家里房间多、空间大、杂物乱的情况下,WiFi的信号就受影响。为什么WiFi信号会受影响?什么情况下该使用何种方式组网?如何改善WiFi信号差的问题?等等,本文将通俗易懂地为你找到这些问题的答案。
180 0
IM开发者的零基础通信技术入门(十一):为什么WiFi信号差?一文即懂!
|
测试技术 芯片
百度智能手环方案开源(含源码,原理图,APP,通信协议等)
分享一个百度智能手环开源项目的设计方案资料。 项目简介 百度云智能手环的开源方案是基于Apache2.0开源协议,开源内容包括硬件设计文档,原理图、ROM、通讯协议在内的全套方案,同时开放APP和云服务的免费使用。
4025 0
|
JavaScript 芯片
硬件开发笔记(二):硬件开发基本流程,制作一个USB转RS232的模块(一):开发基本过程和元器件选型
硬件开发笔记(二):硬件开发基本流程,制作一个USB转RS232的模块(一):开发基本过程和元器件选型
硬件开发笔记(二):硬件开发基本流程,制作一个USB转RS232的模块(一):开发基本过程和元器件选型
|
运维 小程序 UED
HaaS UI小程序解决方案应用分发之二:产品和设备管理
HaaS UI应用分发平台(以下简称“分发平台”)上的产品,即代表一类设备,这些设备的Product Key、HaaS固件、管理运维策略完全相同。
257 15
HaaS UI小程序解决方案应用分发之二:产品和设备管理