Èkọ́ ESP32 42/55 - Gbíyàwòrán pẹ̀lú Kámẹ́rà tí a fi pamọ́ sí Micro SD CAM-1 | Àkójọpọ̀ SunFounder's ESP32
Nínú ẹ̀kọ́ yìí, a óò máa lo ẹ̀rọ ESP32 microcontroller pẹ̀lú àwọn ohun èlò ìmúgbòrò rẹ̀ láti ọ̀dọ̀ SunFounder láti ya fọ́tò pẹ̀lú kámẹ́rà àti láti fi wọ́n pamọ́ tààrà lórí káàdì micro SD. Iṣẹ́ yìí máa ń lo àwọn agbára tí ESP32 ní nínú, bíi Wi-Fi àti Bluetooth, láti ṣe ẹ̀rọ tí ó lè ya fọ́tò tí ó kéré. Ní ìparí ẹ̀kọ́ yìí, o óò ní ètò tí ó ń ṣiṣẹ́ tí ó lè ya àti fi àwọn àwòrán pamọ́, tí o lè wọlé sí wọn lórí kọ̀ǹpútà nígbà mìíràn.
Fún àwọn tí ó ṣẹ̀ṣẹ̀ ń bẹ̀rẹ̀ nínú ètò ESP32, ohun èlò yìí pèsè pẹ̀pẹ̀ kan tí ó wúlò fún oríṣiríṣi iṣẹ́, pẹ̀lú èyí. Kámẹ́rà tí a ń lò nínú iṣẹ́ yìí ni OV2640, tí ó ní ìwọ̀n 1600x1200 pixels. Bí ó tilẹ̀ jẹ́ pé kò lè bá àwọn fóónù onípò ọ̀wọ́n lọ́wọ́, ó tó fún àwọn iṣẹ́ ìyáwòrán tí ó rọrùn. Láti ṣàlàyé àwọn ìgbésẹ̀, rí i pé o wo fídíò tí ó bá ẹ̀kọ́ yìí lọ (nínú fídíò ní 00:00).
Àlàyé Ohun Èlò
Àwọn ohun pàtàkì nínú iṣẹ́ yìí ni ESP32 microcontroller, kámẹ́rà module (OV2640), àti káàdì micro SD fún ìpamọ́. ESP32 jẹ́ microcontroller alágbára tí ó ní Wi-Fi àti Bluetooth nínú, tí ó mú un dára fún àwọn ohun èlò IoT. Kámẹ́rà module máa ń ya àwọn àwòrán, tí ESP32 yóò sì ṣiṣẹ́ lórí wọn.
Káàdì micro SD ṣiṣẹ́ gẹ́gẹ́ bí ibi ìpamọ́ fún àwọn àwòrán tí a yá. Nínú ètò yìí, ESP32 ń bá kámẹ́rà module sọ̀rọ̀ nípa lílo àwọn GPIO pins pàtó, àti pé a máa ń fi àwọn àwòrán pamọ́ ní ọ̀nà JPEG lórí káàdì SD. Èyí jẹ́ kí ó rọrùn láti wá àti wo àwọn fọ́tò nígbà mìíràn.
- Rí i pé kámẹ́rà náà wà ní ọ̀nà tí ó tọ́ nígbà tí o bá ń fi sí inú bọ́ọ̀dù ESP32.
- Lo káàdì micro SD tí ó ní agbára 32 GB tàbí kéré sí i láti yẹra fún àwọn ìṣòro ìbáṣepọ̀.
- So GPIO 0 pọ̀ mọ́ GND fún ipo ìṣètò.
- Fiyesi sí ìpèsè agbára láti yẹra fún àwọn ìṣòro brownout.
- Mú kámẹ́rà dúró ṣinṣin nígbà tí o bá ń ya fọ́tò láti yẹra fún àwọn àwòrán tí kò ṣe pẹ̀tẹ́lẹ̀.
Àwọn Ìtọ́nisọ́nà Ìsopọ̀
Láti so kámẹ́rà module ESP32 pọ̀, kọ́kọ́ rí i pé ESP32 ti pa. So káàdì micro SD module pọ̀ mọ́ ESP32 nípa lílo àwọn pins wọ̀nyí: so CS pin ti káàdì SD pọ̀ mọ́ GPIO 5 ti ESP32, MOSI pọ̀ mọ́ GPIO 23, MISO pọ̀ mọ́ GPIO 19, àti SCK pọ̀ mọ́ GPIO 18. Nígbà tí ó bá tẹ̀ síwájú, so àwọn pins kámẹ́rà module pọ̀ báyìí: PWDN pọ̀ mọ́ GPIO 32, XCLK pọ̀ mọ́ GPIO 0, SIOD pọ̀ mọ́ GPIO 26, àti SIOC pọ̀ mọ́ GPIO 27. Àwọn pins data pixel Y2 sí Y9 yẹ kí ó so pọ̀ mọ́ GPIO 5 sí GPIO 39 gẹ́gẹ́ bí a ti ṣàlàyé rẹ̀ nínú kóòdù rẹ.
Rí i pé o so àwọn pins ilẹ̀ àti agbára pọ̀ ní ọ̀nà tí ó tọ́. A lè fi bátà tí ó wà nínú ohun èlò náà pèsè agbára fún ESP32. Lẹ́yìn ìsopọ̀, rí i pé àwọn ìsopọ̀ náà dúró ṣinṣin kí o tó tan ẹ̀rọ náà. Bí o bá tẹ̀lé àwọn ìtọ́nisọ́nà pẹ̀lẹ́pẹ̀lẹ́, o yẹ kí o rí i pé kámẹ́rà bẹ̀rẹ̀ ní ọ̀nà tí ó tọ́ nígbà tí o bá gbé kóòdù náà sí inú ẹ̀rọ.
Àwọn Àpẹẹrẹ Kóòdù & Ìtọ́sọ́nà
Nínú kóòdù náà, a bẹ̀rẹ̀ nípa fífi àwọn ilé-ìkàwé tí a nílò sí inú àti ṣàlàyé àwọn ìṣètò pins kámẹ́rà. A ṣe ìpìlẹ̀ pictureNumber láti tọ́jú iye àwọn fọ́tò tí a ti yá.
int pictureNumber = 0;
void setup() {
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); // Pa brownout detector
Serial.begin(115200);
camera_config_t config;
// Àwọn ìṣètò fún kámẹ́rà
config.ledc_channel = LEDC_CHANNEL_0;
// Àwọn ìṣètò kámẹ́rà mìíràn...
}
Ìṣiṣẹ́ setup ń bẹ̀rẹ̀ ìbánisọ̀rọ̀ serial àti ṣètò àwọn ìṣètò kámẹ́rà. Ìṣètò náà ní àwọn ohun bíi ledc_channel, pin_d0, àti xclk_freq_hz fún iṣẹ́ tí ó dára jùlọ.
Nígbà tí ó tẹ̀ síwájú, a ń ṣe ìgbésẹ̀ ìyáwòrán nípa lílo loop láti ya ọ̀pọ̀lọpọ̀ fọ́tò. A máa ń fi data àwòrán náà pamọ́ sínú káàdì SD pẹ̀lú orúkọ fáìlì tí ó dá lórí pictureNumber.
for (int shoot = 0; shoot < 5; shoot++) {
camera_fb_t *fb = esp_camera_fb_get(); // Ya Fọ́tò
String path = "/picture" + String(pictureNumber) + ".jpg"; // Ọ̀nà fáìlì
File file = fs.open(path.c_str(), FILE_WRITE); // Ṣí fáìlì láti kọ
// Kọ data àwòrán sí inú fáìlì
file.write(fb->buf, fb->len);
// Ṣàtúnṣe nọ́mbà àwòrán nínú EEPROM
EEPROM.write(0, pictureNumber);
}
Loop yìí ń ya títí di àwòrán márùn-ún, níbi tí a ti máa ń fi àwòrán kọ̀ọ̀kan pamọ́ pẹ̀lú orúkọ tí ó yàtọ̀. Lílo EEPROM jẹ́ kí ètò náà rántí nọ́mbà àwòrán tí ó kẹ́yìn, ní ti pé àwòrán tuntun kọ̀ọ̀kan ní àmì ìdánimọ̀ tí ó yàtọ̀.
Ìfihàn / Ohun Tí O Lè Retí
Nígbà tí o bá ṣiṣẹ́ kóòdù náà, ESP32 yóò ṣe ìbẹ̀rẹ̀ kámẹ́rà àti káàdì SD. Lẹ́yìn tí o bá tẹ bọ́tìnì reset lórí ESP32, yóò ya àwọn fọ́tò púpọ̀, tí wọ́n yóò kà ní ọ̀nà tí ó tẹ̀léra láti 0 sí 255 dá lórí iye EEPROM. Lẹ́yìn tí o bá ti ya àwọn fọ́tò náà, o lè yọ káàdì micro SD kúrò kí o sì wo àwọn fọ́tò náà lórí kọ̀ǹpútà rẹ.
Àwọn ìṣòro tí ó wọ́pọ̀ ní pípa mọ́ pé káàdì micro SD ti ṣe format dáradára tí a sì fi sí i, àti pípa mọ́ pé kámẹ́rà dúró ṣinṣin láti yẹra fún àwọn fọ́tò tí kò ṣe kedere. Bí o bá ní ìṣòro pẹ̀lú kámẹ́rà tí kò ya fọ́tò, ṣàyẹ̀wò àwọn okun àti àwọn ìtòlẹ́sẹ̀ tí a gbé sí inú kóòdù náà (nínú fídíò ní 06:45).
Àwọn Àsìkò Fídíò
- 00:00 Ìbẹ̀rẹ̀
- 1:39 Ìfihàn
- 5:19 Àlàyé Kóòdù Kámẹ́rà ESP32
- 11:10 Yíyan bọ́ọ̀dù ESP32 àti èbúté COM nínú Arduino IDE
- 12:52 Yíya fọ́tò nínú ilé àti ìdánwò ìta
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-cam-take-photo-save-microsd-card
IMPORTANT!!!
- Select Board "AI Thinker ESP32-CAM"
- GPIO 0 must be connected to GND to upload a sketch
- After connecting GPIO 0 to GND, press the ESP32-CAM on-board RESET button to put your board in flashing mode
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*********/
#include "esp_camera.h"
#include "Arduino.h"
#include "FS.h" // SD Card ESP32
#include "SD_MMC.h" // SD Card ESP32
#include "soc/soc.h" // Disable brownour problems
#include "soc/rtc_cntl_reg.h" // Disable brownour problems
#include "driver/rtc_io.h"
#include <EEPROM.h> // read and write from flash memory
// define the number of bytes you want to access
#define EEPROM_SIZE 1
// Pin definition for 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
int pictureNumber = 0;
void setup() {
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
Serial.begin(115200);
//Serial.setDebugOutput(true);
//Serial.println();
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; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
config.jpeg_quality = 10;
config.fb_count = 2;
} else {
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 12;
config.fb_count = 1;
}
// Init Camera
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x", err);
return;
}
//Serial.println("Starting SD Card");
if (!SD_MMC.begin()) {
Serial.println("SD Card Mount Failed");
return;
}
uint8_t cardType = SD_MMC.cardType();
if (cardType == CARD_NONE) {
Serial.println("No SD Card attached");
return;
}
// initialize EEPROM with predefined size
EEPROM.begin(EEPROM_SIZE);
pictureNumber = EEPROM.read(0) + 1;
for (int shoot = 0; shoot < 5; shoot++) {
camera_fb_t *fb = NULL;
// Take Picture with Camera
fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Camera capture failed");
return;
}
// Path where new picture will be saved in SD Card
String path = "/picture" + String(pictureNumber) + ".jpg";
fs::FS &fs = SD_MMC;
// Serial.printf("Picture file name: %s\n", path.c_str());
File file = fs.open(path.c_str(), FILE_WRITE);
if (!file) {
Serial.println("Failed to open file in writing mode");
} else {
file.write(fb->buf, fb->len); // Write image data to file
if (shoot == 4) {
Serial.printf("Saved file to path: %s\n", path.c_str());
}else{
Serial.printf("Shooting... \n");
}
EEPROM.write(0, pictureNumber); // Update the picture number in EEPROM
EEPROM.commit();
}
file.close(); // Close the file
esp_camera_fb_return(fb); // Return the frame buffer back to the camera driver
delay(200); // Short delay between shots
}
// Turns off the ESP32-CAM white on-board LED (flash) connected to GPIO 4
pinMode(4, OUTPUT);
digitalWrite(4, LOW);
rtc_gpio_hold_en(GPIO_NUM_4);
// Put the ESP32-CAM to deep sleep
delay(2000);
Serial.println("Going to sleep now");
delay(2000);
esp_deep_sleep_start();
Serial.println("This will never be printed");
}
void loop() {
// Empty loop as we are putting the ESP32-CAM to deep sleep
}
Common Course Links
Common Course Files
Orisun & itọkasi
-
Iwe-ẹriESP32 Tutorial 42/55- SunFounder doc page taking photodocs.sunfounder.com
Fáìlìs📁
Ko si awọn faili ti o wa.