En el articulo anterior sobre el ESP32-CAM vimos cuales son los primeros pasos para comenzar a utilizarlo y como obtener imágenes desde el dispositivo con un sencillo script en Python; en esta ocasión veremos como tomar fotos y subirlos a una carpeta de Google Drive de manera de que nos sirva de punto de partida para otras aplicaciones.
El primer paso consiste en utilizar el script de Google para construir un sencillo programa que reciba la imagen y la almacene dentro de una carpeta determinada, para ello debemos ir a Google Drive – Nuevo – Más – Google Apps Scripts
Se va a presentar un editor para que escribamos el código como el siguiente::
Reemplazaremos el contenido total por el siguiente Reem:
function doPost(e) {
var data = Utilities.base64Decode(e.parameters.data);
var nombreArchivo = Utilities.formatDate(new Date(), "GMT-3", "yyyyMMdd_HHmmss")+".jpg";
var blob = Utilities.newBlob(data, e.parameters.mimetype, nombreArchivo );
var folder, folders = DriveApp.getFoldersByName("ESP32-CAM");
if (folders.hasNext()) {
folder = folders.next();
} else {
folder = DriveApp.createFolder("ESP32-CAM");
}
var file = folder.createFile(blob);
return ContentService.createTextOutput("Completo.")
}
El programa lo que hace es recibir tres parámetros:
1. La data en si, que consiste en la imagen, codificada en base64
2. El tipo de dato que se envía, en este caso sera image/jpeg
3. También recibe el nombre del archivo, aunque no lo utilizamos porque tomamos la fecha y hora para darle el nombre, de manera que quede organizado.
El paso siguiente es guardar el script y publicarlo como aplicación web, esto ultimo lo hacemos desde Publicar – Implementar como aplicación web; debemos elegir que se ejecute como nuestro usuario y que cualquier persona incluso los anónimos tengan acceso a la aplicación; luego confirmamos las opciones que se nos presenta.
En la ultima opción Google nos mostrar una url donde estará publicada nuestra aplicación; debemos copiar esta url, la utilizaremos en el programa del ESP32-CAM.
La url provista tendra el siguiente formato:
https://script.google.com/macros/s/XXXXXXXXXXXXXX/exec
Donde las XXXXXXXXXXXXXX serán reemplazadas por una secuencia alfanumérica que identifica a la aplicación.
En este punto estamos listos para cargar el programa en el ESP32-CAM, crearemos un nuevo programa con el IDE de Arduino llamado ESP32-CAM_Drive, de manera que nos cree la carpeta donde esta el archivo ESP32-CAM_Drive .ino; en dicha carpeta copiaremos los archivos Base64.cpp y Base64.h.
Dentro del archivo ESP32-CAM_Drive.ino al comienzo debemos reemplazar tres parámetros importantes: el nombre y contraseña de la red WiFiy la url del script que creamos anteriormente.
const char* ssid = "SSID"; //your network SSID
const char* password = "PASSWORD"; //your network password
String myScript = "/macros/s/XXXXXXXXXXXXXX/exec"; //Replace with your own url
La lineas anteriores debemos reemplazar el código por los propios.
Para cargar el programa puede repasar el articulo anterior o ver video. Luego que se cargue el programa, desconectamos el GND de IO0 y reiniciamos el ESP32, al cabo de unos instantes se conectara a la red inalambrica, obtendra la foto y la subira al Drive, si vemos en el Monitor serie veremos algo similar a esto:
El programa creara una carpeta llamada ESP32-CAM dentro de Google Drive y en la misma guardara las imagenes, si revisamos la carpeta tendremos las fotos que saco el dispositivo:
Pueden encontrar el repositorio en GitHub.
Hi i read your blog and tested the code you have made but i am getting issue connecting to script it takes long time also with script there is 84 % of error rate to write. i am getting error of no function found for doGet in script.
Hello, thanks for writing. The function is doPost not doGet maybe thats the problem. About the time it takes me to connect to the script, I have the same problem with an ISP, then I tried another and everything was fine.
Gracias por este tutorial. Es justo lo que andaba buscando y ha funcionado sin problemas. Lo utilizaré para foto-trampeo de animales en el campo.
Solo lo he probado con personas y un detector de movimiento RCWL. Mas adelante lo probaré en el campo
Muchas gracias Julio! Espero tus comentarios de que tal te fue en la prueba de campo. Saludos!
Hola tocayo. He probado tu sket y al momento de ejecutarse me da el siguiente error:
STAIP address:
192.168.1.19
[E][camera.c:1049] camera_probe(): Detected camera not supported.
[E][camera.c:1249] esp_camera_init(): Camera probe failed with error 0x20004
Camera init failed with error 0x20004ets Jun 8 2016 00:22:57
Alguna sugerencia? Mi módulo ESp32-cam está bien porque lo he probado con otro sketch.
Saludos
Hola, aparentemente por el código de error la cámara definida no es la misma que tiene el modulo (puede variar de versión/modelo) tendrías que definirla con la linea.
#define CAMERA_MODEL_AI_THINKER (para mi casa en particular)
Otra cosa que podrías probar con otra resolución reemplazando FRAMESIZE_VGA por FRAMESIZE_CIF o FRAMESIZE_QVGA.
Saludos!
Probé con otro módulo idéntico y ya funciona.
Luego quise cambiar la resolución a XVGA y me salió error Allocating 153 KB Frame Buffer failed
Al parecer estás usando los parametros del modulo equivocado
En el módulo que falla le cambié la cámara y se solucionó el problema de cámara no soportada.
Aún no tengo claro como cambiar la resolución para que no me salga error Allocating 153 KB Frame Buffer failed.
Pero un problema recurrente es que trabaja por un rato, luego intenta enviar una foto a Google Drive, se queda un rato en Waiting for response y termina con No response.
Aumenté el tiempo de 60 a 120 segundos sin resultados.
@Guillermo Leon, yo tengo el mismo problema que tu de no recibir respuesta de Google Drive y quisiera saber si has encontrado alguna forma de resolverlo. En caso afirmativo te pido, por favor, que lo compartas.
Por otro lado talvez @Guillermo Original (autor del excelente articulo) nos puede ayudar…
Gracias por anticipado
Hola muy buenas Guillermo, era justo lo que estaba buscando, pero me surge una duda. Estoy terminando un proyecto, y tengo en arduino conectado un acelerómetro, que cuando mide una cierta aceleración, mande un pulso al esp32 cam, y ejecute el código que usted ha subido (lo he cambiado para que haga fotos cada 5 segundos en vez de 60). No me sale como hacer que al mandar el pulso ejecute el srcipt, ¿sabría usted como podría hacerlo para que se active el script cuando mande el pulso? muchas gracias.
Se me ocurre que en lugar de tener delay en el metodo loop; tendrias que tomar la variable donde tener la aceleración y si supera cierto humbral llamar a la funcion saveCapturedImage() para que saque la foto y la suba a gdrive. Saludos!
Hola .. buen tutorial
Gracias por compartirlo
Hola Guillermo .. como puedo hacer para ver el video el tiempo real y simultáneamente enviar fotos periódicas Google Drive .. el programa me arroja STAIP address 192.168.1.14 pero el navegadro me arroja un error.
He probado con la transmision típica de la cámara (Video Streaming Web Server) y si funciona
Quisiera hacer lo mismo pero subiendo las imágenes a Dropbox
Hola, no utilizo Dropbox por lo que no te puedo guiar, pero deberías revisar si tienen publicada la API y como funciona. Saludos!
Hi Guillermo,
Thanks, it works, pretty cool.
Laszlo
Hola! Yo no tiengo librerias WifiClientSecure.h , soc/soc.h , soc/rtc_cntl_reg.h , esp_camera.h donde puedo descargarlas? Yo he tenido difficultad a encuentrarlas en internet.
Revisar este post: https://www.gsampallo.com/2019/09/24/esp32-cam-primeros-pasos-y-algo-de-python/ adicionalmente revisa que hayas seleccionado bien el tipo de microcontrolador, debe ser ESP32 Wrover Module. Saludos.
Hola y gracias por tu programa que funciona muy bien y que es muy útil para mí. Sin embargo, tengo un pequeño problema: parte de la imagen no está (o está mal) descargada en UXGA (o incluso en XGA). Tal vez un problema con la codificación, pero o la memoria tmapon, pero no puedo encontrar dónde. En cualquier caso, gracias y mucha suerte.
Me sucede lo mismo que Xavier, al subir la resolución por sobre SVGA parte de la imagen que sube a Drive se ve en gris (como que se completa un buffer). Aún estoy analizando el tamaño máximo de los archivos que suben completos.
Muchas gracias por el artículo.
Hallo tolles Projekt leider bekomme als Antwort
Connecting to MOVISTAR_96E1
.
STAIP address:
192.168.1.45
Connect to script.google.com
Connection successful
Waiting for response.
…..++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
HTTP/1.1 401 Unauthorized
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Date: Mon, 04 Jan 2021 08:09:14 GMT
Content-Type: text/html; charset=utf-8
Referrer-Policy: origin
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Server: GSE
Alt-Svc: h3-29=»:443″; ma=2592000,h3-T051=»:443″; ma=2592000,h3-Q050=»:443″; ma=2592000,h3-Q046=»:443″; ma=2592000,h3-Q043=»:443″; ma=2592000,quic=»:443″; ma=2592000; v=»46,43″
Accept-Ranges: none
Vary: Accept-Encoding
Transfer-Encoding: chunked
Ich habe als Test ein HTML mit Java script geschrieben um das ganze zu testen und das funktioniert auch super, eine Idde
Liebe grüße aus Mallorca und ein tolles 2021
Hallo tolles Projekt ich mußte in google script in Publish die Einstellung von anyone to anyone even anoymous ändern
Hello dude,
Have you got find the solution ?
TypeError: Cannot read property ‘parameters’ of undefined
please help me solve this, this is my first time with apps script and esp32 cam.
Thankyou in advance <3
Saludos
me sale este error y nó sé porqué… hice todos los pasos
Ayúdenme por favor…
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371
ets Jun 8 2016 00:22:57
rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6388
entry 0x400806b4
Connecting to HUAWEIT
…..
STAIP address:
192.168.15.170
Connect to script.google.com
Connected to script.google.com failed.
Connect to script.google.com
Connected to script.google.com failed
.
.
.
Hola,
Muchas gracias por toda la info que publicas.
Estoy probando el codigo y me da el siguiente error
Connect to script.google.com
Connected to script.google.com failed.
Que estoy haciendo mal?
Gracias!!!
Hola, muchas gracias por el video. Una consulta, cuando subo el codigo a mi ESP32 CAM M5STACK me tira este error «Connected to script.google.com failed.»
Para todos que reciben el error » Connected to script.google.com failed» : es suficiente anadir
client.setInsecure();
despues de «WiFiClientSecure client;»
Espero que esto pueda ayudar alguien!
Excelente! Gran aporte.
Muy interesante y útil el video. Lo he intentado implementar pero me sale el siguiente error al compilarlo: esp32cam-gdrive:8:7: error: expected unqualified-id before ‘.’ token
Client.setInsecure(); //agregado da error con minúscula
Can anyone upload images with higher resolution than SVGA and quality=10?
When I use higher resolution the image is not uploaded to google drive and I get some encoding error as response.
Hi
I have a problem when I try to upload image with higher resolution than VGA.
The image is simple not accepted when uploading to google drive, I get some encoding error message.
Does anyone know about this problem and is it a ESP32 problem or a problem with the POST function in google apps script?
Hola, muy buen video.
Estoy intentanto replicar este proyecto pero me encontre con un problema en el codigo de arduino.
Me sales el siguiente error:
‘base64_enc_len’ was not declared in this scope
Hola, muy bueno el tutorial la verdad.
Alguien ha conseguido de alguna manera subir videos a google drive desde ESP32 Cam?
Saludos y gracias.
Hola! Las funcionalidades implementadas están excelentes, así como toda la explicación.
Qué se tendría que modificar para subir otros tipos de archivos (por ejemplo: audios que un ESP32 está grabando y almacenando en un tarjeta SD)? Mi duda es la modificación de la codificación del archivo y la subida a Drive