本次專案是用esp_32s做乙個低功耗藍芽ble的透傳模組,模組將掃瞄到的藍芽名稱以及裝置位址通過usb口(串列埠)傳出,上位機通過串列埠輸入要連線的藍芽名稱後,模組進行連線配對,配對成功後就將usb口收到的資料通過藍芽傳送到配對端。
硬體:esp-32s模組,以及必要的外圍電路。
軟體系統:freertos,介面**採用樂鑫提供的esp32模組bsp包
1、串列埠初始化
static void uart_init(void)
; //set uart parameters
uart_param_config(uart_num_0, &uart_config);
//set uart pins
uart_set_pin(uart_num_0, uart_pin_no_change, uart_pin_no_change, uart_pin_no_change, uart_pin_no_change);
//install uart driver, and get the queue.
uart_driver_install(uart_num_0, 4096, 8192, 10,&spp_uart_queue,0);
xtaskcreate(uart_task, "utask", 2048, (void*)uart_num_0, 8, null);
}
2、藍芽功能初始化
//register the callback function to the gattc module
if ((status = esp_ble_gattc_register_callback(esp_gattc_cb)) != esp_ok)
esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(200); //設定mtu最大為200
if (local_mtu_ret)
cmd_reg_queue = xqueuecreate(10, sizeof(uint32_t));
xtaskcreate(spp_client_reg_task, "spp_client_reg_task", 2048, null, 10, null);
}void ble_init()
ret = esp_bt_controller_enable(esp_bt_mode_ble);
if (ret)
esp_logi(gattc_tag, "%s init bluetooth\n", __func__);
ret = esp_bluedroid_init();
if (ret)
ret = esp_bluedroid_enable();
if (ret)
} 3、啟動掃瞄
呼叫esp介面 esp_ble_gap_start_scanning(0xff);
掃瞄到藍芽裝置後會觸發事件 esp_gap_ble_scan_result_evt,在事件觸發時,回去掃瞄到的裝置名稱以及位址資訊,通過串列埠將裝置資訊輸出,
adv_name = esp_ble_resolve_adv_data(scan_result->scan_rst.ble_adv, esp_ble_ad_type_name_cmpl, &adv_name_len);
if(adv_name==null)
adv_name = esp_ble_resolve_adv_data(scan_result->scan_rst.ble_adv, esp_ble_ad_type_name_short, &adv_name_len);
uart_send_scandevinfo(scan_result->scan_rst.bda,adv_name,adv_name_len);
4、收到上位機通過串列埠輸入連線裝置名稱後,將掃瞄到的裝置名稱與目標名稱進行對比,如果相符就停止掃瞄
if (adv_name != null)
}
停止掃瞄後會觸發 esp_gap_ble_scan_stop_complete_evt事件,在事件觸發時啟動連線
5、連線成功後會觸發gattc_profile_event_handler()中的 esp_gattc_connect_evt事件。
連線事件處理:設定資料長度
is_connect = true;
esp_err_t mtu_ret = esp_ble_gattc_send_mtu_req(gattc_if, spp_conn_id);
if (mtu_ret)
6、設定成功後觸發esp_gattc_cfg_mtu_evt事件。在此事件中獲取裝置資訊
if(p_data->cfg_mtu.status != esp_ok)
esp_logi(gattc_tag,"+mtu:%d\n", p_data->cfg_mtu.mtu);
spp_mtu_size = p_data->cfg_mtu.mtu;
spp_conn_id = p_data->connect.conn_id;
spp_gattc_if = gattc_if;
esp_ble_gattc_search_service(spp_gattc_if, spp_conn_id, &spp_service_uuid);
7、獲取成功後觸發esp_gattc_search_res_evt事件,然後設定通訊需要的佇列、資料通道等,就可以進行通訊了,
8、當串列埠收到資料後,呼叫
esp_ble_gattc_write_char( spp_gattc_if,spp_conn_id,
(db+spp_idx_spp_data_recv_val)->attribute_handle,
event.size,
pbuf,
esp_gatt_write_type_rsp,
esp_gatt_auth_req_none);
將資料傳輸給ble服務端。
9、當模組收到ble服務端的資料,會觸發通知事件:esp_gattc_notify_evt,在該事件出發時,呼叫
notify_event_handler(p_data);將資料通過串列埠傳送出去
static void notify_event_handler(esp_ble_gattc_cb_param_t * p_data)
else
handle = p_data->notify.handle;
if(handle == db[spp_idx_spp_data_nty_val].attribute_handle)
notify_value_count = 0;
notify_value_p = null;
notify_value_offset = 0;
esp_loge(gattc_tag,"notify value count is not continuous,%s\n",__func__);
return;
}if(p_data->notify.value[3] == 1)
memcpy((notify_value_p + notify_value_offset),(p_data->notify.value + 4),(p_data->notify.value_len - 4));
if(p_data->notify.value[2] == p_data->notify.value[3])
notify_value_offset += (p_data->notify.value_len - 4);
}else if(p_data->notify.value[3] <= p_data->notify.value[2])
notify_value_offset += (p_data->notify.value_len - 4);
}}else
}else if(handle == ((db+spp_idx_spp_status_val)->attribute_handle))else
}
大體流程就是這樣的,具體資料細節處理業務就不細述了。 ESP32S 入手攻略 開發指南
先看看實圖 正面 能清晰的看見2個按鈕,上面帶有兩個led 乙個是電源燈,乙個接了io口的,搞忘記是那個io口的了 反面io 個人數了一下一共38個腳,但是有5個是電源 gnd 3,3v3,5v 這個5v可以到時候測試一下能否直接帶動5v繼電器的模組,這樣就可以很方便的控制開關了!由於換了工作,和開...
僅ESP32和ESP32S2 驅動程式AT命令
at drvadc 讀取adc通道值。at drvpwminit 初始化pwm驅動器 at drvpwmduty 更改pwm占空比 at drvpwmfade 更改pwm梯度 at drvi2cinit 初始化i2c主驅動程式 at drvi2crd 讀取i2c資料 at drvi2cwrdata ...
esp32 io速度 ESP32快速入門指南
在本篇文章中,您將了解到esp32 wi fi和藍芽模組以及如何進行設定。什麼是esp32?esp8266 wi fi模組是過去幾年中最受歡迎和最實用的模組之一。市場上有這種模組的各種版本。esp32模組是esp8266的公升級版本。除了wi fi模組,該模組還包含藍芽4.0模組。雙核cpu工作頻率...