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

ESP32系列文章目录

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



前言

曾经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接线图

下载的时候 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     22

SMTPData smtpData;
//void sendCallback(SendStatus info);


void setup()
{
 Serial.begin(115200);

 if (init_wifi()) { // Connected to WiFi
   internet_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 buffers
 if (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 init
 esp_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小时在线,技术咨询 *
如果我的创作对你有帮助 ,那么你的鼓励将是我创作的最大动力!非常感谢。

  • 15
    点赞
  • 171
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值