🤖Have you ever tried Chat.M5Stack.com before asking??😎
    M5Stack Community
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    AtomS3R Camera & esp_camera.h example

    Atom
    2
    4
    797
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • C
      cepics
      last edited by

      Hi all, I can upload and run the camera.ino Arduino sketch on GitHub setting OPI PSRAM in tools menu in Arduino IDE 2.3.4.

      I wolud like now to try this project ESP32-CAM Take Photo and Display in Web Server but without any joy!!

      /*********
        Rui Santos
        Complete project details at https://RandomNerdTutorials.com/esp32-cam-take-photo-display-web-server/
        
        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
        
        The above copyright notice and this permission notice shall be included in all
        copies or substantial portions of the Software.
      *********/
      
      #include "WiFi.h"
      #include "esp_camera.h"
      #include "esp_timer.h"
      #include "img_converters.h"
      #include "Arduino.h"
      #include "soc/soc.h"           // Disable brownour problems
      #include "soc/rtc_cntl_reg.h"  // Disable brownour problems
      #include "driver/rtc_io.h"
      #include <ESPAsyncWebServer.h>
      #include <SPIFFS.h>
      #include <FS.h>
      
      // Replace with your network credentials
      const char* ssid = "REPLACE_WITH_YOUR_SSID";
      const char* password = "REPLACE_WITH_YOUR_PASSWORD";
      
      // Create AsyncWebServer object on port 80
      AsyncWebServer server(80);
      
      boolean takeNewPhoto = false;
      
      // Photo File Name to save in SPIFFS
      #define FILE_PHOTO "/photo.jpg"
      
      // OV2640 camera module pins (CAMERA_MODEL_AI_THINKER)
      #define PWDN_GPIO_NUM     -1
      #define RESET_GPIO_NUM    -1
      #define XCLK_GPIO_NUM     21
      #define SIOD_GPIO_NUM     12
      #define SIOC_GPIO_NUM     9
      #define Y9_GPIO_NUM       13
      #define Y8_GPIO_NUM       11
      #define Y7_GPIO_NUM       17
      #define Y6_GPIO_NUM       4
      #define Y5_GPIO_NUM       48
      #define Y4_GPIO_NUM       46
      #define Y3_GPIO_NUM       42
      #define Y2_GPIO_NUM        3
      #define VSYNC_GPIO_NUM    10
      #define HREF_GPIO_NUM     14
      #define PCLK_GPIO_NUM     40
      
      const char index_html[] PROGMEM = R"rawliteral(
      <!DOCTYPE HTML><html>
      <head>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <style>
          body { text-align:center; }
          .vert { margin-bottom: 10%; }
          .hori{ margin-bottom: 0%; }
        </style>
      </head>
      <body>
        <div id="container">
          <h2>ESP32-CAM Last Photo</h2>
          <p>It might take more than 5 seconds to capture a photo.</p>
          <p>
            <button onclick="rotatePhoto();">ROTATE</button>
            <button onclick="capturePhoto()">CAPTURE PHOTO</button>
            <button onclick="location.reload();">REFRESH PAGE</button>
          </p>
        </div>
        <div><img src="saved-photo" id="photo" width="70%"></div>
      </body>
      <script>
        var deg = 0;
        function capturePhoto() {
          var xhr = new XMLHttpRequest();
          xhr.open('GET', "/capture", true);
          xhr.send();
        }
        function rotatePhoto() {
          var img = document.getElementById("photo");
          deg += 90;
          if(isOdd(deg/90)){ document.getElementById("container").className = "vert"; }
          else{ document.getElementById("container").className = "hori"; }
          img.style.transform = "rotate(" + deg + "deg)";
        }
        function isOdd(n) { return Math.abs(n % 2) == 1; }
      </script>
      </html>)rawliteral";
      
      void setup() {
        // Serial port for debugging purposes
        Serial.begin(115200);
      
        // Connect to Wi-Fi
        WiFi.begin(ssid, password);
        while (WiFi.status() != WL_CONNECTED) {
          delay(1000);
          Serial.println("Connecting to WiFi...");
        }
        if (!SPIFFS.begin(true)) {
          Serial.println("An Error has occurred while mounting SPIFFS");
          ESP.restart();
        }
        else {
          delay(500);
          Serial.println("SPIFFS mounted successfully");
        }
      
        // Print ESP32 Local IP Address
        Serial.print("IP Address: http://");
        Serial.println(WiFi.localIP());
      
        // Turn-off the 'brownout detector'
        WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
      
        // OV2640 camera module
        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_sccb_sda = SIOD_GPIO_NUM;
        config.pin_sccb_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;
          config.jpeg_quality = 10;
          config.fb_count = 2;
        } else {
          config.frame_size = FRAMESIZE_SVGA;
          config.jpeg_quality = 12;
          config.fb_count = 1;
        }
        // Camera init
        esp_err_t err = esp_camera_init(&config);
        if (err != ESP_OK) {
          Serial.printf("Camera init failed with error 0x%x", err);
          ESP.restart();
        }
      
        // Route for root / web page
        server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
          request->send(200, "text/html", index_html);
        });
      
        server.on("/capture", HTTP_GET, [](AsyncWebServerRequest * request) {
          takeNewPhoto = true;
          request->send(200, "text/plain", "Taking Photo");
        });
      
        server.on("/saved-photo", HTTP_GET, [](AsyncWebServerRequest * request) {
          request->send(SPIFFS, FILE_PHOTO, "image/jpg", false);
        });
      
        // Start server
        server.begin();
      
      }
      
      void loop() {
        if (takeNewPhoto) {
          capturePhotoSaveSpiffs();
          takeNewPhoto = false;
        }
        delay(1);
      }
      
      // Check if photo capture was successful
      bool checkPhoto( fs::FS &fs ) {
        File f_pic = fs.open( FILE_PHOTO );
        unsigned int pic_sz = f_pic.size();
        return ( pic_sz > 100 );
      }
      
      // Capture Photo and Save it to SPIFFS
      void capturePhotoSaveSpiffs( void ) {
        camera_fb_t * fb = NULL; // pointer
        bool ok = 0; // Boolean indicating if the picture has been taken correctly
      
        do {
          // Take a photo with the camera
          Serial.println("Taking a photo...");
      
          fb = esp_camera_fb_get();
          if (!fb) {
            Serial.println("Camera capture failed");
            return;
          }
      
          // Photo file name
          Serial.printf("Picture file name: %s\n", FILE_PHOTO);
          File file = SPIFFS.open(FILE_PHOTO, FILE_WRITE);
      
          // Insert the data in the photo file
          if (!file) {
            Serial.println("Failed to open file in writing mode");
          }
          else {
            file.write(fb->buf, fb->len); // payload (image), payload length
            Serial.print("The picture has been saved in ");
            Serial.print(FILE_PHOTO);
            Serial.print(" - Size: ");
            Serial.print(file.size());
            Serial.println(" bytes");
          }
          // Close the file
          file.close();
          esp_camera_fb_return(fb);
      
          // check if file has been correctly saved in SPIFFS
          ok = checkPhoto(SPIFFS);
        } while ( !ok );
      }
      

      I copied and pasted settings from the camera_pins.h tab but atom cam crash..

      load:0x403cb700,len:0x30e4
      entry 0x403c88ac
      Connecting to WiFi...
      SPIFFS mounted successfully
      IP Address: http://192.168.1.97ESP-ROM:esp32s3-20210327
      Build:Mar 27 2021
      rst:0x3 (RTC_SW_SYS_RST),boot:0x18 (SPI_FAST_FLASH_BOOT)
      Saved PC:0x40376b24
      SPIWP:0xee
      mode:DIO, clock div:1
      load:0x3fce2820,len:0x1188
      load:0x403c8700,len:0x4
      load:0x403c8704,len:0xbf0
      load:0x403cb700,len:0x30e4
      entry 0x403c88ac
      Connecting to WiFi...
      SPIFFS mounted successfully
      IP Address: http://192.168.1.97
      ESP-ROM:esp32s3-20210327
      Build:Mar 27 2021
      rst:0x3 (RTC_SW_SYS_RST),boot:0x18 (SPI_FAST_FLASH_BOOT)
      Saved PC:0x40376b24
      SPIWP:0xee
      mode:DIO, clock div:1
      load:0x3fce2820,len:0x1188
      load:0x403c8700,len:0x4
      load:0x403c8704,len:0xbf0
      load:0x403cb700,len:0x30e4
      entry 0x403c88ac
      Connecting to WiFi...
      SPIFFS mounted successfully
      IP Address: http://192.168.1.97
      ESP-ROM:esp32s3-20210327
      Build:Mar 27 2021
      rst:0x3 (RTC_SW_SYS_RST),boot:0x18 (SPI_FAST_FLASH_BOOT)
      Saved PC:0x40376b24
      SPIWP:0xee
      mode:DIO, clock div:1
      load:0x3fce2820,len:0x1188
      load:0x403c8700,len:0x4
      load:0x403c8704,len:0xbf0
      load:0x403cb700,len:0x30e4
      entry 0x403c88ac
      

      I know this example is made for AI Thinker ESP32-CAM but changing camera_pins is not enough...

      some tips?

      best regards

      C 1 Reply Last reply Reply Quote 0
      • C
        cepics @cepics
        last edited by

        @cepics nobody?

        kurikoK 1 Reply Last reply Reply Quote 0
        • kurikoK
          kuriko @cepics
          last edited by

          @cepics
          why don't you try this example? https://github.com/m5stack/M5AtomS3/blob/main/examples/Basics/camera/camera.ino

          Good morning, and welcome to the Black Mesa Transit System.

          C 1 Reply Last reply Reply Quote 0
          • C
            cepics @kuriko
            last edited by

            @kuriko thanks for the reply, as I wrote on post n. 1,

            @cepics said in AtomS3R Camera & esp_camera.h example:

            I can upload and run the camera.ino

            for my project I need to take picture and display it in a web page....

            1 Reply Last reply Reply Quote 0
            • First post
              Last post