ESP32-CAM应用(Micropython+Thonny)

AI摘要

本文介绍了ESP32-CAM在Micropython和Thonny环境下的应用。首先讲解了环境搭建,包括安装Thonny和Micropython ES32-CAM固件;接着给出拍照、录像、网络服务器等示例,还提及自制微型相机的硬件连接和注意事项;最后提醒多看官方文档。

0.废话前言

话说ESP32-CAM有多少人在用呢?

这种东西,属于是......

爱用不想用

虽然说扩展性很强,但是程序是真不爱写。

虽然说能联网,能拍照,但是FPS也太低了...

(话说ov2640是真的辣鸡)

那么回归主题

1.环境搭建

1-~.材料

材料清单
ESP32-CAM(带ov2640摄像头)
CH340 USB转TTL模块
两母头杜邦线
开关(焊有杜邦线,选配)

1-a.安装Thonny

很简单,去Thonny官方下载对于你的系统比较合适的版本,我这里用的是Windows的Python3.10版本,下的慢的可以看我的文章顶部的Thonny下载。

1-b.安装固件

打开Thonny,点击右下角的<No backend>(也有可能是别的):

点击<配置解释器>:

点击<安装或更新 MicroPython (esptool)>:

点击三个小横线(窗口左下角可能会报Error!不用管,我们用不到自带下载的固件):

点击<Select local MicroPython image>:

然后去下载Micropython ES32-CAM固件,国内的GitCode,各位应该能下,或者看文章顶部的资源。

回到刚才的选择文件,选择刚下的固件:

然后将ESP32-CAM连接到USB转TTL模块上,连接方法:

USB转TTL模块ESP32-CAM模块
5V5V
TXD/UOTRXD
RXD/UORTXD
GNDGND
特殊:ESP32-CAM的IO0GND

将USB转TTL模块接到电脑上:

打开设备管理器

查看端口号:

(端口号多数人不会一样)

单击安装:

然后就开始下载固件了:

过程比较慢,稍等一会就好了(如果TimeOut报错或者没有回应数据,就检查你的IO0有没有接到GND上并复位,就是那个复位小按键,接好后上电按下再试试):

完成后拔下IO0接GND的那根线,按下复位键或重新上电,再关闭其他弹窗,点击Thonny右下角的按钮,选择<MicroPython (ESP32) · USB Serial @ 你的端口号>:

 然后就好啦!

2.示例

2-a.拍照

import camera                    # 导入ESP32-CAM专用固件的特殊摄像库


camera.init(0, format=camera.JPEG, fb_location=camera.PSRAM) # 初始化摄像头,fb_location是设置存储在哪个临时RAM(camera.RAM和camera.PSRAM,PSRAM更大但有些设备不支持,可自行设置)

camera.quality(10)               # 设置质量,10为最好,63为最差
camera.framesize(camera.FRAME_SVGA) # 设置分辨率,见官方文档,FHD最佳(1920*1080),此处用到的为800*600
buf = camera.capture()           # 拍照(buf为图片二进制数据,不要晃动摄像头,快门需要时间)
camera.deinit()                  # 反初始化摄像头,释放临时RAM,防止再次运行此程序导致重复初始化报错或RAM占用过多报错
with open(f"Photo.jpg", "wb") as f: # 打开并覆盖文件
    f.write(buf)                 # 写入数据


# 温馨提示:有时初始化后第一张照片会偏色(我的是绿色)可以写程序再次拍照(再次拍照不用反初始化)
# 曝光不足也有可能偏色

2-b.录像

由于文件较大,使用了Micro SD卡,请提前插入Micro SD卡

声明一点:ESP32-CAM最好使用FAT32文件系统,格式化时选择,务必备份,本人不承担任何因为自行格式化导致数据丢失的责任!

.H264文件需要自行转为MP4,ESP32-CAM无法输出MP4

import camera
import time
from machine import SDCard

# 初始化相机
camera.init(0, format=camera.JPEG)

# 挂载 SD 卡(不需要可以注释掉)
uos.mount(SDCard(), '/sd')

# 设置相机参数
camera.framesize(camera.FRAME_SVGA)  # 设置分辨率
camera.quality(10)  # 设置图片质量

# 开始录像
camera.start_recording('/sd/video.h264')  # 指定录像文件路径(不要SD卡可以将"/sd"删除)

# 录像一段时间
time.sleep(10)

# 停止录像
camera.stop_recording()

# 释放资源
camera.deinit()
uos.umount('/sd')        # 不需要可以注释掉

2-c.网络服务器

别忘了改网络SSID和密码

import network
import socket
import camera
import image
import time

# 连接到Wi-Fi网络
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('SSID', 'Password')    # 改为你的网络SSID和密码
while not wlan.isconnected():
    time.sleep(1)

print('WiFi connected')
print('IP address:', wlan.ifconfig()[0])

# 初始化摄像头
camera.init(0, format=camera.JPEG)
camera.framesize(camera.QVGA)  # 设置分辨率为QVGA
camera.quality(90)  # 设置JPEG质量

# 创建Web服务器
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(1)
print('Listening on socket...')
conn, addr = s.accept()
print('Connected by', addr)

while True:
    # 捕获图像
    img = camera.capture()
    img_bytes = img.to_bytes()

    # 发送图像
    conn.send(img_bytes)

2-d.我自己做的微型相机

硬件:按钮两头一端接3.3V(有可能标为3V3,是ESP32-CAM模块上的),一头接IO12

为了防止内存爆炸与偏色,使用了闪光灯、第一次重复拍照以及次数限制(20张),不可使用SD卡,因为会与闪光灯冲突(顺手做了个板载指示灯)

不要忘记提前创建pic文件夹

from machine import Timer, Pin
import os
# enable station interface and connect to WiFi access point
import camera
import time

(ST_INIT, ST_READY, ST_BUSY) = (300, 0, 100)
num = 0
is_t = False

def toggle_led(led_pin):
    led_pin.value(not led_pin.value())

def led_blink_timed(timer, led_pin, state):
    if state == 'READY':
        timer.deinit()
        led_pin.value(ST_READY)
    elif state == 'INIT':
        timer.init(period=ST_INIT, mode=Timer.PERIODIC, callback=lambda t: toggle_led(led_pin))
    elif state == 'BUSY':
        timer.init(period=ST_BUSY, mode=Timer.PERIODIC, callback=lambda t: toggle_led(led_pin))
    else:
        print('not define yet')

# 声明引脚 D2 作为LED的引脚
led_pin = Pin(33, Pin.OUT)
lighter = Pin(4, Pin.OUT)
press = Pin(12, Pin.IN, Pin.PULL_DOWN)
timer = Timer(1)  # 创建定时器对象
# 定时器触发
led_blink_timed(timer, led_pin, state='INIT')

# camera.init(0, format=camera.JPEG, fb_location=camera.PSRAM)
# camera.quality(10)
# camera.framesize(camera.FRAME_SVGA)
led_blink_timed(timer, led_pin, state='READY')

def take_photo():
    camera.init(0, format=camera.JPEG, fb_location=camera.PSRAM)
    camera.quality(10)
    camera.framesize(camera.FRAME_SVGA )
    led_blink_timed(timer, led_pin, state='BUSY')
    global num
    if num >= 20:
        lighter.value(1)
        time.sleep(0.1)
        lighter.value(0)
        time.sleep(0.1)
        lighter.value(1)
        time.sleep(0.1)
        lighter.value(0)
        time.sleep(0.1)
        return
    if num == 0:
        lighter.value(1)
        time.sleep(0.1)
        buf = camera.capture()
        with open(f"Photo{num}.png", "wb") as f:
            f.write(buf)
        print("FA")
        camera.quality(10)
        camera.framesize(camera.FRAME_SVGA)
        time.sleep(0.1)
        buf = camera.capture()
        camera.deinit()
        with open(f"Photo{num}.png", "wb") as f:
            f.write(buf)
        print("Suc")
        num += 1
        time.sleep(0.3)
        lighter.value(0)
        led_blink_timed(timer, led_pin, state='READY')
        return
    lighter.value(1)
    time.sleep(0.1)
    buf = camera.capture()
    camera.deinit()
    with open(f"Photo{num}.png", "wb") as f:
        f.write(buf)
        print("Suc")
        num += 1
    time.sleep(0.3)
    lighter.value(0)
    led_blink_timed(timer, led_pin, state='READY')
    
def copy(std, tdd):
    with open(std, "rb") as fs:
        with open(tdd + "/" + std.split("/")[-1], "wb") as f:
            f.write(fs.read())

def cf(folder_path="./", extension="png", td="./pic"):
    for filename in os.listdir(folder_path):
        if filename.endswith(extension):
            file_path = folder_path + "/" + filename
            copy(file_path, "pic")
    
def df(folder_path="./", extension="png"):
    for filename in os.listdir(folder_path):
        if filename.endswith(extension):
            file_path = folder_path + "/" + filename
            os.remove(file_path)

df(folder_path="./pic")
cf()
df()
while True:
    if press.value() == 1:
        if is_t:
            continue
        take_photo()
        is_t = True
    else:
        is_t = False
        



3.总结

什么也没有......(多看官方文档!)

ESP32-CAM入门教程 ArduinoESP32-CAM下载模块(接上USB就能用,很方便,如果没有买就只有资金用USB-TTL了)如下图两个合在一起如下图。 阅读详情

相关推荐

ESP32-CAM烧录与MicroPython通信实战指南

ESP32-CAM是低成本AI视觉开发的典型硬件平台,其核心能力依赖于稳定烧录与可靠UART通信。烧录本质是与ESP32 Boot ROM建立物理层握手,需严格匹配电平、波特率(115200)、同步字节及GPIO0拉低时序;通信则需应对缓冲区溢出、电平不匹配和时序抖动等嵌入式现实问题。MicroPython作为轻量级运行时,在PSRAM支持、内存管理与REPL调试方面提供独特优势,尤其适配Thonny这类专注嵌入式Python开发的IDE。本文聚焦烧录失败率、通信丢包、固件兼容性等高频工程痛点,覆盖从硬件握

weixin_34268753的博客 427

ESP32-CAM ——Blinker平台

ESP32-CAM,点灯云平台Blinker,MQTT协议,APP控制,Wifi视频监控,点灯,控制舵机。

qq_73379310的博客 9014

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

ESP32-CAM是安信可发布小尺寸的摄像头模组。该模块可以作为最小系统独立工作,尺寸仅为2740.54.5mm。ESP32-CAM可广泛应用于各种物联网场合,适用于家庭智能设备、工业无线控制、无线监控、人脸识别以及其它物联网应用,是物联网应用的理想解决方案。ESP32-CAM采用DIP封装,直接插上底板即可使用,实现产品的快速生产,为客户提供高可靠性的连接方式,方便应用于各种物联网硬件终端场合。

m0_50614038的博客 1万+

ESP32-CAM入门

ESP32-CAM可选用淘宝带的烧录座,这个直接用常见的手机数据线就可以连接了,也可以用USB To TTL,实质也是串口通信,感觉烧录座的原理也一样,我使用的是USB To TTL的。12.注意还需要找到111行这里的代码,这里默认的是OV3660,需要更改为自已购买的摄像头型号,在这里卡了很久,一直下载不成功就是因为这里参数不匹配,我的更改为2640。15. 下载成功后点击右上角的串口监视器,然后把掉IO0和GND的连接,复位重启ESP32-CAM,就会有下图网址出现,复制其到浏览器上。

m0_71827453的博客 9094

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

ESP32-CAM是安信可发布小尺寸的摄像头模组。该模块可以作为最小系统独立工作,尺寸仅为2740.54.5mm。ESP32-CAM可广泛应用于各种物联网场合,适用于家庭智能设备、工业无线控制、无线监控、人脸识别以及其它物联网应用,是物联网应用的理想解决方案。ESP32-CAM采用DIP封装,直接插上底板即可使用,实现产品的快速生产,为客户提供高可靠性的连接方式,方便应用于各种物联网硬件终端场合。

m0_50614038的博客 5458

ESP32-Cam网络开发(1)------环境搭建(micropython)

1. 由于micropython官网并没有esp32-cam的相关固件,所以要到这个地址下载esp32-cam专属的固件.地址:ESP32-cam专属固件. 2. 固件下载完成后,要在电脑安装 CH340驱动,这样才能将固件烧录到esp32中. 3.准备好以上要求后,还需要下载一个IDE. 这里推荐 Thonny地址. 4.所有工作准备完成后,使用Thonny将下载好的固件烧录到esp32中. 一 : 二 : ............

qq_44619703的博客 6875

【嵌入式外设】 ESP32-CAM(局域图传+STM32通信)

这里就是介绍一下我使用ESP32-CAN的使用心得,并且附带使用流程,环境搭建以及代码供大家使用和查看,希望对大家有所帮助咯~~

herui的博客 1万+

ESP32-CAM与Thonny的完美搭配:从烧录到通信的完整流程

本文详细介绍了如何将ESP32-CAM与Thonny IDE完美结合,从固件烧录到通信测试的完整流程。通过硬件连接、MicroPython固件烧录、Thonny环境配置以及摄像头功能开发等步骤,帮助开发者快速搭建高效的物联网开发环境,实现图像采集与无线通信功能。

tomato的博客 1122

ESP32CAM物联网教学10

当然也可以把编写完成的程序写入开发板中,这样开发板离开了电脑,只要接通电源,就能独立运行芯片中存入的程序(和Python一样,芯片接通电源后,会首先运行名为“main.py”的程序,并从这个程序文件中的“main(){}”主程序开始一条一条地执行指令。这时候,我们把左侧文件管理的上面的框拉长一些,就能看到这个从ESP32Cam开发板中下载到的“第一张图.png”(当然你也可以在我的电脑相应的文件夹里面找到这个图片文件),右击文件选择“用外部默认程序打开”,就可以看到这张图了。安装完成后打开程序。

tongyue的专栏 1746

ESP32-CAM开发全攻略:从Arduino到MicroPython的实战指南

本文提供了一份全面的ESP32-CAM开发实战指南,涵盖从Arduino IDE环境搭建、CameraWebServer示例配置,到MicroPython固件烧录与Thonny IDE使用的完整流程。文章详细解析了两种开发方式的优势与步骤,并分享了智能门铃、视频流等实战项目与电源、内存、Wi-Fi稳定性等深度优化技巧,帮助开发者高效掌握这一物联网视觉应用核心模块。

q5r6s7的博客 1014

ESP32-CAM + Thonny MicroPython一站式烧录与开发指南

MicroPython是一种轻量级Python实现,专为微控制器设计,其核心价值在于将高级语言能力带入资源受限的嵌入式设备。它通过精简语法、内置硬件驱动和REPL交互式调试,显著降低IoT开发门槛。在ESP32系列中,ESP32-CAM因集成OV2640摄像头与PSRAM而成为视觉AI入门首选,但其特殊Flash分区、PSRAM初始化及时序敏感的UART烧录流程,常导致固件刷写失败、串口失联或camera模块导入错误。Thonny作为专为初学者优化的IDE,通过自动适配ESP32-CAM硬件特征(如GPIO

weixin_33882452的博客 368

【详细教程】使用Thonny通过烧录座为ESP32-CAM准备Micropython

ESP32-CAM,不用USB转TTL模块,使用烧录座刷入固件并测试

cjl1581828388的博客 2994

ESP32-CAM实战:Micropython与Thonny搭建智能视觉监控系统

本文详细介绍了如何使用ESP32-CAM配合Micropython和Thonny开发环境搭建智能视觉监控系统。内容涵盖硬件连接、固件烧录、摄像头基础功能、网络服务器搭建及运动检测等高级应用,为开发者提供从入门到实战的完整指南,助力快速实现低成本物联网视觉解决方案。

a2b3c4d5e的博客 669

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

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

qq_62819897的博客 5343

esp32CAM环境搭建(arduino+MicroPython+thonny+固件)_thonny esp32-cam

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!" />你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!更多资料点击此处获qu!!

2401_83817843的博客 1233

【雕爷学编程】MicroPython手册之 ESP32-CAM 目标检测

要点解读:这个程序使用了OpenCV库进行目标检测,通过加载训练好的模型文件,将摄像头获取的图像转换为blob数据格式,并输入到神经网络模型中,得到目标检测的输出结果。训练数据集和模型优化:为了实现准确的目标检测,需要准备适当的训练数据集,并进行模型的训练和优化。合适的数据集和标注工作是必要的,同时需要选择合适的算法和模型架构,并进行充分的训练和验证。需要选择适当的算法和模型架构,并进行硬件性能的评估和优化,以满足实时目标检测的需求。环境条件和目标特征:在进行目标检测时,需要考虑环境条件和目标特征的影响。

雕爷学编程 2197

ESP32-CAM+Thonny+MicroPython稳定开发全指南

ESP32-CAM是一种集成OV2640摄像头与ESP32-WROVER-B芯片的嵌入式视觉模组,其核心挑战在于PSRAM内存管理、UART烧录可靠性及摄像头初始化稳定性。MicroPython通过深度优化PSRAM访问机制,配合Thonny内置兼容驱动与图形化固件烧录流程,显著降低开发门槛。该组合在串口通信稳定性、中文错误提示支持、GPIO物理层容错等方面具备工程级鲁棒性,广泛应用于智能监控、边缘图像采集等IoT场景。本文聚焦esp32-cam刷机程序配置与固件下载实操,详解硬件验证、固件选型及REPL调

weixin_34265814的博客 371

车辆TBOX科普 第69次 TBOX行业发展趋势与就业前景深度解析

TBOX技术革新驱动汽车智能化发展 Telematics BOX(TBOX)正快速从车辆状态监控器进化为整车智能核心,市场年增速超25%,2025年规模将达150亿美元。技术呈现四大革新方向:5G与V2X集成实现多模通信网关,支持10-20Gbps高速传输;多模GNSS融合定位精度达厘米级,北斗系统提供独特优势;边缘计算架构使TBOX具备本地AI处理能力,减少95%数据上传;硬件安全模块(HSM)成为标配,满足EVITA标准的安全需求。这些技术突破正重塑TBOX架构,使其从单纯通信管道升级为智能网联汽车的关

IT深耕十余载,大道之简 1827

ESP32/ESP8266/ESP-CAM + MicroPython环境搭建+基础使用

MicroPython 是一种精简版的 Python 编程语言,专门设计用于嵌入式系统和物联网(IoT)开发。它提供了一个 Python 3 的子集,适用于资源受限的微控制器和单片机环境。MicroPython 允许开发人员使用 Python 的简洁语法和强大功能来编写嵌入式系统的代码。以下是一些关于 MicroPython 的要点:特点:用途:如何开始:语法:MicroPython 为嵌入式开发者提供了一个用 Python 进行编程的轻量级选项,让开发者能够更方便地利用 Python 的优势开发嵌入式系统

Apostoli的博客 3981

树莓派与stm32通信超详细解答过程

笔者之前发过关于stm32与openmv通信的教程,在学习了几天opencv后,想实现树莓派4B与stm32进行通信。于是上网查询资料,最后实现了两者之间的通信,相信这对大多数电赛人都很有帮助,opencv的识别效果是远高于openmv以及K210的。在此我参考了以下资料辅助我学习,大家可以参考。基于树莓派4B与STM32的UART串口通信实验(代码开源)_树莓派4b串口波特率-优快云博客。

Halcyon0804的博客 5465

【STM32学习】(29)STM32实现595驱动三个数码管(标准库和HAL库实现)

我选用的单片机型号为:STM32F103系列 74LS595是一个串转并行输出的芯片,它能为单片机节省很多的IO口,应用场景广泛。 现要求三个数码管动态显示,常规设计都是并行实现,需要8个IO数据口,然后还需要3个IO片选数码管接口,这样大大占用了IO口,导致连接的外设变少。因此我们引入74LS595芯片。电路设计如下: 只需要三个共阴极数码管与三个595芯片级联即可完成,通过RCLK,SCK,SER三个IO即可完成对数码管的动态控制并显示。电路焊接的实物图如下: 要求完成功能:实现数.

XiaoCaiDaYong的博客 8265
上一篇: 论如何制作私人/公共网盘这件事
下一篇: Equation Solver包——已同步PyPI
qiaoen_python
博客等级 码龄5年 54粉丝 18原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值