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

    AtomS3R-CAM and telegram bot

    Scheduled Pinned Locked Moved Atom
    1 Posts 1 Posters 1.8k 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 cepics

      Hi all, I would like to play with atom s3r cam to send photo on telegram ..

      this is the last not working code I try..

      #include <Arduino.h>
      #include <WiFi.h>
      #include <WiFiClientSecure.h>
      #include "soc/soc.h"
      #include "soc/rtc_cntl_reg.h"
      #include "esp_camera.h"
      #include <UniversalTelegramBot.h>
      #include <ArduinoJson.h>
      
      const char* ssid = "mywifi";
      const char* password = "mywifipassword";
      
      // Initialize Telegram BOT
      String BOTtoken = "mybottoken";  // your Bot Token (Get from Botfather)
      
      // Use @myidbot to find out the chat ID of an individual or a group
      // Also note that you need to click "start" on a bot before it can
      // message you
      String CHAT_ID = "mychatid";
      
      bool sendPhoto = false;
      
      WiFiClientSecure clientTCP;
      UniversalTelegramBot bot(BOTtoken, clientTCP);
      
      #define FLASH_LED_PIN 4
      bool flashState = LOW;
      
      //Checks for new messages every 1 second.
      int botRequestDelay = 1000;
      unsigned long lastTimeBotRan;
      
      //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
      
      
      void configInitCamera(){
        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_sscb_sda = SIOD_GPIO_NUM;
        config.pin_sscb_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_RGB565;
      
        //init with high specs to pre-allocate larger buffers
        if(psramFound()){
          config.frame_size = FRAMESIZE_QVGA;
          config.jpeg_quality = 12;  //0-63 lower number means higher quality
          config.fb_count = 2;
        } else {
          config.frame_size = FRAMESIZE_QVGA;
          config.jpeg_quality = 12;  //0-63 lower number means higher quality
          config.fb_count = 2;
        }
        
        // camera init
        esp_err_t err = esp_camera_init(&config);
        if (err != ESP_OK) {
          Serial.printf("Camera init failed with error 0x%x", err);
          delay(1000);
          ESP.restart();
        }
      
        // Drop down frame size for higher initial frame rate
        sensor_t * s = esp_camera_sensor_get();
        s->set_framesize(s, FRAMESIZE_CIF);  // UXGA|SXGA|XGA|SVGA|VGA|CIF|QVGA|HQVGA|QQVGA
      }
      
      void handleNewMessages(int numNewMessages) {
        Serial.print("Handle New Messages: ");
        Serial.println(numNewMessages);
      
        for (int i = 0; i < numNewMessages; i++) {
          String chat_id = String(bot.messages[i].chat_id);
          if (chat_id != CHAT_ID){
            bot.sendMessage(chat_id, "Unauthorized user", "");
            continue;
          }
          
          // Print the received message
          String text = bot.messages[i].text;
          Serial.println(text);
          
          String from_name = bot.messages[i].from_name;
          if (text == "/start") {
            String welcome = "Welcome , " + from_name + "\n";
            welcome += "Use the following commands to interact with the ESP32-CAM \n";
            welcome += "/photo : takes a new photo\n";
            welcome += "/flash : toggles flash LED \n";
            bot.sendMessage(CHAT_ID, welcome, "");
          }
          if (text == "/flash") {
            flashState = !flashState;
            digitalWrite(FLASH_LED_PIN, flashState);
            Serial.println("Change flash LED state");
          }
          if (text == "/photo") {
            sendPhoto = true;
                  Serial.println("New photo request");
          }
        }
      }
      
      String sendPhotoTelegram() {
        const char* myDomain = "api.telegram.org";
        String getAll = "";
        String getBody = "";
      
        camera_fb_t * fb = NULL;
        fb = esp_camera_fb_get();  
        if(!fb) {
          Serial.println("Camera capture failed");
          delay(1000);
          ESP.restart();
          return "Camera capture failed";
        }  
        
        Serial.println("Connect to " + String(myDomain));
      
      
        if (clientTCP.connect(myDomain, 443)) {
          Serial.println("Connection successful");
          
          String head = "--electroniclinic\r\nContent-Disposition: form-data; name=\"chat_id\"; \r\n\r\n" + CHAT_ID + "\r\n--electroniclinic\r\nContent-Disposition: form-data; name=\"photo\"; filename=\"esp32-cam.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n";
          String tail = "\r\n--electroniclinic--\r\n";
      
          uint16_t imageLen = fb->len;
          uint16_t extraLen = head.length() + tail.length();
          uint16_t totalLen = imageLen + extraLen;
        
          clientTCP.println("POST /bot"+BOTtoken+"/sendPhoto HTTP/1.1");
          clientTCP.println("Host: " + String(myDomain));
          clientTCP.println("Content-Length: " + String(totalLen));
          clientTCP.println("Content-Type: multipart/form-data; boundary=electroniclinic");
          clientTCP.println();
          clientTCP.print(head);
        
          uint8_t *fbBuf = fb->buf;
          size_t fbLen = fb->len;
          for (size_t n=0;n<fbLen;n=n+1024) {
            if (n+1024<fbLen) {
              clientTCP.write(fbBuf, 1024);
              fbBuf += 1024;
            }
            else if (fbLen%1024>0) {
              size_t remainder = fbLen%1024;
              clientTCP.write(fbBuf, remainder);
            }
          }  
          
          clientTCP.print(tail);
          
          esp_camera_fb_return(fb);
          
          int waitTime = 10000;   // timeout 10 seconds
          long startTimer = millis();
          boolean state = false;
          
          while ((startTimer + waitTime) > millis()){
            Serial.print(".");
            delay(100);      
            while (clientTCP.available()) {
              char c = clientTCP.read();
              if (state==true) getBody += String(c);        
              if (c == '\n') {
                if (getAll.length()==0) state=true; 
                getAll = "";
              } 
              else if (c != '\r')
                getAll += String(c);
              startTimer = millis();
            }
            if (getBody.length()>0) break;
          }
          clientTCP.stop();
          Serial.println(getBody);
         
        }
        else {
          getBody="Connected to api.telegram.org failed.";
          Serial.println("Connected to api.telegram.org failed.");
        }
        return getBody;
        
      }
      
      void setup(){
        WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); 
        // Init Serial Monitor
        Serial.begin(115200);
      
        // Set LED Flash as output
        pinMode(FLASH_LED_PIN, OUTPUT);
        digitalWrite(FLASH_LED_PIN, flashState);
      
        // Config and init the camera
        configInitCamera();
      
        // Connect to Wi-Fi
        WiFi.mode(WIFI_STA);
        Serial.println();
        Serial.print("Connecting to ");
        Serial.println(ssid);
        WiFi.begin(ssid, password);
        clientTCP.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org
        while (WiFi.status() != WL_CONNECTED) {
          Serial.print(".");
          delay(500);
        }
        Serial.println();
        Serial.print("ESP32-CAM IP Address: ");
        Serial.println(WiFi.localIP()); 
      }
      
      void loop() {
        if (sendPhoto) {
          Serial.println("Preparing photo");
          sendPhotoTelegram(); 
          sendPhoto = false; 
          
        }
        if (millis() > lastTimeBotRan + botRequestDelay)  {
          int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
          while (numNewMessages) {
            Serial.println("got response");
            handleNewMessages(numNewMessages);
            numNewMessages = bot.getUpdates(bot.last_message_received + 1);
          }
          lastTimeBotRan = millis();
        }
      }
      

      I copied the camera pin and settings from the camera.ino example but atom craches after upload the code...

      ESP-ROM:esp32s3-20210327
      ESP-ROM:esp32s3-20210327
      Build:Mar 27 2021
      rst:0x3 (RTC_SW_SYS_RST),boot:0x3b (SPI_FAST_FLASH_BOOT)
      Saved PC:0x40376bf2
      SPIWP:0xee
      mode:DIO, clock div:1
      load:0x3fce2820,len:0x1150
      load:0x403c8700,len:0x4
      load:0x403c8704,len:0xc24
      load:0x403cb700,len:0x30b4
      entry 0x403c88b8
      ESP-ROM:esp32s3-20210327
      Build:Mar 27 2021
      rst:0x3 (RTC_SW_SYS_RST),boot:0x3b (SPI_FAST_FLASH_BOOT)
      Saved PC:0x40376bf2
      SPIWP:0xee
      mode:DIO, clock div:1
      load:0x3fce2820,len:0x1150
      load:0x403c8700,len:0x4
      load:0x403c8704,len:0xc24
      load:0x403cb700,len:0x30b4
      entry 0x403c88b8
      

      some tips?

      best regards

      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