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 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()即可)
- 目前没有实现自动配网,下个版本继续补充功能。