0
<< предыдущая заметкаследующая заметка >>
28 марта 2025
Шпигель, Шпигель ай лю-лю



Кажется я собрал зеркальце.

UPD: Спрашивают, чего как. Ну чо, Ардуино. Дисплейчики круглые GC9A01 1.28дюйма (меньше не вижу смысла) от 194 руб, ESP32 с камерой OV-2640 (в OV-5640 не вижу смысла, мы даже то разрешение не используем) — от 649 руб.

Возможно, придется копаться с настройками, у меня какая-то более странная ESP32-S3-CAM GOO-UUU. Скетч для нее SHPIGEL.ino, кому интересно, совсем короткий, он вот:

[показать спрятанное]
#include <LovyanGFX.hpp>
#include <TJpg_Decoder.h>

#include "esp_camera.h"
camera_fb_t *fb = NULL;
bool camera_init() {
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = 11;
  config.pin_d1 = 9;
  config.pin_d2 = 8;
  config.pin_d3 = 10;
  config.pin_d4 = 12;
  config.pin_d5 = 18;
  config.pin_d6 = 17;
  config.pin_d7 = 16;
  config.pin_xclk = 15;
  config.pin_pclk = 13;
  config.pin_vsync = 6;
  config.pin_href = 7;
  config.pin_sccb_sda = 4;
  config.pin_sccb_scl = 5;
  config.pin_pwdn = -1;
  config.pin_reset = -1;
  config.xclk_freq_hz = 20000000;
  config.frame_size = FRAMESIZE_UXGA;
  config.pixel_format = PIXFORMAT_JPEG;  // for streaming
  config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
  config.fb_location = CAMERA_FB_IN_PSRAM;
  config.jpeg_quality = 12;
  config.fb_count = 1;
    if (psramFound()) {
      config.jpeg_quality = 10;
      config.fb_count = 2;
      config.grab_mode = CAMERA_GRAB_LATEST;
    } else {
      // Limit the frame size when PSRAM is not available
      // config.frame_size = FRAMESIZE_SVGA;
      config.frame_size = FRAMESIZE_QVGA;
      config.fb_location = CAMERA_FB_IN_DRAM;
    }
  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return false;
  }

  sensor_t *s = esp_camera_sensor_get();
  // initial sensors are flipped vertically and colors are a bit saturated
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1);        // flip it back
    s->set_brightness(s, 1);   // up the brightness just a bit
    s->set_saturation(s, -2);  // lower the saturation
  }
  // drop down frame size for higher initial frame rate
  s->set_framesize(s, FRAMESIZE_QVGA);
  Serial.println("ready");
  return true;
}

// DISPLAY SETUP
class LGFX : public lgfx::LGFX_Device {
  lgfx::Panel_GC9A01 _panel;
  lgfx::Bus_SPI _bus;

public:
  LGFX() {
    auto bus_cfg = _bus.config();
    bus_cfg.spi_host = SPI2_HOST;
    bus_cfg.spi_mode = 0;
    bus_cfg.freq_write = 40000000;
    bus_cfg.pin_sclk = 39;
    bus_cfg.pin_mosi = 40;
    bus_cfg.pin_miso = -1;
    bus_cfg.pin_dc   = 2;
    _bus.config(bus_cfg);
    _panel.setBus(&_bus);

    auto panel_cfg = _panel.config();
    panel_cfg.pin_cs   = 1;
    panel_cfg.pin_rst  = 3;
    panel_cfg.pin_busy = -1;
    _panel.config(panel_cfg);

    setPanel(&_panel);
  }
};

LGFX tft;

// JPEG CALLBACK
bool jpegRender(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t *bitmap) {
  for(int i=0; i< w*h; i++) {
    uint16_t px = bitmap[i];
    bitmap[i] = (px << 8) | (px >> 8); // MSB &#8596; LSB
  }
  tft.pushImage(x, y, w, h, bitmap);
  return true;
}

void setup() {
  Serial.begin(115200);
  delay(100);

  tft.init();
  tft.setRotation(0);
  tft.invertDisplay(true); // Включить инверсию дисплея
  tft.fillScreen(TFT_BLACK);

  TJpgDec.setJpgScale(1);
  TJpgDec.setCallback(jpegRender);
  delay(200);

  if(!camera_init()) { Serial.println("Camera error"); while(1); }
  Serial.println("Camera OK");
  delay(200);
}

void loop() {
  fb = esp_camera_fb_get();
  if(fb) {
    TJpgDec.drawJpg(0, 0, fb->buf, fb->len);
    esp_camera_fb_return(fb);
  } else {
    Serial.println("Frame error");
  }
   delay(1);
}

Также в библиотеках Arduino есть интересная демка ESP32-Camera-СамераWebServer, которая показывает, как можно с камеры смотреть фотки или видео через интернет, благо в этом случае не требуется ресурсов для хранения потока. А вот средой Arduino как таковой пользоваться не советую — лучше переползать на VSCODE PlatformIO — она не просто чуть умнее и современнее, она умеет кэшировать полусобранные библиотеки, из-за чего сборка кода происходит реально в разы быстрее. Мне с моим фреймворком сложно переползти, он большой очень, много переписывать придется, там формат чуть разный. Но если проект с нуля, лучше сегодня не связываться со средой Ардуино.

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок

Комментарии к этой заметке скрываются - они будут видны только вам и мне.

Оставить комментарий