文章目录

  • ESP32 之 esp32-cam wifi拍照传图系统
    • 1.效果演示
    • 2.材料准备
    • 3.原理图接线
    • 4.下载代码

ESP32 之 esp32-cam wifi拍照传图系统

1.效果演示

2.材料准备

  1. ESP32-cam
  2. USB转TTL
  3. 按钮x2 开关x2

3.原理图接线

GND - GND
TX - RX
RX - TX
VCC - 5V
GPIO_0 - GND 下载模式
GPIO_0 不接线 运行模式

4.下载代码

  1. 需要提前搭建Arduino环境,在这就不多说,在这里要注意安装好程序相关的库

    代码下载,主函数代码如下
#include "camera_pins.h"// 你的wifi账号密码
const char* ssid     = "DY";
const char* password = "1403119048";// 在端口80上创建AsyncWebServer对象
AsyncWebServer server(80);boolean takeNewPhoto = false;
bool LED_flag = false;void setup() {Serial.begin(115200);         //串口初始化pinMode(LED_1, OUTPUT);       //初始化 LEDpinMode(KEY_1, INPUT);        //按键1初始化pinMode(KEY_2, INPUT);        //按键2初始化WiFi.begin(ssid, password);   //连接wifiwhile (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.println("Connecting to WiFi...");}if (!SPIFFS.begin(true)) {   //初始化SPIFFSSerial.println("An Error has occurred while mounting SPIFFS");ESP.restart();}else {delay(500);Serial.println("SPIFFS mounted successfully");}//Turn-off the 'brownout detector'WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);// Camera initOV2640 camera modulecamera_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;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;}esp_err_t err = esp_camera_init(&config);if (err != ESP_OK) {Serial.printf("Camera init failed with error 0x%x", err);ESP.restart();}// 路由主页   server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {request->send_P(200, "text/html", index_html);});//路由抓拍server.on("/capture", HTTP_GET, [](AsyncWebServerRequest * request) {takeNewPhoto = true;request->send_P(200, "text/plain", "Taking Photo");});//server.on("/saved-photo", HTTP_GET, [](AsyncWebServerRequest * request) {request->send(SPIFFS, FILE_PHOTO, "image/jpg", false);});//路由控制LED开关server.on("/LED", HTTP_GET, [](AsyncWebServerRequest * request) {LED_flag =!LED_flag;digitalWrite(LED_1, LED_flag);});// 启动服务器server.begin();Serial.print("IP Address: http://");  //打印IP地址用于服务器连接Serial.println(WiFi.localIP());
}void loop() {//判断是否抓拍if (takeNewPhoto) {capturePhotoSaveSpiffs();takeNewPhoto = false;}//串口接收指令while(Serial.available()){char c=Serial.read();if(c=='1'){//开关LEDLED_flag =!LED_flag;digitalWrite(LED_1, LED_flag);Serial.write("1\n");//返回到调试程序上}else if(c=='2') {//拍照takeNewPhoto = true;Serial.write("2\n");//返回到调试程序上}}//=====按键扫描=====int key_val = KEY_Scan();if(key_val == 1){       //按键1按下digitalWrite(LED_1, HIGH);takeNewPhoto = true;delay(500);digitalWrite(LED_1, LOW);                                             }if(key_val == 2){       //按键2按下LED_flag =!LED_flag;digitalWrite(LED_1, LED_flag);                                           }delay(1);
}// 检查照片捕获是否成功
bool checkPhoto( fs::FS &fs ) {File f_pic = fs.open( FILE_PHOTO );unsigned int pic_sz = f_pic.size();return ( pic_sz > 100 );
}// 捕捉照片并保存到SPIFFS
void capturePhotoSaveSpiffs( void ) {camera_fb_t * fb = NULL; // pointerbool ok = 0; // 布尔值指示图片是否被正确拍摄do {// 用照相机拍照Serial.println("Taking a photo...");fb = esp_camera_fb_get();if (!fb) {Serial.println("Camera capture failed");return;}//照片文件名称Serial.printf("Picture file name: %s\n", FILE_PHOTO);File file = SPIFFS.open(FILE_PHOTO, FILE_WRITE);// 插入照片文件中的数据if (!file) {Serial.println("Failed to open file in writing mode");}else {file.write(fb->buf, fb->len); // payload (image), payload lengthSerial.print("The picture has been saved in ");Serial.print(FILE_PHOTO);Serial.print(" - Size: ");Serial.print(file.size());Serial.println(" bytes");}// 关闭文件file.close();esp_camera_fb_return(fb);// 检查文件是否正确地保存在SPIFFS中ok = checkPhoto(SPIFFS);} while ( !ok );//将文件保存到SD卡当中
}
//按键扫描
int KEY_Scan(void)
{   static int key_up = 1;//按键按松开标志   if(key_up && (digitalRead(KEY_1) == 0 || digitalRead(KEY_2) == 0 )){delay(10);//去抖动 key_up=0;if(digitalRead(KEY_1) == 0)return 1;if(digitalRead(KEY_2) == 0)return 2;}else if( digitalRead(KEY_1) == 1 || digitalRead(KEY_2) == 1)key_up=1;       return 0; // 无按键按下
}

完整代码下载地址

ESP32 之 esp32-cam wifi拍照传图系统1相关推荐

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

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

  2. ESP32 之 esp32-cam wifi拍照传图系统2

    ESP32 之 esp32-cam wifi拍照传图系统 补充说明 ESP32-CAM总结 一. ESP32初识 ESP32-CAM模组的核心芯片:ESP32-S 模块是一款超小体积的多功能通用型 8 ...

  3. 用20块的摄像头(不带fifo的OV7670)做WiFi实时传图小车

    博客地址 用20块的摄像头(不带fifo的OV7670)做WiFi实时传图小车 – Infinite's Blog 零.导读 在这篇文章中,你将看到如下内容: OV7670 QVGA配置的注意事项: ...

  4. 用Mixly ESP8266 ESP32本地局域网/在线OTA无线wifi上传方法

    Arduino ESP32 ESP8266 远程无线上传 下载 Mixly 齐护机器人 局域网OTA ESP8266 ESP32本地局域网及在线OTA无线wifi上传方法 方法1:在线升级方法 1-1 ...

  5. SimpleFOC之ESP32(九)—— WIFI、UDP和TCP

    目录 说明 一.网络通信 1.1.准备工作 1.2.UDP通信 1.3.TCP通信 二.硬件准备 三.代码参考 四.代码演示 4.1.WIFI_AP模式UDP通信 4.2.WIFI_STA模式TCP ...

  6. 大家常见的以ESP32为代表的WIFI、蓝牙双模模块,今天启明云端带来了一款低功耗、距离远的LoRa+蓝牙无线通讯模块WT5105-L1,我们一起看看这款模块在功能上有哪些优势?

    首先我们进行一组LoRa.WIFI.蓝牙无线组网对比 LoRa LoRa(长距离)的典型工作频率在美国是915MHz,在欧洲是868MHz,在亚洲是433MHz.允许多个无线电设备使用相同的频段,其典 ...

  7. esp32与android蓝牙,ESP32通过蓝牙配置WIFI

    ESP32通过蓝牙配置WIFI [复制链接] 以下内容通过软件自动翻译,源文为:https://robotzero.one/esp32-wi-fi-connection-bluetooth/ 使用蓝牙 ...

  8. ESP32学习入门:WiFi连接网络

    目录 一.ESP32简单介绍 二.ESP32 Wi-Fi模块介绍 三.ESP32 Wi-Fi 编程模型 四.ESP32 Wi-Fi 事件处理流程 五.ESP32 Wi-Fi开发环境 六.ESP32 W ...

  9. 基于ESP32 CAM的人脸识别考勤系统

    概述:使用 ESP32 CAM 的人脸识别考勤系统 本教程介绍了使用ESP32 CAM 模组的人脸识别考勤系统.我们将为此应用程序使用OpenCV和Visual Studio .OpenCV 是一个开 ...

最新文章

  1. 用python解“逆序三位数”问题
  2. 最权威北美放射学会年会回顾:AI的进化与下一个前沿
  3. 如何在github存储库中添加屏幕截图到README?
  4. php根据指定字段去重,php二维数组根据某个字段去重
  5. python和office_Python在office开发中的应用
  6. 05-树7 堆中的路径 (25 分)
  7. element走马灯自动_详细element-ui的走马灯carousel轻松实现自适应全屏banner详细过程...
  8. 提升效率的几个小绝招
  9. MTK:GPIO的配置与接口说明
  10. SD/TF卡驱动(一)--------SD卡相关简介
  11. IE浏览器为什么打不开java_IE浏览器拒绝访问的原因及其解决方法。
  12. 软件项目估算概念、步骤、方法、戒律总览
  13. 国家计算机考试培训心得,最新计算机培训心得总结5篇
  14. python 飞机大战爆炸效果_Pygame飞机大战为什么飞机与敌机碰撞后不再有图片动态切换效果...
  15. 王垠:完全用Linux工作
  16. C语言课设-单位车辆调度管理
  17. 巴比特 | 元宇宙每日必读:大厂的高薪、期权都不香了,互联网精英纷纷涌向的Web3,魅力到底有多大?...
  18. 广州市天河区2021-2022学年八年级第一学期期末考试英语试题
  19. springboot+vue框架搭建教程
  20. 消防法及相关法律法规(一)

热门文章

  1. Linux统计文件个数
  2. 【C语言】判断一个数是不是回文数
  3. 传智播客java就业班入学测试题(自测+答案)
  4. windows7安dns服务器_win7怎样安装dns服务器
  5. 银行春招无领导面试规则
  6. 计算机三级数据库数据仓库与数据挖掘(一)、快照方式、元数据、数据仓库中数据特征、机器学习、聚类方法、分类算法、决策支持系统、表数据的粒度级、分布式数据库、
  7. Excel VBA 找出选定范围不重复值和重复值
  8. Englis Pratice
  9. 小程序 js 判断 字符串 为空 null
  10. 加密与压缩,霍夫曼编码解码