Tutorial ESP32 42/55 - Qaadashada Sawirka Kamaradda oo lagu kaydiyo Micro SD CAM-1 | Qalabka ESP32 ee SunFounder
Cashigarkani, waxaan isticmaali doonnaa kontoroolka ESP32 oo ay weheliso looxa kordhintiisa ee SunFounder si aan u qaadanno sawiro iyadoo la isticmaalayo kamarad oo aan si toos ah ugu keydinno SD card yar. Mashruucani wuxuu isticmaalaa awoodaha ku dhex jira ESP32, oo ay ku jiraan Wi-Fi iyo Bluetooth, si loo abuuro qalab sawir qaade oo is haysta. Markaad dhammaystirto casharkan, waxaad yeelan doontaa qalab shaqeeya oo qaadi kara oo keydin kara sawiro, kuwaas oo markii dambe lagu heli karo kombuyuutar.
Kuwa cusub ee nidaamka ESP32, qalabkani wuxuu bixiyaa goob wax ku ool ah oo loogu talagalay mashaariic kala duwan, oo ay ku jirto tan. Kamaradda loo isticmaalo mashruucan waa OV2640, taas oo bixisa qaraar 1600x1200 pixels. In kasta oo laga yaabo inaysan la mid ahayn tayada taleefannada casriga ah, waxay ku filan tahay hawlo sawir qaadis oo aasaasi ah. Si aad u caddeyso tillaabooyinka, hubi inaad fiiriso fiidiyowga la socda casharkan (fiidiyowga 00:00).
Qalabka La Sharxay
Qaybaha ugu muhiimsan ee mashruucan waxaa ka mid ah kontoroolka ESP32, qaybta kamaradda (OV2640), iyo SD card yar oo loogu talagalay keydinta. ESP32 waa kontorool awood badan oo leh awoodo Wi-Fi iyo Bluetooth oo isku dhafan, taas oo ka dhigaysa mid ku habboon codsiyada IoT. Qaybta kamaraddu waxay qaadaa sawiro, kuwaas oo markaa ay farsameeyaan ESP32.
SD card yar waxay u shaqeysaa sidii meel keydin oo loogu talagalay sawirada la qaaday. Qaabkan, ESP32 wuxuu la xiriiraa qaybta kamaradda iyadoo la isticmaalayo biinanka GPIO gaarka ah, sawiradana waxaa lagu keydiyaa qaabka JPEG ee SD card-ka. Tani waxay u oggolaanaysaa in si fudud loo soo celiyo oo loo daawado sawirada markii dambe.
- Hubi in kamaraddu si sax ah u jihaysan tahay markaad gelinayso looxa ESP32.
- Isticmaal SD card yar oo awood u leh 32 GB ama ka yar si looga fogaado dhibaatooyinka iswaafajinta.
- Ku xir GPIO 0 ilaa GND qaabka barnaamijyeynta.
- Fiiro gaar ah u yeelo sahayda korontada si looga fogaado dhibaatooyinka brownout.
- Kamaradda si deggan u hay markaad sawir qaadayso si aad uga fogaato sawiro aan caddayn.
Tilmaamaha Xirista
Si aad u xirto qaybta kamaradda ESP32, marka hore hubi in ESP32 uu damay. Ku xir qaybta SD card yar ee ESP32 adigoo isticmaalaya biinanka soo socda: ku xir biinka CS ee SD card-ka ilaa GPIO 5 ee ESP32, MOSI ilaa GPIO 23, MISO ilaa GPIO 19, iyo SCK ilaa GPIO 18. Marka xigta, ku xir biinanka qaybta kamaradda sida soo socota: PWDN ilaa GPIO 32, XCLK ilaa GPIO 0, SIOD ilaa GPIO 26, iyo SIOC ilaa GPIO 27. Biinanka xogta pixel-ka Y2 ilaa Y9 waa in lagu xiraa GPIO 5 ilaa GPIO 39 sida lagu qeexay koodhkaaga.
Hubi inaad si habboon u xirto biinanka dhulka iyo korontada. ESP32 waxaa lagu shidi karaa batteriga ku jira qalabka. Ka dib xirista, hubi in xirsiyadu ay adag yihiin ka hor intaadan shidin qalabka. Haddii aad si dhow u raacdo tilmaamaha, waxaad arki doontaa kamaraddu si sax ah u bilaabato markaad soo geliso koodhka.
Tusaalooyinka Koodhka & Sharaxaad
Koodhka, waxaan ku bilaabaynaa inaan ku darro maktabado lagama maarmaan ah oo aan qeexno qaabaynta biinanka kamaradda. Doorsoomaha pictureNumber waa la bilaabay si uu u xisaabiyo tirada sawirada la qaaday.
int pictureNumber = 0;
void setup() {
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); // Disable brownout detector
Serial.begin(115200);
camera_config_t config;
// Configuration settings for the camera
config.ledc_channel = LEDC_CHANNEL_0;
// Additional camera settings...
}
Hawsha setup waxay bilaabaysaa isgaarsiinta serial-ka waxayna qaabaynaysaa goobaha kamaradda. Qaabaynta waxaa ku jira cabbiro sida ledc_channel, pin_d0, iyo xclk_freq_hz si loo helo waxqabad wanaagsan.
Marka xigta, waxaan wax ka qabannaa habka qaadista sawirka adigoo isticmaalaya loop si loo qaado sawiro badan. Xogta sawirka waxaa lagu keydiyaa SD card-ka iyadoo la isticmaalayo magac ku salaysan pictureNumber.
for (int shoot = 0; shoot < 5; shoot++) {
camera_fb_t *fb = esp_camera_fb_get(); // Take Picture
String path = "/picture" + String(pictureNumber) + ".jpg"; // File path
File file = fs.open(path.c_str(), FILE_WRITE); // Open file to write
// Write image data to file
file.write(fb->buf, fb->len);
// Update picture number in EEPROM
EEPROM.write(0, pictureNumber);
}
Loop-kani wuxuu qaadaa ilaa shan sawir, halkaas oo sawir kasta lagu keydiyo magac gaar ah. Isticmaalka EEPROM wuxuu u oggolaanayaa barnaamijka inuu xasuusto nambarkii sawirka ee ugu dambeeyay, isagoo hubinaya in sawir kasta oo cusub uu leeyahay aqoonsi gaar ah.
Muuqaal / Waxa Laga Filan Karo
Markaad code-ga shaqeysiiso, ESP32 wuxuu bilaabi doonaa kamarada iyo kaadhka SD. Ka dib markaad riixdo badhanka reset ee ESP32, wuxuu qaadi doonaa sawiro taxane ah, kuwaas oo loo tirin doono si isku xigta laga bilaabo 0 ilaa 255 iyadoo lagu salaynayo qiimaha EEPROM. Ka dib qabashada sawirada, waxaad ka saari kartaa kaadhka SD yar oo waxaad ku daawan kartaa sawirada kombiyuutarkaaga.
Khaladaadka caadiga ah waxaa ka mid ah hubinta in kaadhka SD yar si habboon loo qaabeeyey oo la geliyey, iyo sidoo kale ilaalinta booska kamarada oo deggan si looga fogaado sawirada aan caddayn. Haddii aad la kulanto dhibaatooyin kamarada oo aan sawirada qaadayn, dib u hubi fiilooyinka iyo qaabaynta ku qoran code-ka (fiidiyowga 06:45).
Waqtiyada Fiidiyowga
- 00:00 Bilow
- 1:39 Hordhac
- 5:19 Sharaxaadda Code-ka Kamarada ESP32
- 11:10 Doorashada looxa ESP32 iyo dekedda COM ee Arduino IDE
- 12:52 Qaadista sawirada gudaha iyo dibadda tijaabo
/*********
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
Kheyraadka & Tixraacyada
-
DukumentiESP32 Tutorial 42/55- SunFounder doc page taking photodocs.sunfounder.com
Faylasha📁
Fayl la'aan.