使用 micropython 编写 ESP32-CAM 自动拍照程序
使用 micropython 编写 ESP32-CAM 自动拍照程序
使用 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上网、拍照、上传图片与状态显示
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)