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

2023-05-16

文章目录

    • 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);       //初始化 LED
  pinMode(KEY_1, INPUT);        //按键1初始化
  pinMode(KEY_2, INPUT);        //按键2初始化
  
  WiFi.begin(ssid, password);   //连接wifi
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  
  if (!SPIFFS.begin(true)) {   //初始化SPIFFS
    Serial.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 module
  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;
  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'){//开关LED
      LED_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; // pointer
  bool 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 length
      Serial.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; // 无按键按下
}

完整代码下载地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP32 之 esp32-cam wifi拍照传图系统1 的相关文章

  • 如何学习Linux无线驱动(mac80211)的结构?

    Linux无线驱动mac80211中有这么多的结构 像struct net device struct ieee80211 hw struct ieee80211 vif and struct ieee80211 local等等 如此多的结
  • 我如何连接到名为“A”的受密码保护的 wifi

    如何连接到受密码保护的特定 WiFi 场景 有四个 wifi 网络 但我的应用程序需要连接到特定的网络 同时提供密码 你不能这样做 因为没有公共 API 可以做到这一点
  • iOS 检查 WiFi 辅助是否已启用

    我正在尝试检查 WiFi 辅助是否已启用 当我连接到接入点获取一些数据时遇到问题 当我的连接状况不佳时 我的蜂窝数据会被使用并干扰我的接入点 有什么方法可以检查该选项是否启用 好吧 我想我能帮上一点忙 你需要check SCNetworkR
  • 如何使用 Objective-C 判断 iPhone 是否连接到 wifi 网络?

    在 Objective C iPhone 应用程序的上下文中 我需要能够判断 iPhone 是否已连接到 wifi 网络 并在可能的情况下侦听此状态的变化 有谁知道如何做到这一点 谢谢 加布伊 正如其他人提到的 可达性样本 https de
  • 我可以在 Android 中找到我的接入点的 MAC 地址吗?

    我的 Android 应用程序可以找到它所连接的 Wifi 接入点的 MAC 地址吗 android net wifi WifiInfo getMacAddress 的文档未提供任何详细信息 See http developer andro
  • 测量 wifi 到 Iphone/Ipad 的信号强度

    我想从 iOS 设备获取当前的 Wifi 信号强度 Google 搜索仅显示适用于 Android 设备的解决方案 从文献中我了解到 Apple 不允许访问硬件 因此没有人可以通过他们的应用程序以 dbm 形式检索设备的信号强度 它是否正确
  • 在未越狱的 iOS 设备上启用/禁用 Wifi

    我的内部应用程序需要这个 我想在 ios 设备上切换 wifi 任何框架都可用 我尝试了以下代码 但它没有为我提供任何帮助 这不会改变我的 wifi 设置 Class BluetoothManager objc getClass Bluet
  • 我可以使用 WiFi 在两部未连接路由器的 Android 手机之间传输数据/消息吗?

    我知道如果两个Android手机连接到同一个wifi网络 它们可以实现套接字编程来在它们之间传输数据 但我其实想知道是否可以使用wifi作为两部Android手机之间的传输介质 就像蓝牙一样 使用 Android 2 2 可以在一台设备上创
  • 是否可以强制通过 Wifi 或 TMobile 网络进行网络流量?

    我想知道使用 G1 是否可以强制网络流量通过 Wifi 或通过 Cell GSM 网络 我需要强制应用程序通过塔式网络连接以获取一些登录信息 这可能吗 有人对这如何可能有任何想法吗 我正在尝试使用 Android SDK 在应用程序内完成此
  • Android 智能手机与其他设备之间的直接 Wifi 通信

    我想在 Android 设备和另一个设备 不是另一个 Android 智能手机 而是使用 C 实现的带 wifi 的设备 之间建立通信 通过 WIFI 我已经发现android提供了直接无线网络 http developer android
  • iOS6 在非越狱设备上切换 WiFi

    我正在开发一个内部 iOS 应用程序 不适用于苹果商店 所以我很乐意使用私有 API 并且我希望能够以编程方式打开或关闭 wifi 我想要这样做的原因是 对于某些 WiFi 路由器 每当互联网连接中断时 iPad 就无法恢复 WiFi 不过
  • 启用/禁用 Microsoft 虚拟 WiFi 微型端口

    我禁用了我的Microsoft Virtual WiFi Miniport网络适 配器来自Control Panel Network and Internet Network Connections 只需右键单击微型端口网卡并单击 禁用 它
  • 多久轮询一次 wifi 信号强度?

    理想情况下 我希望近乎实时地监控无线网络的信号强度 比如每 100 毫秒一次 但如此高的频率可能有点过大了 我正在使用托管无线网络 http managedwifi codeplex com 库轮询 RSSI 我实例化一个WlanClien
  • 如何在 iOS 中通过 3G 连接创建无线热点

    如果我愿意 我将如何创建一个像这样的应用程序MyWi http intelliborn com mywi html 即 WiFi 网络共享应用程序 实现该功能需要哪些步骤 我需要使用哪些框架 库 我们的目标不是尝试将此应用程序放入应用程序商
  • Android wifi的信号强度[重复]

    这个问题在这里已经有答案了 可能的重复 Android 如何监控WiFi信号强度 https stackoverflow com questions 1206891 android how to monitor wifi signal st
  • 仅扫描 2.4Ghz 频段的 wifi 信号

    我需要扫描可用的 Wi Fi 信号及其强度 我在用着wifiManager startScan 和异步wifiManager getScanResult 在不支持 5GHz 频段的设备上 大约需要 500 毫秒才能获得结果 在支持 5GHz
  • 如何在 iOS 应用程序中检测所有可用的 Wifi 网络并连接到其中之一

    在我的 iOS 应用程序中 我想检测所有可用的 wifi 网络 然后从列表中选择一个网络并连接到它 目标是不打开应用程序内置的设置来连接 Wi Fi 而是在我的应用程序中完成这一切 首先 这可能吗 如果可能的话 请指出要使用哪些框架和方法
  • 检测wlan是否关闭

    任何人都可以给我一个提示 如何在 Windows Phone 上以编程方式检测 C 8 1 应用程序 不是 8 0 是否启用 禁用 WLAN 我不想更改这些设置 只是需要知道 该解决方案是一个 Windows 8 1 通用应用程序 Wind
  • 发送 802.11 帧的“帧控制字段”数据的顺序?

    以下是 QoS 数据 FC 字段的位格式 00 01 0001 01000010 前2位代表版本 接下来2位代表类型 接下来4位代表子类型 其中ToDS 0 FromDS 1 保护位 1 那么 上述数据在空中是按照什么顺序通过接口发送的呢
  • 更改 Wi-Fi 配置文件的密码

    在我志愿服务的长期护理医院中 每个月的第一天 访客 Wi Fi 连接的密码都会更改 这给工作人员带来了大量的工作 也给患者带来了很多挫败感 其中许多人的行动能力非常有限 是的 真正的解决方案是让 IT 团队保留相同的密码 但这不会发生 大多

随机推荐

  • 【STM32-HAL库】一步步搭建出FOC矢量控制(附C代码)

    说明 本文为无刷电机或PMSM电机驱动的简易代码 xff0c 旨在分享一些个人调试过程的小心得 xff0c 提供一个demo文件 xff0c 程序仍有许多不完善的地方 xff0c 建立起个人的FOC底层驱动 xff0c 可以帮助快速熟悉FO
  • Ubuntu整个系统迁移到其他盘办法

    Ubuntu整个系统迁移到其他盘办法 一 xff1a 制作U盘启动器 xff0c 刻录Ubuntu系统 从U盘引导进入系统 xff0c 点击 xff1a try Ubuntu without install选项 二 xff1a 把需要迁移的
  • 四旋翼无人机飞控系统设计(基础知识篇)

    飞行原理 四旋翼的结构组装有十字模式和X模式之分 xff0c 两者的基本原理一致 xff0c 方向结构不同 xff0c 都是通过四个电机的组合状态进行控制姿态飞行 xff0c 而十字型四旋翼机头是对准其中一个电机的 xff0c X型的四旋翼
  • 大数据组件-Maxwell常用命令(持续更新完善)

    Download Download binary distro https github com zendesk maxwell releases download v1 33 0 maxwell 1 33 0 tar gz Sources
  • 【px4编译】make px4fmu-v3_default upload 不能使用

    今天遇到编译pixhawk2代固件无法upload的问题 xff0c 出现TypeError a bytes like object is required not str xff0c 在1代中是可以make upload的 ninja E
  • 【PX4代码】关于px4代码中timestamp与gps_itow的时间问题

    gps的输出频率为5hz xff0c 由此可见timestamp应该是113248090 1e 6转换为s xff0c 由次可见gps的itow时间应该为271998999 1e 3转换为s 总结 px4中的时间为cpu应该除以10 6 x
  • 【PX4代码】关于ekf2输出频率只有1ohz的问题

    问题 我在使用的是pixhawk 2代 imu的输出频率都在100hz以上 xff0c 使用的gps模块输出频率为5hz xff0c 使用log的local position csv 查看ekf2估计输出的点位信息只有10hz xff0c
  • Keil4中C51的debug调试步骤技巧

    1 选择相应的调试仿真连接器 xff1a 选择 xff1a project gt Options for Target 如下图所示 xff1a 然后在弹出对话框的Debug选项下选择仿真器的型号 xff1a 2 进入调试 xff1a 3 部
  • 怎么操作linux服务器

    Linux 服务器就是采用 Linux 系统的网络服务器 xff0c 同时也有采用 windows 的服务器 xff0c 作用是类似的 而 Linux 并不是一个特定的系统 xff0c 而是使用 Linux 内核的系统 xff0c 现在发行
  • 人工智能如何可以思考?

    近日在给同事讲人工智能的时候 xff0c 提到当数据量不够的时候 xff0c 必要时需要加入人工工程 xff0c 引导计算机 归纳 一些知识 xff0c 毕竟计算机智能比起人类智能 xff0c 最大的缺陷可能在于不懂得 举一反三 换句话说
  • bag文件内topic对应的frame_id查看指令

    启动ROS roscore 运行数据集 span class token comment 数据集小的话 xff0c 建议慢速播放 span rosbag play xxx span class token punctuation span
  • GPS数据类型(ROS)

    文章目录 一 传感器分类二 作用三 系统组成四 位置表示五 数据格式六 ROS中GPS数据格式sensor msgs NavSatFixROS中GPS数据主要包含这四类 xff0c 分别是gps 裸数据ros封装 xff0c 位置 xff0
  • cmake使用教程

    CMakeLists txt文档编写以及packsge xml文档介绍 CMakeLists txt文档一 cmake minimum required命令二 CMake中的编译类型三 cmake编译选项 xff08 与2对应 xff09
  • 四旋翼无人机飞控系统设计(闭环控制系统)

    对于一个简单的飞控程序来说 xff0c 控制器是它最核心的部分 xff0c 这里主要与大家讨论控制系统的基本理论知识 xff08 自控大佬请绕道 xff09 xff0c 包括控制系统概念 闭环控制系统的原理 下篇将侧重包含pid控制算法的具
  • 针对frame_id和child_frame_id的理解

    ros基础必看之各个frame的理解 ROS坐标系统 xff0c 常见的坐标系和其含义 ROS中TF 坐标系转换 原理与使用
  • IMU预积分学习

    IMU预积分学习 一 IMU状态传递方程 一 IMU状态传递方程 几种不同的表达形式 xff1a 1 lio mapping xff1a 参考大佬 xff1a lio mapping 及 VINS Mono代码及理论推导 xff08 2 x
  • Python3 内置模块 - os

    方法名说明os access判断文件权限os chdir改变当前工作目录os chmod file 修改文件权限os execvp 启动一个新进程os execvp 执行外部程序脚本 xff08 Uinx xff09 os fork 获取父
  • AttributeError: module 'tornado.web' has no attribute 'asynchronous'解决方法

    AttributeError module tornado web has no attribute 39 asynchronous 解决方法 今天看tornado异步时发现的错误 xff0c 查了一下 xff0c 原来tornado6以后
  • 【STM32项目】- 人体检测(体温、心率、心跳、跌倒检测)

    STM32人体检测 xff08 体温 心率 心跳 跌倒检测 xff09 43 zigbee 笔者前言 在闲鱼有缘结识的一个哥们 xff0c 帮助做的基于STM32人体检测系统 xff0c 我负责硬件程序开发设计 xff0c 哥们负责客户端服
  • ESP32 之 esp32-cam wifi拍照传图系统1

    文章目录 ESP32 之 esp32 cam wifi拍照传图系统1 效果演示2 材料准备3 原理图接线4 下载代码 ESP32 之 esp32 cam wifi拍照传图系统 1 效果演示 2 材料准备 ESP32 camUSB转TTL按钮