This shows you the differences between two versions of the page.
iothings:proiecte:2022sric:surveillance [2023/06/02 08:08] ruxandra.grigorie |
iothings:proiecte:2022sric:surveillance [2023/06/02 09:57] (current) ruxandra.grigorie |
||
---|---|---|---|
Line 3: | Line 3: | ||
Grigorie Ruxandra - SRIC | Grigorie Ruxandra - SRIC | ||
- | Demo: [[https://www.canva.com/design/DAFkkIwiYsA/Pa3jRddZpZGIIisbDiHYRA/ | + | Demo: [[https://www.canva.com/design/DAFkkIwiYsA/Pa3jRddZpZGIIisbDiHYRA/edit?utm_content=DAFkkIwiYsA&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton]] |
- | editutm_content=DAFkkIwiYsA&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton]] | + | |
==== Project Description ==== | ==== Project Description ==== | ||
- | The purpose of this project is to have an ESP32CAM that can be remotely controlled to take and send a picture using a Telegram bot, and also to send a picture when motion is detected in front of the camera. | + | The purpose of this project is to have an ESP32CAM that can be remotely controlled to take and send a picture to the Telegram App, using a Telegram bot, and also to send a picture when motion is detected in front of the camera. |
==== Hardware Description ==== | ==== Hardware Description ==== | ||
Line 17: | Line 16: | ||
==== Software Description ==== | ==== Software Description ==== | ||
- | The main loop of the program checks after a fixed period if any command from the Telegram bot was issued. If the "/photo" command was received, a new photo will be taken using the ESP32CAM and sent to the telegram bot API. The main loop of the program also after a fixed period checks if the ultrasonic sensor detected movement, and if it did, it takes and sends a picture to the telegram bot API. | + | The main loop of the program checks after a fixed period if any command from the Telegram bot was issued. If the "/photo" command was received, a new photo will be taken using the ESP32CAM and sent to the telegram bot API using a POST HTTP request. The main loop of the program also checks after a fixed period if the ultrasonic sensor detected movement, and if it did, it takes and sends a picture to the telegram bot API. |
* **Telegram Bot init** | * **Telegram Bot init** | ||
Line 63: | Line 62: | ||
</code> | </code> | ||
* **Check if command was issued from Telegram bot** | * **Check if command was issued from Telegram bot** | ||
- | The code checks if a command was issued to the Telelgram bot, and if so, checks if the command was issued from the chad id that we configured as ours, in order to prevent others from issuing commands to our bot. If a valid command was issued, it is performed. | + | The code checks if a command was issued to the Telelgram bot, and if so, checks if the command was issued from the chat id that we configured as ours, in order to prevent others from issuing commands to our bot. If a valid command was issued, it is performed. |
<code> | <code> | ||
void handleNewMessages(int numNewMessages){ | void handleNewMessages(int numNewMessages){ | ||
Line 93: | Line 92: | ||
} | } | ||
</code> | </code> | ||
- | * **Telegram bot picture send** | ||
- | The code gets one frame from the OV2640 camera and sends it to the Telegram Bot. | ||
- | <code> | ||
- | String sendPhotoTelegram(){ | ||
- | const char* myDomain = "api.telegram.org"; | ||
- | String getAll = ""; | ||
- | String getBody = ""; | ||
- | camera_fb_t * fb = NULL; | ||
- | fb = esp_camera_fb_get(); | ||
- | if(!fb) { | ||
- | delay(1000); | ||
- | ESP.restart(); | ||
- | return "Camera capture failed"; | ||
- | } | ||
- | | ||
- | if (clientTCP.connect(myDomain, 443)) { | ||
- | String head = "--CSIoT\r\nContent-Disposition: form-data; name=\"chat_id\"; \r\n\r\n" + chatId + "\r\n--CSIoT\r\nContent-Disposition: form-data; name=\"photo\"; filename=\"esp32-cam.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n"; | ||
- | String tail = "\r\n--CSIoT--\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=CSIoT"); | ||
- | 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; | ||
- | long startTimer = millis(); | ||
- | boolean state = false; | ||
- | | ||
- | while ((startTimer + waitTime) > millis()){ | ||
- | 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(); | ||
- | } | ||
- | else { | ||
- | getBody="Connected to api.telegram.org failed."; | ||
- | } | ||
- | return getBody; | ||
- | } | ||
- | </code> | ||
==== Results ==== | ==== Results ==== |