ESP32系列文章目录

第一章 esp32-cam 实现定时拍照并发送邮件


文章目录

  • ESP32系列文章目录
  • 前言
  • 一、 ESP32-cam开发环境配置
  • 二、设备接线
    • 1.接线图
  • 三、代码解析
  • 四、效果演示
    • 1 邮箱收件箱展示
    • 2 邮件附件查看
  • 四、测试总结

前言

曾经100给网友交付的一个项目,记录下来方便大家学习。

由于ESP8266本身的定位就是低成本的联网方案,所以它的性能不会太高,不适合做太复杂的事情。
后来,安信可又推出了一款WIFI/蓝牙模块ESP32,它可以说是ESP8266的增强版。除了增加了蓝牙4.2之外,还增加了非常丰富的外设,如:ADC、SPI、IIC、IIS、SDIO、UART、PWM、红外控制器、有线以太网MAC、AES、SHA、RSA、随机数产生器、PID控制器、电容触摸传感器、低噪放、温度传感器、DAC等。同时,CPU主频高达240MHz,但是,价格也不高。

STM32也推出了一款类似的芯片,就是STM32WB系列,也就是STM32增加了蓝牙5、OpenThread、ZigBee 3.0等功能。

TI也有类似的芯片CC2652R,集成了48MHz主频的ARM M4F内核,支持蓝牙5、WIFI、Thread、ZigBee,可以在淘宝上买到,但是比较贵。

显然,ESP32比STM32WB和CC2652R更有价格优势。

以下均以ESP32S模块为例,介绍开发时的注意事项。不定期更新。。


一、 ESP32-cam开发环境配置

本例程 是利用arduino IDE开发,关于arduino IDE 的esp32
安装好esp32 环境,开发板选择esp32 wrover module开发板,其他默认即可。

因为国内网络问题,如果一直下不下来,就放弃吧,实在不行,用别人封装好的SDK安装包。

环境配置可参考:
1.先安装好ArduinoIDE(如果已安装,直接跳到第二步)
2.下载我们打包的esp32安装包,直接运行并解压即可。

下载地址:
跳转百度网盘下载

下载好,双击,安装就行了。
如果安装过其他版本的esp32 sdk,请先删除,再使用本安装包
需要彻底删除以前安装得ESP32,不然会冲突报错。
解压完成后,再打开Arduino IDE,即可在 菜单栏>工具>开发板 中找到你使用的esp32开发板。

二、设备接线

1.接线图

下载的时候 ESP32-cam的io0要接GND,下载结束后,必须断开io0和GND的连接。

在arduino IDE 点击烧录上传,然后需要按一下esp32-cam的reset按键,程序才会下载。下载完成后,断开io0的连线,再按一下reset按键,就退出下载模式了,即可正常使用。

如果WIFI信息正常,esp32就会自动连接wifi,并进行拍照上传,默认20秒上传一次,可自行修改频率,或者更改为触发条件拍照,需要拍照上传的:


三、代码解析

需要修改的信息有WIF名称,WIFI密码, 邮箱地址 ,秘钥信息。

bool internet_connected = false;
long current_millis;
long last_capture_millis = 0;// CAMERA_MODEL_AI_THINKER
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27
#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22SMTPData smtpData;
//void sendCallback(SendStatus info);void setup()
{Serial.begin(115200);if (init_wifi()) { // Connected to WiFiinternet_connected = true;Serial.println("Internet connected");}camera_config_t config;config.ledc_channel = LEDC_CHANNEL_0;config.ledc_timer = LEDC_TIMER_0;config.pin_d0 = Y2_GPIO_NUM;config.pin_d1 = Y3_GPIO_NUM;config.pin_d2 = Y4_GPIO_NUM;config.pin_d3 = Y5_GPIO_NUM;config.pin_d4 = Y6_GPIO_NUM;config.pin_d5 = Y7_GPIO_NUM;config.pin_d6 = Y8_GPIO_NUM;config.pin_d7 = Y9_GPIO_NUM;config.pin_xclk = XCLK_GPIO_NUM;config.pin_pclk = PCLK_GPIO_NUM;config.pin_vsync = VSYNC_GPIO_NUM;config.pin_href = HREF_GPIO_NUM;config.pin_sscb_sda = SIOD_GPIO_NUM;config.pin_sscb_scl = SIOC_GPIO_NUM;config.pin_pwdn = PWDN_GPIO_NUM;config.pin_reset = RESET_GPIO_NUM;config.xclk_freq_hz = 20000000;config.pixel_format = PIXFORMAT_JPEG;//init with high specs to pre-allocate larger buffersif (psramFound()) {config.frame_size = FRAMESIZE_UXGA;config.jpeg_quality = 10;config.fb_count = 2;} else {config.frame_size = FRAMESIZE_SVGA;config.jpeg_quality = 12;config.fb_count = 1;}// camera initesp_err_t err = esp_camera_init(&config);if (err != ESP_OK) {Serial.printf("Camera init failed with error 0x%x", err);return;}
}/********初始化WIFI*********/
bool init_wifi()
{int connAttempts = 0;Serial.println("\r\nConnecting to: " + String(ssid));WiFi.begin(ssid, password);WiFi.setAutoReconnect(true);while (WiFi.status() != WL_CONNECTED ) {delay(500);Serial.print(".");if (connAttempts > 10) return false;connAttempts++;}return true;
}static esp_err_t sendMail2m() {//初始化相机并拍照Serial.println("Taking picture...");camera_fb_t * fb = NULL;fb = esp_camera_fb_get();if (!fb) {Serial.println("Camera capture failed");return ESP_FAIL;}Serial.println("Sending email...");smtpData.setLogin("smtp.163.com", 994, "****@163.com", "****");smtpData.setSender("ESP32", "***@163.com");smtpData.setPriority("High");smtpData.setSubject("ESP32CAM Photo Mail");smtpData.setMessage("Hello pic!", true);smtpData.addRcipient("****@163.com");   smtpData.addAttachData("firebase_logo.jpg", "image/jpg", (uint8_t *)fb->buf,   fb->len); //从内存中 smtpData.setSendCallback(sendCallback);if (!MailClient.sendMail(smtpData)){Serial.println("Error sending Email, " + MailClient.smtpErrorReason());esp_restart() ;}smtpData.empty();//清空数据esp_camera_fb_return(fb);
}void loop()
{//定时发送//当前时间减去上次时间大于20S就执行拍照上传函数 delay(1000*20);sendMail2m(); //拍照上传函数,在需要的地方调用即可,这里是定时拍照}

四、效果演示

1 邮箱收件箱展示

2 邮件附件查看


图片放大

四、测试总结

  • 默认20秒上传一次,可更改(本项目是自动上传,如需条件触发上传,在需要上传的时候,调用sendMail2m()即可)
  • 目前没有实现自动配网,下个版本继续补充功能。

*玩转esp8266 ESP32 喜欢的朋友请加入我微信 ilinker32 24小时在线,技术咨询 *
如果我的创作对你有帮助 ,那么你的鼓励将是我创作的最大动力!非常感谢。

esp32-cam 实现定时拍照并发送邮件相关推荐

  1. 自行编译micropython固件刷入ESP32 cam,并测试拍照及图传

    一.环境准备 1.Ubuntu20.04LTS 2.ESP-IDF 3.micropython 操作步骤 1.安装基于Windows的linux子系统 适用于 Linux 的 Windows 子系统安 ...

  2. horizon client 无法识别域_LY-W100摄像头视频定时拍照图像识别分析抄表读表无线远传水表数_水表吧...

    [数采物联]19936624847 SC-LP-CAM 系列电池供电无线定时拍照摄像头抄表终端是上海数采物联网科技有限公司推出的针对传统老旧机械仪表(水表.电表.燃气表.压力表等)或无法直接通讯的仪表 ...

  3. esp32 cam工作电流_我如何在家工作:Cam的生产力之痛

    esp32 cam工作电流 Telecommuting is becoming more and more common these days, with many tech writers (mys ...

  4. ESP32 CAM与服务器(python)UDP视频传输

    ESP32 CAM Arduino代码 #include "esp_camera.h" #include <WiFi.h> #include "AsyncUD ...

  5. esp32拍照传输到手机android,ESP32 之 esp32-cam wifi拍照传图系统2

    ESP32 之 esp32-cam wifi拍照传图系统2 ESP32 之 esp32-cam wifi拍照传图系统2 ESP32 之 esp32-cam wifi拍照传图系统 补充说明 ESP32- ...

  6. 工厂仪表定时拍照智能AI算法识别内网部署方案

    本方案共分为4层架构.最底层现场仪表是工厂已经有的,正常使用且需要采集示数的仪表. 第二层,拍照摄像头是专用的定时抓拍摄像头,针对恶劣工业环境而设计,可以定时拍照,并将图片上传到指定的FTP服务器,在 ...

  7. 工控电脑触摸显示屏幕监控报警方案-基于WiFi摄像头定时拍照图像识别技术

    一. 设备安装 用类似这种支架固定摄像头 二. 定时拍照 4个摄像头,各自对一个被监控设备的屏幕以指定的时间间隔进行定时拍照,并上传到指定的ftp服务器. 4个摄像头分别传图片到4个目录 目录结构: ...

  8. 基于ESP32的开源定时浇花系统

    基于ESP32的开源定时浇花系统 文章目录 基于ESP32的开源定时浇花系统 前言 一.软硬件环境 二.模块连接图 1.浇花功能说明 2.Web界面展示 总结 前言 养了些许花花草草,需要按时浇灌,奈 ...

  9. Android Camera相机开发示例、Android 开发板 USB摄像头采集、定期拍照、定时拍照,安卓调用摄像头拍照、Android摄像头预览、监控,USB摄像头开发、摄像头监控代码

    我们有个需求,在机器上加个摄像头,定时拍照: 我到网上搜索,发现没有快速上手和简单使用的: 个人感觉,大部分博客写得很乱,或者长篇大论: 而我只想简单实现功能,并不打算学习多少理论: 下面代码是我写来 ...

最新文章

  1. 中文预训练ALBERT模型来了:小模型登顶GLUE,Base版模型小10倍、速度快1倍
  2. 俄罗斯网络安全治理及其启示
  3. linux 基础学,linux基础学习【1】
  4. mysql设置唯一键
  5. 在硒中按TagName定位元素
  6. switch c语言讲解,C语言switch使用之诡异用法详解
  7. day6面向对象--继承、多态
  8. 如何在云上高效地实践“自动化”和“弹性”
  9. 播放抓取的H263 RTP视频
  10. ITIL 4学习和实践导读
  11. hadoop大数据架构
  12. 怎么获取echarts需要的geoJson数据去渲染地图:以广州市白云区24镇街为例(内附资源)
  13. Windows NTP 服务器配置及开启
  14. 【第三期】电商分布式前沿springboot接口服务之删除和更新-Array-专题视频课程...
  15. 汽车can总线协议c语言,CAN总线自定义协议使用说明.pdf
  16. 且听风吟,王者峡谷英雄汇,让我们探一探英雄背后的故事
  17. 深扎实战技术 带你走进 MDCC 2016 移动开发者大会
  18. QT下获取汉字拼音首字母
  19. 高层建筑的定义及分类
  20. 计算机一直安装更新失败,win10系统一直安装更新失败的三种解决方法

热门文章

  1. 【C++多线程编程学习(1)】-CPU个数、CPU核心数、CPU线程数
  2. 星际入门总汇集合N点要素
  3. 怎样恢复删除的视频?这三种方法真的很管用!
  4. python可视化模块pandas,python数据可视化软件
  5. 关于河北省推进实施污染防治设施分表计电的解读
  6. Nginx 动态负载 upstream 三种方案
  7. 03-第一个脚本程序以及输入输出_Python编程之路
  8. html 结合3d效果,HTML和CSS3中的2D、3D结合实现动画效果
  9. 文件系统I/O缓冲-Linux
  10. 如何确认linux内核是否配置了nat,Linux Stateless无状态NAT-使用TC来配置