文章目录

  • 一、 ESP32-S3 特性
    • CPU 和存储
    • 外设接口和传感器
    • 功耗特性
  • 二、 准备工作
    • 硬件
    • 软件
    • 接线
  • 三、通讯协议和原理
    • 3.1 模组拍照上传服务器
    • 3.2 小程序下发指令给模组拍照给服务器
    • 3.3 模组把上传服务器结果回调给小程序
  • 四、服务器准备
    • 3.1 接收图片处理
    • 3.2 接收图片处理
    • 3.3 服务器业务逻辑
  • 五、嵌入式开发准备
  • 六、微信小程序开发准备
      • 源码下载
    • 联系我们

一、 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 服务器业务逻辑

  1. 接受到S3模组发过来的图片,存储到本地服务器某个文件夹里面。
  2. 同时把这个图片,发送到阿里云对象存储,返回一个可远程访问图片的地址给模组。

五、嵌入式开发准备

配置服务器信息,然后拍照上传。

    //配置服务器相关信息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 = thisclient = 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/tree/master/24_esp32s2_s3_camera_wechat_mini

微信小程序代码:https://github.com/xuhongv/RemoteWeChatForESP

服务器代码:见本文章服务器代码介绍章节。

本文转载于半颗心脏博客CSDN原文,已取得授权。

联系我们

官方官网:https://www.ai-thinker.com
开发资料:https://docs.ai-thinker.com/
官方论坛:http://bbs.ai-thinker.com
技术支持:support@aithinker.com
公司地址: 深圳市宝安区西乡固戍华丰智慧创新港C栋410

安信可 ESP32-S3 模组上驱动摄像头 OV2640,实现远程拍照并 HTTP 传输到阿里云对象存储OSS,并显示在微信小程序上。(深度好文,全部开源)相关推荐

  1. 阿里云对象存储OSS图片上传并回显

    阿里云对象存储OSS图片上传并回显 Java代码实现 引入依赖 <!-- 引入阿里云OSS依赖--><dependency><groupId>com.aliyun. ...

  2. 阿里云对象存储OSS文件上传

    阿里云oss地址: 对象存储OSS_云存储服务_企业数据管理_存储-阿里云阿里云对象存储OSS是一款海量.安全.低成本.高可靠的云存储服务,提供12个9的数据持久性,99.995%的数据可用性和多种存 ...

  3. spring boot上传阿里云对象存储OSS快速上手(一、控制台简介)

    代码实现请看下一篇: spring boot上传阿里云对象存储OSS快速上手(二.代码实现,复制粘贴可用) 简介: 1.阿里云对象存储OSS其实就是一个文件存储的服务 2.在我们的开发过程中会遇到类似 ...

  4. C# 阿里云对象存储OSS创建、删除、上传代码实现

    一.开始接入 1.Nuget安装Aliyun.OSS.SDK: 2.代码实现: /// <summary> /// 阿里云对象存储服务 /// </summary> publi ...

  5. JavaSDK上传文件到阿里云对象存储oss

    1.引入阿里云SDK的maven依赖 <!-- 阿里云sdk--><dependency><groupId>com.aliyun.oss</groupId&g ...

  6. springboot+vue实现上传头像文件到阿里云对象存储oss

    在阿里云oss上创建一个bucket,获取四个信息: 编写工具类,提供对外调用四个信息的方法: //当项目一启动,就执行接口的方法,读取配置文件内容 @Component public class C ...

  7. iOS阿里云对象存储 OSS文件的上传/下载的实现

    之前的项目中,图片语音等资源文件都是直接上传数据流给服务器,然后服务器进行处理和存储.最近的这个项目,服务器直接开的OSS,然后客户端直接使用阿里云提供的上传下载功能来上传和下载资源. 阿里云对图片的 ...

  8. uni-app uni-file-picker文件上传实现拍摄从相册选择获取图片上传文档服务器(H5上传-微信小程序上传)

    前言 最近在使用uni-app写H5移动端,有一个从手机拍摄从相册选择获取图片上传到文档服务器功能. 查阅uni-app发现关于上传图片,uni-file-picker文件上传,uni.chooseI ...

  9. Python使用阿里云对象存储OSS--服务器端上传文件

    一直在使用阿里云对象存储Oss,今天来总结一下基本用法,主要写个逻辑,具体操作都有详细的文档,会附链接 1  开通服务 首先需要开通oss服务以及创建存储空间,需要注意的是开通完oss服务之后默认的是 ...

最新文章

  1. 人工智能入门:keras的example文件解析
  2. 网校mysql设计规范_点击!2019年9月二级MySQL试题
  3. 图像对象paip.Image对象出现“对象当前正在其他地方使用或者GDI+中发生一般性错误的解决...
  4. 业务活动监视器(BAM)2.0带来的革命
  5. 两块网卡实现多台机器共享上网
  6. python使用virtualenvwrapper
  7. 五、扩展Orchard(五) Writing a Content Part
  8. jQuery从后面开始截取
  9. 林锐-《我的大学十年》
  10. matlab画入射系数和透射系数,反射系数和透射系数.ppt
  11. r语言导出文件为xlxs_R语言数据导出到Excel表格-如何将R语言中的表格数据输出为Excel文件...
  12. 老挑毛u盘一键装系统计算机意外地,揭谜一键Ghost的“恶”事 大白菜、老毛桃、通用都不干净...
  13. win7防火墙怎么关_win7系统防火墙开启失败怎么办【解决方法】
  14. 一键录屏神器——Captura
  15. android开发--使用webView加载tel协议不会打开拨号盘解决
  16. jodaTime 的使用说明
  17. JAVA计算机毕业设计物料追溯系统(附源码、数据库)
  18. 抽取游戏礼包中的物品的常见逻辑
  19. 华为固件解包工具linux,华为固件解包工具-官方版-华为固件解包工具update.app官方版-独木成林...
  20. Duda I/O-Duda I/O

热门文章

  1. tp5 读取/下载 excel文件内容
  2. 思特沃克(ThoughtWorks) 外企面试题 面试经验分析 面试题 软件测试工程师 测试面试题分享 测试需求理解和用例设计编写 SeleniumUI自动化测试 接口测试 性能测试 实战之战损版
  3. 商标注册未通过阿里云初审被驳回原因和解决方法
  4. 【博客系统】前端页面
  5. java string 大小空间_String的长度和储存大小
  6. 5分钟搞懂“区块链”
  7. 学好三维建模,先从软件开始(一)
  8. php案例分析百度云_案例 | QQ 音乐还是网易云音乐?看完分析,你会选哪一个?...
  9. 做新时代好老师征文计算机老师,如何做一名新时代的好老师
  10. 8_小米监控Open-Falcon安装查询组件-API