使用 micropython 编写 ESP32-CAM 自动拍照程序

一、本章介绍

为了展现课堂的学习成果,以及记录自己的学习进度,本人将使用 micropython 编写一个 ESP32-CAM 的自动拍照程序。

何为"自动"?这里指的是 ESP32-CAM 每隔一段时间拍张照片上传服务器,达到图像采集的作用,采集到图像之后就能做识别等一系列动作。

二、环境准备

1.MicroPython for ESP32 烧录档

我已经将其下载好上传到百度云盘中,可以直接下载,也可以去MicroPython 的官网 (https://micropython.org/) 下载。

1.MicroPython for ESP32 烧录档(百度云盘,提取码ccit)

2.本项目要用的烧录档是 micropython_cmake_9f (百度云盘,提取码ccit)

注:1号烧录档提供 MicroPython,可以让我们用MicroPython编程,但是这个烧录档中没有我们这个项目要用到的组件。2号烧录档中有这次项目要用到的组件。

大家可以按需下载。

2.esptool.py

esptool.py 是乐鑫提供的开源库工具,用于乐鑫 ESP8285, ESP8266, ESP32, ESP32-S等系列芯片和 ROM Bootloader(即:一级 bootloader)通讯,从而实现:

固件烧录,flash 擦除,flash 读取,读 MAC 地址,读 flash id ,elf 文件转 bin 等常用功能;

flash 校验, 读取内存,载入 bin 到 RAM 执行,读内存,写内存,读 flash 状态,写 flash 状态,读 chip id,组装 bin等高级功能。

它可以通过 pip 直接安装,命令:

pip install esptool

3.Thonny for Windows

Thonny ,Python IDE,可进行Python程式设计,也可以直接将程式码烧录到ESP32CAM。

Thonny for Windows (百度云盘,提取码ccit)

注:在选择 Select install mode 的时候,选择 Install for me only

4.CH340驱动

大部分Win7和小部分Win10的电脑无法直接识别CH340模块,如果将 CH340 连接上电脑后没有在设备管理器中的端口里看到(如下图所示),则所处的电脑环境比较旧,需要下载CH340驱动。
在这里插入图片描述

注:安装时记得先进行移除再安装,这样比较能确保驱动安装成功。

三、 软硬件集成

上述软件准备完成之后,就可以将 ESP32-CAM 连接到电脑了。

1.将 CH340 模块与 ESP32-CAM 连接,使其处于下载模式(如下图所示)。
在这里插入图片描述

2.将 CH340 模块的 USB 接口连接至电脑。

使用 Thonny 配置解释器

1.打开 Thonny ,选择运行->配置解释器…

打开之后的界面如下:
在这里插入图片描述

2.选择解释器以及端口

解释器:MicroPython(ESP32)
端口或 WebREPL:USB-SERIAL CH340 (COM5)

3.全部选择完成之后单击Install or update firmware

在这里插入图片描述

使用 Thonny 烧录固件
安装并更新 MicroPython,指定端口(Port)跟烧录档固件(Firmware)

端口(Port): USB-SERIAL CH340 (COM5)
固件(Firmware): micropython_cmake_9f.bin
烧录模式(Flash mode): From image file (keep)
勾选先删除后安装*(Erase flash before installing)*

全部选择完成之后单击安装,开始烧录。
在这里插入图片描述

开始烧录:
在这里插入图片描述

烧录完成:
在这里插入图片描述

烧录完成之后单击关闭,退出烧录界面,之后将 ESP32-CAM 的跳脚帽移除,使其处于调试模式(如下图)
在这里插入图片描述

按下 reset 键重启 ESP32-CAM,之后就能在 Thonny 中看到成功连接 ESP32-CAM 的调试界面。(如下图)
在这里插入图片描述

之后我们就可以编写本次项目所需要的代码了!

四、具体实现

架构图:
在这里插入图片描述
在上述架构图描述下,我们必须要有一个通道,使Flask能接收到ESP32-CAM的请求,这个通道就是API。
那么怎么创建一个API呢?
首先我们先创建一个Flask服务器,服务器运行之后必然有一个IP(如图)。
请添加图片描述
此时我们的IP就是http://192.168.199.231:5000

这是我们不妨想一想,服务器会只有一个API吗?,答案显然不是,服务器不同的API承担着不同的功能,所以我们就要创建不同的API。(如图)
请添加图片描述
/esp32_im就是我们创建的一个API,它接受POST以及GET请求,这个API的作用是接受ESP32-CAM的图片并以月日时分秒的文件名称保存起来。

所以一段完整的API就是http://192.168.199.231:5000/esp32_im

智能设备

ESP32-CAM端:

from machine import Pin

# 声明引脚 4 作为LED的引脚
led_pin = Pin(4, Pin.OUT)

# enable station interface and connect to WiFi access point
import time, network, ntptime

def connectWiFi():
    wlan = network.WLAN(network.STA_IF)
    if wlan.isconnected():
        wlan.disconnect()
    wlan.active(True)
    wlan.connect('your-ssid', 'pasword)
    while not wlan.isconnected():
        pass
    print('network config: ', wlan.ifconfig())

connectWiFi()

import time
import camera
import urequests as requests
import utime as time

# 单纯拍照,不上传也不保存
#def image_feed():
    
    #while not camera.init(0):
        #time.sleep(1)
    #led_pin.value(1)
    #frame = camera.capture()
    #camera.deinit()
    #return frame, 200, {'Content-Type': 'image/jpeg'}

def send_image():
	#完整API
    url = 'your flask-API'
    while not camera.init(0):
        time.sleep(1)
    # 拍照之前点亮led灯
    led_pin.value(1)
    frame = camera.capture()
    camera.deinit()
    # 拍照之后关闭led灯
    led_pin.value(0)
    r = requests.post(url, headers = {'content-type': 'image/jpeg'}, data = frame)
    print(r.json())
    return r.json(), 200, {'Content-Type': 'application/json'}

    
# 每隔5秒执行一次拍照并上传操作

while True:
    # 开始拍照上传
    send_image()
    time.sleep(5)

编写一个send_image的方法,在方法中控制ESP-CAM拍照和发送POST指令给Flask服务器。

注:运行之前务必修改wifi账号和密码以及后端服务器创建的API。

后端

flask服务器:

from flask import Flask, request, jsonify
import time 

app = Flask(__name__)

@app.route("/esp32_im", methods=["POST","GET"])
def process_image():
    print("保存图片")
    imageData = request.get_data(parse_form_data=False)

    filename = time.strftime("%m%d%H%M%S", time.localtime()) + ".jpg"
    path = "./test_imgs/" + str(filename)

    file = open(path, "wb")
    file.write(imageData)

    return jsonify({'msg': 'img is writed'})

if __name__ == "__main__":
    app.run(host='0.0.0.0',debug=True,)   

后端Flask主要作用是接受图片,并且将图片以当前时间作为文件名保存,这样就避免了重复文件名。

效果图展示:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结:
当前做到了ESP32-CAM自动拍照并且将照片上传到服务器,做到了图像采集的作用,在接下来我将完善功能,做到利用智能识别程序,将识别的图像返回到前端。

五、遇到问题:

如果大家在运行 ESP32-CAM 程序的时候遇到 ‘no module named ‘urequests’’ 这个问题,说明大家没有导入 urequests 这个库,这个库是用来发送请求的。那么怎么解决?

我已经将 urequests.py 上传百度云盘,urequests.py,提取码:ccit

大家下载文件到本地然后打开 Thonny ,点击左上角文件中的打开…,选择 MicroPython设备,右键界面点击新文件夹…,创建一个新的文件夹名为lib,然后将我们刚刚下载的urequests.py文件放入其中。

在这里插入图片描述
在这里插入图片描述

参考资料:

智能设备 - ESP32-CAM上网、拍照、上传图片与状态显示

ESP32-CAM 使用 MicroPython 进行开发 - 使用图形化工具 Thonny (Windows)

上传图片与状态显示

ESP32-CAM 使用 MicroPython 进行开发 - 使用图形化工具 Thonny (Windows)

  • 3
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值