当前位置:   article > 正文

ESP32-CAM 板载摄像头模块进行简单的图像采集和网络传输。

esp32-cam

ESP32-CAM 是一款集成了 Wi-Fi 和图像传感器的开发板,它可以用于实现基于 Arduino 平台的物联网应用和图像处理等项目。本文将介绍如何使用 ESP32-CAM 板载摄像头模块进行简单的图像采集和网络传输。

硬件准备

在开始编写代码之前,我们需要先准备好以下硬件设备:

  • 一块 ESP32-CAM 开发板;
  • 一根 Micro USB 数据线(用于连接电脑和 ESP32-CAM 开发板);
  • 一个 Wi-Fi 路由器(用于让 ESP32-CAM 连接到互联网)。

软件环境配置

  1. 安装 Arduino IDE

首先,我们需要下载并安装 Arduino IDE 集成开发环境。安装完成后,在“文件”->“首选项”中添加下面两个 URL 到附加开发板管理器 URLs 中:

http://arduino.esp8266.com/stable/package_esp8266com_index.json, http://dl.espressif.com/dl/package_esp32_index.json
  • 1
  1. 安装 ESP32 支持包

打开菜单:“工具” -> “开发板” -> “开发板管理器”,搜索“esp32”,选择最新版本并点击安装。

  1. 下载并解压 UCGUI 库源码包

在本地计算机上创建一个文件夹,将 UCGUI 库源码包 下载到该文件夹中,并解压。

  1. 将 UCGUI 库添加到 Arduino IDE 中

打开菜单:“草稿” -> “包含库” -> “添加 .ZIP 库”,选择刚才下载并解压的 UCGUI 源码包所在目录中的“Arduino_UCG_Library-master.zip” 文件,并点击确认。这样,就将 UCGUI 库成功添加到了 Arduino IDE 中。

编写代码

在完成硬件和软件环境配置之后,我们可以开始编写代码了。本文以 ESP32-CAM 的基本功能——拍照和发送图片为例:

#includeWiFi.h>
#include "esp_camera.h"
#include "img_converters.h"
#include "Arduino_UCG_Library.h"

// Wi-Fi 信息
const char* ssid = "your_wifi_ssid";
const char* password = "your_wifi_password";

// 图片转换器
JPEGtoRGB565 jpeg2rgb;

void setup() {
  Serial.begin(115200);
  
  // 连接 Wi-Fi
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  
  Serial.println("Connected to WiFi");
}

void loop() {
   // 初始化摄像头模块(涉及硬件操作)
   camera_config_t config;
   config.ledc_channel = LEDC_CHANNEL_0;
   config.ledc_timer = LEDC_TIMER_0;
   config.pin_d0 = 5;
   config.pin_d1 = 18;
   config.pin_d2 = 19;
   config.pin_d3 = 21;
   config.pin_d4 = 36;
   config.pin_d5 = 39;
   config.pin_d6 = 34;
   config.pin_d7 = 35;
   config.pin_xclk = PCLK_GPIO_NUM; 
   config.pixel_format = PIXFORMAT_JPEG; 
   
#ifdef BOARD_HAS_PSRAM
    Serial.println("PSRAM");
    if(psramFound()){
        Serial.println("PSRAM found");
        // ESP32-CAM with OV2640
        //config.frame_size=FRAMESIZE_UXGA;//1600X1200
        //config.jpeg_quality=10;

         // ESP-EYE v2.1 with OV3660
         //
          #define CAMERA_MODEL_AI_THINKER  
          #define PWDN_GPIO_NUM    -1  
          #define RESET_GPIO_NUM    -1 
          #define XCLK_FREQ      	20000000

         pinMode(PWDN_GPIO_NUM, OUTPUT);
         digitalWrite(PWDN_GPIO_NUM, LOW);

         pinMode(RESET_GPIO_NUM, OUTPUT);
         digitalWrite(RESET_GPIO_NUM, HIGH);

      delay(100);

      digitalWrite(PWDN_GPIO_NUM, HIGH);
      delay(100);
      digitalWrite(RESET_GPIO_NUM, LOW);
      delay(100);
      digitalWrite(RESET_GPIO_NUM, HIGH);    
         
      
        
    	config.frame_size=FRAMESIZE_QVGA;//320x240 pixels
    	config.jpeg_quality=15;

       
    } else {
        Serial.println("No PSRAM found");
      	config.frame_size=FRAMESIZE_SVGA;//800x600 pixels     
    	config.jpeg_quality=12;   
        
    }
#else
    
	Serial.println("NO PSRAM");


   
   
   // 打开摄像头
   esp_err_t err = esp_camera_init(&config);
   
   if (err != ESP_OK) {
      Serial.printf("Camera init failed with error 0x%x", err);
      return;
   }

  // 拍照并发送图片
  camera_fb_t * fb = NULL;
  
  fb = esp_camera_fb_get();
  
  if (!fb) {
    Serial.println("Camera capture failed");
    return;
  }
 
  jpeg2rgb.convert(fb->buf, fb->len, (uint16_t*)UCG.getBuffer());
    
  UCGBuffer( ucg_dev_ic_ili9341_18x240x320_hw_spi , UCG_WIDTH, UCG_HEIGHT);

// 发送图像数据到服务器(使用 HTTP 协议)
const char* serverName = "your_server_url";
WiFiClient client;

if (!client.connect(serverName,80)) {
    Serial.println("Connection to server failed");
    return;
}

String head = "--MyBoundary\r\nContent-Disposition: form-data; name=\"file\"; filename=\"esp32.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n";
String tail = "\r\n--MyBoundary--\r\n";

int contentLength = head.length() + fb->len + tail.length();

client.println(String("POST ") + "/upload" + HTTP/1.1");
client.println(String("Host: ") + serverName);
client.println(String("Content-Length: ") + contentLength);
client.print(String("Content-Type: multipart/form-data; boundary=MyBoundary"));
client.print("\r\n\r\n");

// 发送表单头部分
Serial.print(head);
Serial.write(fb->buf, fb->len);

// 发送表单尾部分
Serial.print(tail);

delay(1000);

// 释放摄像头缓存
esp_camera_fb_return(fb);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144

上面代码中,我们首先使用 Wi-Fi 连接到指定的路由器。然后通过 esp_camera_init() 函数初始化摄像头模块,并打开摄像头开始拍照。接着,将 JPEG 格式的图像数据转换为 RGB565 格式,并发送到液晶屏幕上显示。

最后,我们将图片数据通过 HTTP 协议发送给服务器。在这个例子中,假设服务器的

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/216287
推荐阅读
相关标签
  

闽ICP备14008679号