df_s3_ai_cam.cc 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "wifi_board.h"
  2. #include "codecs/no_audio_codec.h"
  3. #include "system_reset.h"
  4. #include "application.h"
  5. #include "button.h"
  6. #include "config.h"
  7. #include "esp32_camera.h"
  8. #include "led/gpio_led.h"
  9. #include <wifi_station.h>
  10. #include <esp_log.h>
  11. #include <driver/i2c_master.h>
  12. #include <driver/gpio.h>
  13. #define TAG "DfrobotEsp32S3AiCam"
  14. class DfrobotEsp32S3AiCam : public WifiBoard {
  15. private:
  16. Button boot_button_;
  17. Esp32Camera* camera_;
  18. void InitializeButtons() {
  19. boot_button_.OnClick([this]() {
  20. auto& app = Application::GetInstance();
  21. if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) {
  22. ResetWifiConfiguration();
  23. }
  24. app.ToggleChatState();
  25. });
  26. }
  27. void InitializeCamera() {
  28. camera_config_t config = {};
  29. config.ledc_channel = LEDC_CHANNEL_2; // LEDC通道选择 用于生成XCLK时钟 但是S3不用
  30. config.ledc_timer = LEDC_TIMER_2; // LEDC timer选择 用于生成XCLK时钟 但是S3不用
  31. config.pin_d0 = CAMERA_PIN_D0;
  32. config.pin_d1 = CAMERA_PIN_D1;
  33. config.pin_d2 = CAMERA_PIN_D2;
  34. config.pin_d3 = CAMERA_PIN_D3;
  35. config.pin_d4 = CAMERA_PIN_D4;
  36. config.pin_d5 = CAMERA_PIN_D5;
  37. config.pin_d6 = CAMERA_PIN_D6;
  38. config.pin_d7 = CAMERA_PIN_D7;
  39. config.pin_xclk = CAMERA_PIN_XCLK;
  40. config.pin_pclk = CAMERA_PIN_PCLK;
  41. config.pin_vsync = CAMERA_PIN_VSYNC;
  42. config.pin_href = CAMERA_PIN_HREF;
  43. config.pin_sccb_sda = CAMERA_PIN_SIOD; // 这里如果写-1 表示使用已经初始化的I2C接口
  44. config.pin_sccb_scl = CAMERA_PIN_SIOC;
  45. config.sccb_i2c_port = 1; // 这里如果写1 默认使用I2C1
  46. config.pin_pwdn = CAMERA_PIN_PWDN;
  47. config.pin_reset = CAMERA_PIN_RESET;
  48. config.xclk_freq_hz = XCLK_FREQ_HZ;
  49. config.pixel_format = PIXFORMAT_RGB565;
  50. config.frame_size = FRAMESIZE_VGA;
  51. config.jpeg_quality = 12;
  52. config.fb_count = 1;
  53. config.fb_location = CAMERA_FB_IN_PSRAM;
  54. config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
  55. camera_ = new Esp32Camera(config);
  56. camera_->SetVFlip(1);
  57. }
  58. public:
  59. DfrobotEsp32S3AiCam() :
  60. boot_button_(BOOT_BUTTON_GPIO) {
  61. InitializeButtons();
  62. InitializeCamera();
  63. }
  64. virtual Led* GetLed() override {
  65. static GpioLed led(BUILTIN_LED_GPIO, 0);
  66. return &led;
  67. }
  68. virtual AudioCodec* GetAudioCodec() override {
  69. static NoAudioCodecSimplexPdm audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE,
  70. AUDIO_I2S_SPK_GPIO_BCLK, AUDIO_I2S_SPK_GPIO_LRCK, AUDIO_I2S_SPK_GPIO_DOUT,
  71. AUDIO_I2S_MIC_GPIO_SCK, AUDIO_I2S_MIC_GPIO_DIN);
  72. return &audio_codec;
  73. }
  74. virtual Camera* GetCamera() override {
  75. return camera_;
  76. }
  77. };
  78. DECLARE_BOARD(DfrobotEsp32S3AiCam);