🤖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

    Scheduled Pinned Locked Moved Atom
    4 Posts 2 Posters 4.2k Views
    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 Offline
      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 Offline
        cepics @cepics
        last edited by

        @cepics nobody?

        kurikoK 1 Reply Last reply Reply Quote 0
        • kurikoK Offline
          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 Offline
            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

            Hello! It looks like you're interested in this conversation, but you don't have an account yet.

            Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

            With your input, this post could be even better 💗

            Register Login
            • First post
              Last post