🤖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

    Atom
    1
    1
    40
    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 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
      • First post
        Last post