RisalDash RisalDash

مشروع · ESP32-CAM · فاصل زمنيّ

كاميرا فاصل زمنيّ من لوحة بسبعة دولارات

موقع بناء، نبتة تنمو، سماء مليئة بالغيوم — الفاصل الزمنيّ يضغط الساعات إلى ثوانٍ، وESP32-CAM تقوم بالعمل كلّه: تلتقط JPEG بجدول، تحفظه على MicroSD، وتقدّم لوحة حيّة ترى فيها من هاتفك عدّاد اللقطات يرتفع والبطاقة تمتلئ.

مشروعESP32-CAMفاصل زمنيّMicroSD
مشروع كاميرا فاصل زمنيّ بـ ESP32-CAM: JPEG إلى MicroSD بجدول مع لوحة حيّة

لقطة → SD، الدورة كاملة

يضغط OV2640 إلى JPEG عتاديًّا، فاللقطة هي grab → write → return. الأسماء المرقّمة (/0001.jpg…) تجعل خطوة ffmpeg تافهة لاحقًا. قاعدتان للثبات: أعد المخزن دائمًا بـ esp_camera_fb_return()، وركّب البطاقة بـ SD_MMC.begin("/sdcard", true) — وضع bit-1 يحرّر طرف فلاش LED:

void capture(const char* why) {
  camera_fb_t* fb = esp_camera_fb_get();           // grab a JPEG frame
  if (!fb) { if (evlog) evlog->print("Capture FAILED"); return; }
  char name[16];
  snprintf(name, sizeof(name), "/%04u.jpg", (unsigned)++shotNo);
  File f = SD_MMC.open(name, FILE_WRITE);
  if (f) { f.write(fb->buf, fb->len); f.close(); shots = shotNo; }
  esp_camera_fb_return(fb);                        // ALWAYS return the frame buffer
  if (evlog) evlog->print(String(why) + " -> " + name);
}

// loop(): a shot every CAPTURE_EVERY_S seconds
if (millis() - lastShot > CAPTURE_EVERY_S * 1000UL) { lastShot = millis(); capture("Timer"); }

اللوحة — تراها تعمل

كاميرا عمياء في علبة تثير القلق. خمس أدوات تحلّ ذلك: عدّاد الصور، مقياس SD، حالة البطاقة، زرّ «صوّر الآن» وسجلّ اللقطات:

dash.layout("Trap", RICON_MOTION);
dash.stat("Photos", &shots, "");
dash.gauge("SD used", &sdUsedPct, 0, 100, "%").variant("bar");
dash.led("SD ready", &sdOk);
dash.button("Shoot", "Capture now", []() { capture("Manual"); });
evlog = &dash.log("Captures", 6);
dash.beginAP("RisalDash-CamTrap", "12345678");

sdOk = SD_MMC.begin("/sdcard", true);   // 1-bit mode frees the flash-LED pin

الكود الجاهز هو examples/06_Projects/CamTrap مع MODE_TIMELAPSE 1؛ والبناء نفسه ينقلب بتعريف واحد إلى مصيدة كاميرا PIR.

اختيار الأرقام

الإعدادالاختيارلماذا
الدقّةSVGA 800×600حدّة كافية، ~40–80 KB/لقطة — راجع دليل الإعدادات
جودة JPEG10النقطة المثلى حجمًا وتفصيلًا
الفاصل30 ث (غيوم) · 5 د (نبات) · 15 د (بناء)حسب سرعة المشهد
الوقتNTP مع Wi-FiDS3231 RTC فقط للعمل دون اتّصال كامل

بطاقة 32 GB بدقّة SVGA تتّسع لنحو نصف مليون لقطة — البطاريّة تنفد قبل التخزين بكثير. للتشغيل لأسابيع غذِّ من محوّل جداريّ أو اجمع خليّة LiFePO4 كبيرة مع النوم العميق بين اللقطات.

من لقطات إلى فيديو

ffmpeg -framerate 30 -i %04d.jpg -c:v libx264 -pix_fmt yuv420p timelapse.mp4

‏30 إطارًا/ث تعني أنّ كلّ ثانية فيديو تأكل 900 لقطة بفاصل 30 ث — أي 7.5 ساعات من الزمن الحقيقيّ. هذه هي النسبة السحريّة للتخطيط.

اللوحة نفسها والكود نفسه — تعريف واحد يجعلها مصيدة تعمل بالحركة.