ESP32-CAM开发板学习(一)
一、Arduino IDE搭建ESP32开发环境
1、安装 Arduino IDE 软件,在官网下载压缩包解压直接使用
- 官网链接: Arduino IDE
2、修改软件语言,单击左上角 File → Preferences…,把Language改成中文(简体),保存
3、安装esp32开发板库,点击菜单栏“文件”→“首选项”,点击“其他开发板管理器地址”右边的图标,把地址填写进去
https://dl.espressif.com/dl/package_esp32_index.json
https://git.oschina.net/dfrobot/FireBeetle-ESP32/raw/master/package_esp32_index.json
4、在线安装esp32库,下载非常慢,如失败请重新尝试
5、开发板连接电脑,Arduino IDE按如下连接开发板
二、常用方法笔记
三、代码示例
1、WiFi连接示例
#include <WiFi.h>// 替换为自己的网络名称和密码
const char* ssid = "WiFi名称";
const char* password = "WiFi密码";void setup() {// 启动串口通信Serial.begin(115200); // 设置串口波特率为115200// 连接到WiFi网络Serial.print("连接 " + String(ssid));WiFi.begin(ssid, password);// 等待WiFi连接while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.print(".");}// 打印设备的IP地址Serial.println();Serial.print("WiFi已连接, IP地址: ");Serial.println(WiFi.localIP());// Serial.println("WiFi已连接, IP地址: " + WiFi.localIP().toString());
}void loop() {// 每隔5秒打印一次IP地址Serial.println(WiFi.localIP());delay(5000);
}
2、控制LED示例
int ledPin = 4;void setup() {// 启动串口通信Serial.begin(115200);// 初始化引脚为输出模式pinMode(ledPin, OUTPUT);// 读取引脚的电平: 1 (HIGH)或 0(LOW)int ledState = digitalRead(ledPin);Serial.println(ledState);
}void loop() {if (Serial.available() > 0) {char receivedChar = Serial.read();Serial.print("收到字符: "); // 调试输出Serial.println(receivedChar); // 打印接收到的字符if (receivedChar == '1') {digitalWrite(ledPin, HIGH);} else if (receivedChar == '0') {digitalWrite(ledPin, LOW);}}
}
3、获取摄像头画面示例
#include "esp_camera.h"
#include <WiFi.h>// 设置 Wi-Fi 参数
const char* ssid = "WiFi名称"; // 你的Wi-Fi名称
const char* password = "WiFi密码"; // 你的Wi-Fi密码// 摄像头引脚配置
camera_config_t config = {.pin_pwdn = 32, // 摄像头电源控制引脚.pin_reset = -1, // 复位引脚(未使用).pin_xclk = 0, // 外部时钟引脚.pin_sscb_sda = 26, // 摄像头SCCB SDA引脚(串行控制总线数据引脚).pin_sscb_scl = 27, // 摄像头SCCB SCL引脚(串行控制总线时钟引脚).pin_d7 = 35, // 数据引脚D7.pin_d6 = 34, // 数据引脚D6.pin_d5 = 39, // 数据引脚D5.pin_d4 = 36, // 数据引脚D4.pin_d3 = 21, // 数据引脚D3.pin_d2 = 19, // 数据引脚D2.pin_d1 = 18, // 数据引脚D1.pin_d0 = 5, // 数据引脚D0.pin_vsync = 25, // 垂直同步信号引脚.pin_href = 23, // 水平同步信号引脚.pin_pclk = 22, // 像素时钟引脚.xclk_freq_hz = 20000000, // 外部时钟频率(20MHz).ledc_timer = LEDC_TIMER_0, // LEDC定时器.ledc_channel = LEDC_CHANNEL_0, // LEDC通道.pixel_format = PIXFORMAT_JPEG, // 输出像素格式为JPEG// QVGA(320x240)VGA(640x480)HD(1280x720)SXGA(1280x1024)UXGA(1600x1200).frame_size = FRAMESIZE_SXGA, // 视频帧大小// 数字越小质量越高,最小2.jpeg_quality = 10, // JPEG质量.fb_count = 2 // 使用2个帧缓冲区
};// 启动 Web 服务器
WiFiServer server(80); // 监听端口80// 启动摄像头视频流服务
void startCameraServer() {server.begin(); // 启动服务器Serial.println();Serial.println("Camera Ready! Use 'http://" + WiFi.localIP().toString() + "/stream' to view the stream.");
}// 处理视频流请求
void handleJPGStream(void) {WiFiClient client = server.available(); // 检查是否有客户端连接if (client) { // 如果有客户端连接Serial.println("New client"); // 打印客户端连接信息String response = "HTTP/1.1 200 OK\r\n"; // HTTP响应头response += "Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n"; // 设置视频流内容类型client.print(response); // 发送响应头// 持续发送帧数据while (1) {camera_fb_t *fb = NULL;fb = esp_camera_fb_get(); // 获取一帧图像if (!fb) {Serial.println("Camera capture failed"); // 捕获失败continue;}client.write("--frame\r\n"); // 分隔符client.write("Content-Type: image/jpeg\r\n\r\n"); // 图像内容类型client.write(fb->buf, fb->len); // 发送图像数据client.write("\r\n"); // 发送分隔符esp_camera_fb_return(fb); // 释放帧缓冲区delay(30); // 等待30毫秒}}
}void setup() {Serial.begin(115200); // 初始化串口通信,波特率为115200// 连接到Wi-Fi网络WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) { // 如果未连接成功,持续等待delay(500);Serial.print(".");}Serial.println();Serial.println("Wi-Fi连接成功, IP地址: " + WiFi.localIP().toString());// 初始化摄像头esp_err_t err = esp_camera_init(&config); // 配置摄像头if (err != ESP_OK) { // 如果初始化失败Serial.printf("摄像头初始化失败,出现错误 0x%x", err); // 输出错误信息} else {Serial.println("摄像头初始化成功!"); // 初始化成功}startCameraServer(); // 启动Web服务器
}void loop() {handleJPGStream(); // 启动视频流处理
}
4、获取AHT10温湿度数据示例
如下安装传感器库
// i2c引脚: SDA(数据线)= GPIO14 & SCL(时钟线)= GPIO15// 扫描I2C地址,用来判断是否能找到I2C传感器(AHT10默认I2C地址是 0x38)
#include <Wire.h>void setup() {Serial.begin(115200);Wire.begin(14, 15); // 设置 SDA 和 SCL 对应的 GPIOSerial.println("开始扫描 I2C 地址...");for (uint8_t address = 1; address < 127; address++) {Wire.beginTransmission(address);if (Wire.endTransmission() == 0) {Serial.print("找到 I2C 设备,地址: 0x");Serial.println(address, HEX);}}
}void loop() {// 不需要在 loop 中做其他事
}
#include <Wire.h> // 引入Wire库,用于I2C通信
#include <Adafruit_AHTX0.h> // 引入Adafruit_AHTX0库,用于控制AHT10传感器Adafruit_AHTX0 aht; // 创建AHT10传感器对象void setup() {Serial.begin(115200); // 初始化串口通信,波特率115200Wire.begin(14, 15); // 初始化I2C总线,设置SDA为14,SCL为15if (!aht.begin()) { // 初始化AHT10传感器,如果初始化失败Serial.println("无法初始化 AHT10 传感器!"); // 输出错误信息while (1); // 停止程序,进入死循环}Serial.println("AHT10 初始化成功!"); // 如果传感器初始化成功,打印成功信息
}void loop() {// 获取传感器的数据,存储在humidity和temp中sensors_event_t humidity, temp; aht.getEvent(&humidity, &temp); // 从AHT10传感器获取温度和湿度数据// 打印温度值Serial.print("温度: "); Serial.print(temp.temperature); // 打印温度数据Serial.println(" ℃"); // 输出单位℃// 打印湿度值Serial.print("湿度: "); Serial.print(humidity.relative_humidity); // 打印湿度数据Serial.println(" %"); // 输出单位%delay(2000); // 每两秒更新一次数据
}