- 本系列博客學習由非官方人員 半顆心臟 潛心所力所寫,僅僅做個人技術交流分享,不做任何商業用途,如有不對之處,請留言,本人及時更改,
系列一:ESP32系列模組基礎學習系列筆記
1、 爬坑學習新旅程,虛擬機搭建esp32開發環境,列印 “Hellow World”,
2、 巧用eclipes編輯器,官方教程在在Windows下搭建esp32開發環境,列印 “Hellow World”,
3、 認識基本esp32的GPIO介面,開始點亮您的第一盞 LED和中斷回呼實作按鍵功能 ,
4、體會esp32的強大的定時器功能, 實作定時2s閃爍一盞LED燈,
5、接觸實踐esp32的pwm寬度脈沖功能, 實作呼吸效果閃爍一盞LED燈,
6、smartConfig和微信airKiss在esp32的實作,一鍵配網輕松快捷連接路由器,
7、利用GPIO中斷做一個按鍵的短按和長按的回呼事件,再也無須擔心觸發源,
8、esp32上實作本地 UDP 客戶端和服務端角色,在局域網內實作通訊,
9、esp32上實作本地 TCP 客戶端和服務端角色,可斷線重連原路回傳資料,
10、樂鑫esp32 SDK編程利用rmt驅動ws2812七彩燈,實作彩虹漸變效果,
11、入門 樂鑫esp-adf 音頻框架開發,esp32造一個藍牙耳機,實作切換歌曲,獲取歌曲資訊等功能,
12、開源一個微信公眾號airkiss配網esp32以及局域網發現功能的工程,分享一個airkiss配網小工具,
13、esp32 內置 dns 服務器,無需外網訪問域名回傳指定網頁,
14、esp32 sdk編程實作門戶強制認證,連接esp32熱點之后,自動強制彈出指定的登錄界面,
15、認識本地離線語音喚醒識別框架 esp-skainet ,實作較低成本的硬體語音本地識別控制,
16、學習本地語音喚醒離線識別框架 esp-skainet ,如何修改喚醒詞? 如何自定義命令詞?如何做意圖動作?
17、全網首發,樂鑫esp32 sdk直連京東微聯·小京魚 · IoT開放平臺,實作叮咚音響語音智能控制,
18、入門京東微聯·小京魚的控制面板H5開發,讀懂vue語法,做自己的控制頁面,
19、重磅開源,如何在微信小程式上ble藍牙配網esp32,blufi的那些事!
20、一篇好文,開發程序中編譯esp32韌體太大,無法正常啟動?教你如何自定義磁區表partitions.csv,
21、 esp32藍牙配網blufi的高度封裝,集成簡單、使用簡單、容易上手,提高開發效率!
22、討論下程式員 “青春飯” 那些事,分享在esp32實作多種加密演算法md5 |AES CBC-ECB| Sha1 | Sha256 等!
23、安信可 esp32-a1s 音頻開發板移植最新 esp-adf 音頻框架,小試牛刀如何實作在線文字轉語音播放,
25、分享在 esp32 SDK實作冷暖光色溫平滑調節的封裝,輕松集成到您的專案去,
26、分享下如何在window下使用CMake編譯,編譯速度提高傳統 make 編譯一個檔次,支持 ESP32 和 ESP32-C3,
27、windows10平臺下自帶的Linux安裝 ESP8266/ESP32 環境,再無需額外安裝虛擬機了,
系列二:ESP32-Camera 攝像頭開發板系列筆記
1、安信可 ESP32-Cam 攝像頭開發板二次開發 C SDK編程,實作MQTT遠程拍照傳輸到私有服務器,
2、安信可 ESP32-Cam 攝像頭開發板二次開發 C SDK編程,實作本地視頻流監控,
3、安信可 ESP32-Cam 攝像頭開發板二次開發 C SDK編程,拍照圖片通過有線串口傳到上位機PC端,
系列三:ESP32-C3 模組系列筆記
1、【藍牙Mesh筆記 ①】ESP32-C3 模組上實作天貓精靈藍牙 BLE Mesh AliGenie 接入,無需WiFi 連接也可以實作天貓精靈語音控制,
系列四:ESP32-S3 模組系列筆記
1、安信可 ESP32-S3 模組上驅動攝像頭 OV2640,實作遠程拍照并 HTTP 傳輸到阿里云物件存盤OSS,并顯示在微信小程式上,,
文章目錄
- 前言
- 一、 ESP32-S3 產品特性
- CPU 和存盤
- 外設介面和傳感器
- 功耗特性
- 二、 準備作業
- 硬體
- 軟體
- 接線
- 三、通訊協議和原理
- 3.1 模組拍照上傳服務器
- 3.2 小程式下發指令給模組拍照給服務器
- 3.3 模組把上傳服務器結果回呼給小程式
- 四、服務器準備
- 3.1 接收圖片處理
- 3.2 接收圖片處理
- 3.3 服務器業務邏輯
- 五、嵌入式開發準備
- 六、微信小程式開發準備
- 原始碼下載
- 另外,不要把我的博客作為學習標準,我的只是筆記,難有疏忽之處,如果有,請指出來,也歡迎留言哈!
前言
第一批拿到了安信可 ESP32-S3模組的樣品,今天給大家分享下這個模組的規格,此模組精準聚焦 AIoT 市場,回應市場對 AI 演算法的技術需求,那么此文章介紹的是ESP32-S3模組上驅動攝像頭 OV2640,后續將繼續更新此系列博文,

一、 ESP32-S3 產品特性
拿到了安信可的ESP32-S3樣品,當然得查看其規格啦,
CPU 和存盤
? Xtensa? 32 位 LX7 雙核處理器,主頻高達 240 MHz
? 128 位資料總線位寬,支持 SIMD 指令
? 384 KB ROM
? 512 KB SRAM
? 16 KB RTC SRAM
? SPI、Dual SPI、Quad SPI、Octal SPI、QPI、OPI 介面外接多個 flash 和片外 RAM
外設介面和傳感器
? 45 × GPIO 口 ? 數字介面:
? 4 × SPI
? 1 × LCD 介面(8 位 ~16 位并行 RGB, I8080, MOTO6800), 支持 RGB565, YUV422, YUV420, YUV411 之間互相轉換
? 1 × DVP 8 位 ~16 位攝像頭介面
? 3 × UART
? 2 × I2C
? 2 × I2S
? 1 × RMT (TX/RX)
? 1 × 脈沖計數器
? LED PWM 控制器,多達 8 個通道
? 1 × 全速 USB OTG
? 1 × USB Serial/JTAG 控制器
? 2 × MCPWM
? 1 × SDIO 主機介面,具有 2 個卡槽
? DMA 控制器,5 個接收通道和 5 個發送通道
? 1 × TWAI? 控制器(兼容 ISO11898-1)
? 2 × 12 位 SAR ADC,多達 20 個通道
? 1 × 溫度傳感器 – 14 × 電容式傳感 GPIO ? 定時器:
? 4 × 54 位通用定時器
? 1 × 52 位系統定時器
? 3 × 看門狗定時器
功耗特性
ESP32-S3 采用了先進的電源管理技術,可以在不同的功耗模式之間切換,ESP32-S3 支持的功耗模式有:
? Active 模式:CPU 和芯片射頻處于作業狀態,芯片可以接收、發射和偵聽信號,
? Modem-sleep 模式:CPU 可運行,時鐘頻率可配置,Wi-Fi 基帶和射頻關閉,但 Wi-Fi 可保持連接,
? Light-sleep 模式:CPU 暫停運行,RTC 外設以及 ULP 協處理器可被定時器周期性喚醒運行,任何喚醒事 件(MAC、主機、RTC 定時器或外部中斷)都會喚醒芯片,Wi-Fi 可保持連接,
? Deep-sleep 模式:CPU 和大部分外設都會掉電,只有 RTC 存盤器和 RTC 外設處于作業狀態,Wi-Fi 連接 資料存盤在 RTC 中,ULP 協處理器可以作業,
? Hibernation 模式:內置快速 RC 振蕩器時鐘和 ULP 協處理器均被禁用,只有 1 個位于低速時鐘上的 RTC 時鐘定時器和某些 RTC GPIO 在作業,RTC 時鐘定時器或 RTC GPIO 可以將芯片從 Hibernation 模式中喚 醒, 設備在
不同的功耗模式下有不同的電流消耗,詳情請見下面:
| 功耗模式 | 描述 | 典型值 | 單位 |
|---|---|---|---|
| Light-sleep | CPU 暫停運行, | 240 | μA |
| Deep-sleep | RTC 存盤器和 RTC 外設處于作業狀態 | 8 | μA |
| Hibernation | RTC 存盤器處于作業狀態,RTC 外設處于關閉狀態 | 7 | μA |
| Power off | CHIP_PU 管腳拉低,芯片處于關閉狀態 | 1 | μA |
二、 準備作業
硬體
-
安信可 ESP32-S3 模組,
-
TTL-USB 除錯工具(推薦使用 CP2102串口芯片的 ,保證足夠的電壓電流),
軟體
- 環境搭建: Linux環境搭建 master 分支
- 工具鏈設定:下載 toolchain,博主使用的版本是:
gcc version 5.2.0 (crosstool-NG crosstool-ng-1.22.0-97-gc752ad5) - Python版本:
Python 3.8
接線
| 攝像頭引腳 | 模組引腳 |
|---|---|
| pin_pwdn | GPIO_NUM_35 |
| pin_reset | GPIO_NUM_36 |
| pin_xclk | GPIO_NUM_15 |
| pin_sscb_sda | GPIO_NUM_4 |
| pin_sscb_scl | GPIO_NUM_5 |
| pin_d7 | GPIO_NUM_16 |
| pin_d6 | GPIO_NUM_17 |
| pin_d5 | GPIO_NUM_18 |
| pin_d4 | GPIO_NUM_12 |
| pin_d3 | GPIO_NUM_11 |
| pin_d2 | GPIO_NUM_10 |
| pin_d1 | GPIO_NUM_9 |
| pin_d0 | GPIO_NUM_8 |
| pin_vsync | GPIO_NUM_6 |
| pin_href | GPIO_NUM_7 |
| pin_pclk | GPIO_NUM_13 |
三、通訊協議和原理

3.1 模組拍照上傳服務器
協議: HTTP
POST /index.php HTTP/1.1
Host: www.domain.com
Content-Type: image/jpeg
Name-Pic: name
Content-Length: 12540
"<file contents here>"
3.2 小程式下發指令給模組拍照給服務器
協議:MQTT
Topic:/light/deviceIn
payload:
{
"action" : "0" ,
"name" : "pic-name"
}
3.3 模組把上傳服務器結果回呼給小程式
協議:MQTT
Topic:/light/deviceOut
payload:
{
"url" : "base64(url)"
}
url 是拍照之后的可外網訪問的圖片地址,使用 base64 加密,
四、服務器準備
3.1 接收圖片處理
本代碼以HTTP 協議POST提交 ,二進制形式把圖片上傳到服務器,其格式如下:
POST /index.php HTTP/1.1
Host: www.domain.com
Content-Type: image/jpeg
Name-Pic: name
Content-Length: 12540
"<file contents here>"
因此,服務器要以資料流接收,以 PHP語言為例:
//接受資料流
$stream = file_get_contents('php://input');
//資料流轉化為png格式,并保存在指定的位置
$len = file_put_contents('/www/wwwroot/static/' . time() . ".png", $stream);
3.2 接收圖片處理
public function upload()
{
$getPostDataArry = apache_request_headers();
try {
$name = $getPostDataArry['Name-Pic'];
} catch (Exception $e) {
if (empty($name)) {
$response_data['code'] = 1;
$response_data['des'] = ' Name-Pic is not exist';
return json($response_data);
}
}
//接受資料流
$stream = file_get_contents('php://input');
//資料流轉化為png格式,并保存在指定的位置
$len = file_put_contents('/www/wwwroot/www.xuhongv.com/public/icon/' . $name . ".png", $stream);
$response_data = [];
if ($len) {
$accessKeyId = "LTAI4Fg*********YJBLPoTo5";
$accessKeySecret = "OT7s9vkQd*******4p8KQ31qoTIL4";
$endpoint = "we****ong.oss-cn-hongkong.aliyuncs.com";
$bucket = 'web****hong';
try {
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, true);
//判斷存盤空間是否存在
$isExist = $ossClient->doesBucketExist($bucket);
if (!$isExist) {
$response_data['code'] = 1;
$response_data['des'] = $endpoint . ' is not exist';
return json($response_data);
}
$options = array();
//oss 存盤檔案路徑
$object = "images/" . $name . ".png";
$ossClient->uploadFile($bucket, $object, '/www/wwwroot/www.xuhongv.com/public/icon/' . $name . ".png", $options);
} catch (OssException $e) {
$response_data['code'] = 1;
$response_data['des'] = $e->getMessage();
return json($response_data);
}
$response_data['code'] = 0;
$response_data['des'] = 'uploadup ok';
$response_data['url'] = base64_encode("https://" . $endpoint . '/' . $object);
return json($response_data);
}
$response_data['code'] = 1;
$response_data['des'] = "error , the upload file length is" . $len;
return json($response_data);
}
}
3.3 服務器業務邏輯
- 接受到S3模組發過來的圖片,存盤到本地服務器某個檔案夾里面,
- 同時把這個圖片,發送到阿里云物件存盤,回傳一個可遠程訪問圖片的地址給模組,
五、嵌入式開發準備
配置服務器資訊,然后拍照上傳,
//配置服務器相關資訊
esp_http_client_config_t config = {
.url = "http://domain.xuhongv.com/api/upload",
.method = HTTP_METHOD_POST,
.event_handler = _http_event_handler,
.buffer_size = 4096,
.user_data = local_response_buffer,
.buffer_size_tx = 4096 * 5,
.timeout_ms = 10000
};
//開始拍照
pic = esp_camera_fb_get();
if (!pic)
{
ESP_LOGE(TAG, "Camera capture failed");
goto end;
}
else
{
esp_camera_fb_return(pic);
pic = esp_camera_fb_get();
if (!pic)
{
ESP_LOGE(TAG, "Camera capture failed");
}
else
{
//拍照成功,獲取其大小、尺寸等資訊
ESP_LOGI(TAG, "Camera capture OK , Its size was: %zu bytes", pic->len);
ESP_LOGI(TAG, "Camera capture OK , Its width was: %d", pic->width);
ESP_LOGI(TAG, "Camera capture OK , Its height was: %d ", pic->height);
esp_http_client_handle_t esp_client = esp_http_client_init(&config);
//設定HTTP請求頭為image/jpg表示圖片型別
esp_http_client_set_header(esp_client, "Content-Type", "image/jpg");
//設定圖片名字
esp_http_client_set_header(esp_client, "Name-Pic", &(test_task_param->pic_name_p));
//把圖片放在body里面
esp_http_client_set_post_field(esp_client, (const char *)pic->buf, pic->len);
//開始執行請求服務器
res = esp_http_client_perform(esp_client);
//判斷是否請求成功
if (res == ESP_OK)
{
ESP_LOGI(TAG, "HTTPS Status = %d", esp_http_client_get_status_code(esp_client));
}
else
{
ESP_LOGE(TAG, "perform http request %s", esp_err_to_name(res));
}
ESP_ERROR_CHECK(esp_http_client_cleanup(esp_client));
}
}
六、微信小程式開發準備
配置服務器資訊,然后拍照上傳,
data: {
host: 'a0je61b5.mqtt.iot.gz.baidubce.com',
subTopic: '/light/deviceOut',
pubTopic: '/light/deviceIn',
msg: 'Hello! I am from WeChat miniprogram',
//默認顯示的圖片
img_url: 'https://docs.ai-thinker.com/_media/o1cn01faxszt1ls4mym2mkb_2922621297.png',
mqttOptions: {
protocolVersion: 4, //MQTT連接協議版本
clientId: 'DeviceId-jviujtntjy',
clean: true,
password: 'sM2hrD6kcRFlmIgR2F',
username: 'a0je61a/wechat',
reconnectPeriod: 1000, // 1000毫秒,兩次重新連接之間的間隔
connectTimeout: 30 * 1000, // 1000毫秒,兩次重新連接之間的間隔
resubscribe: true // 如果連接斷開并重新連接,則會再次自動訂閱已訂閱的主題(默認true)
}
}
let that = this
client = mqtt.connect(`wxs://${this.data.host}/mqtt`, this.data.mqttOptions)
client.on('reconnect', (error) => {
console.log('Reconnecting...')
})
client.on('error', (error) => {
console.log('連接失敗:', error)
})
client.on('connect', () => {
wx.showToast({
title: '連接成功'
})
client.subscribe(this.data.subTopic, (err) => {
})
client.on('message', (topic, payload) => {
let object = JSON.parse(payload)
//base64解碼url地址
let url = that.base64_decode(object.url)
console.log(url)
that.setData({
img_url: url
})
wx.showModal({
content: `收到 Topic: ${topic}, Payload: ${url}`,
showCancel: false,
});
})
})
原始碼下載
模組代碼:https://github.com/xuhongv/StudyInEsp32/24_esp32s2_s3_camera_wechat_mini
微信小程式代碼:https://github.com/xuhongv/RemoteWeChatForESP
服務器代碼:見本文章服務器代碼介紹章節,
另外,不要把我的博客作為學習標準,我的只是筆記,難有疏忽之處,如果有,請指出來,也歡迎留言哈!
- 玩轉
esp8266帶你飛、加群QQ群,不喜的朋友勿噴勿加:434878850 - 個人郵箱:xuhongv@yeah.net 24小時在線,有發必回復!
- esp8266源代碼學習匯總(持續更新,歡迎star):https://github.com/xuhongv/StudyInEsp8266
- esp32源代碼學習匯總(持續更新,歡迎star):https://github.com/xuhongv/StudyInEsp32
- 關注下面微信公眾號二維碼,干貨多多,第一時間推送!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/327940.html
標籤:其他
