Esp32cam FTP upload

Hallo,
hat schon einer mit der ESp32cam einen FTP Upload auf einen Webserver gemacht?
Die Kamera hab ich jetzt am laufen. Aber wie ich den Upload mache weiß ich nicht.
Also bin da noch absoluter Neuling.
Habe schon den ganzen Abend im Netz nach Beispielen gesucht. Aber nichts gefunden.
Danke

Hallo,

Lordcyber:
hat schon einer mit der ESp32cam einen FTP Upload auf einen Webserver gemacht?

Ich hatte da auch mal gesucht und wenig zum FTP-Client gefunden.
Der angehängte Sketch ist ein Experiment, ich habe da lange nicht weitergemacht.
Prinzipiell lief es so, war aber noch nicht langzeitstabil.

FTP-Connect wird "zu Fuß" aufgebaut und dann das Bild aus dem SPIFFS gespeichert.
Ohne Zwischenspeichern würde auch gehen, habe ich aber noch nicht eingebaut...
Die Camera schläft, wacht alle x Minuten auf, macht ein Bild, spiehcert das und legt es dann im FTP-Ordner ab.
Vielleicht gibt es Dir ein paar Ansätze.

Gruß aus Berlin
Michael

Web-Mini-Cam-FTP-Timer-PIR.ino (13 KB)

Hallo,
danke werde ich versuchen.
Es soll bei mir zur Wetterstation auch ein Bild senden.
Daher reicht alle 5 Minuten DEEPSleep brauche ich nicht.
Da die Wetterstation per Timerchip den Strom bekommt. und damit auch der Strom der ESPCAM wegfällt.

Hört sich interessant an. Halte uns auf dem laufenden, wenn du es fertig hast.

Hallo,
Leider macht er mit deinem Code garnichts.
Startet nicht mal.
Kommt nur:

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_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:1100
load:0x40078000,len:9232
load:0x40080400,len:6400
entry 0x400806a8

Hier mal mein Code der als Weserver funktioniert:

#include "esp_camera.h"
#include <WiFi.h>
#include <WiFiclient.h>

//
// WARNING!!! Make sure that you have either selected ESP32 Wrover Module,
//            or another board which has PSRAM enabled
//

// Select camera model
//#define CAMERA_MODEL_WROVER_KIT
//#define CAMERA_MODEL_M5STACK_PSRAM
#define CAMERA_MODEL_AI_THINKER

const char* ssid = "FRITZ!Box 7530 MP";
const char* password = "XXXXXXXXXXXXXX";


#if defined(CAMERA_MODEL_WROVER_KIT)
#define PWDN_GPIO_NUM    -1
#define RESET_GPIO_NUM   -1
#define XCLK_GPIO_NUM    21
#define SIOD_GPIO_NUM    26
#define SIOC_GPIO_NUM    27

#define Y9_GPIO_NUM      35
#define Y8_GPIO_NUM      34
#define Y7_GPIO_NUM      39
#define Y6_GPIO_NUM      36
#define Y5_GPIO_NUM      19
#define Y4_GPIO_NUM      18
#define Y3_GPIO_NUM       5
#define Y2_GPIO_NUM       4
#define VSYNC_GPIO_NUM   25
#define HREF_GPIO_NUM    23
#define PCLK_GPIO_NUM    22

#elif defined(CAMERA_MODEL_M5STACK_PSRAM)
#define PWDN_GPIO_NUM     -1
#define RESET_GPIO_NUM    15
#define XCLK_GPIO_NUM     27
#define SIOD_GPIO_NUM     25
#define SIOC_GPIO_NUM     23

#define Y9_GPIO_NUM       19
#define Y8_GPIO_NUM       36
#define Y7_GPIO_NUM       18
#define Y6_GPIO_NUM       39
#define Y5_GPIO_NUM        5
#define Y4_GPIO_NUM       34
#define Y3_GPIO_NUM       35
#define Y2_GPIO_NUM       32
#define VSYNC_GPIO_NUM    22
#define HREF_GPIO_NUM     26
#define PCLK_GPIO_NUM     21

#elif defined(CAMERA_MODEL_AI_THINKER)
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27

#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22

#else
#error "Camera model not selected"
#endif

void startCameraServer();

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  Serial.println();

  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_JPEG;
  //init with high specs to pre-allocate larger buffers
  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);
    return;
  }

  //drop down frame size for higher initial frame rate
  sensor_t * s = esp_camera_sensor_get();
  s->set_framesize(s, FRAMESIZE_QVGA);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  startCameraServer();
  
  Serial.print("Camera Ready! Use 'http://");
  Serial.print(WiFi.localIP());
  Serial.println("' to connect");
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(10000);
}

Hallo,

Lordcyber:
Hallo,
Leider macht er mit deinem Code garnichts.
Startet nicht mal.

Ich habe den Kram jetzt mal rausgesucht...
Meldet sich bei mir auch mit dem Code, den ich angehängt hatte noch.

Mit den falschen WLAN-Daten:

rst:0x1 (POWERON_RESET),boot:0x16 (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:1100
load:0x40078000,len:9232
load:0x40080400,len:6400
entry 0x400806a8
Boot number: 1
Wakeup was not caused by deep sleep: 0
Setup ESP32 to sleep for every 180 Seconds
Wifi connect............................

Da müßte noch ein timeout rein wenn er das WLAN nicht findet, so bleibt er da in einer Endlos-Warteschleife...

Mit gültigen WLAN-Daten:

Boot number: 1
Wakeup was not caused by deep sleep: 0
Setup ESP32 to sleep for every 180 Seconds
Wifi connect............
Connected to wifirouter
IP address: 192.168.0.121
Cam Init ok
Bild.jpg
Command connected
Command disconnected
Going to sleep now

Fehlerabfrage bei fehlgeschlagegen FTP-connect fehlt auch noch, er schickt das dann nach "weißen Sand"...

Da habe ich im angehängten Sketch leider was ungeprüft geändert, das müßte Du zurückändern:

// FTP
#define FTP_USER username                       <----- Zeile löschen
#define FTP_PASS password                       <----- Zeile löschen
IPAddress ftpserver( 192, 168, 0, 6 );
uint16_t ftpport = 21;

und weiter unten bei

#define FTP_ANZAHL 4
String ftp_comm[] = {"USER FTP_USER","PASS FTP_PASS","SYST","Type I"};
String ftp_ret[] = {"331","230","215","200"};

statt FTP_USER und FTP_PASS username und passwort für den FTP direkt reinschreiben.

Wenn Du oben #define DEBUG_FTP true setzt, bekommst auch den Verbindungsaufbau zum FTP:

Command connected
220---------- Welcome to Pure-FTPd [TLS] ----------
220-You are user number 1 of 10 allowed.
220-Local time is now 11:33. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Return: 220
USER aaaaaa
331 User aaaaaa OK. Password required
Return: 331
PASS bbbbbb
230 OK. Current restricted directory is /
Return: 230
SYST
215 UNIX Type: L8
Return: 215
Type I
200 TYPE is now 8-bit binary
Return: 200
PASV
227 Entering Passive Mode (192,168,0,6,242,244)
Return: 227
192
168
0
6
242
244
Datenport: 62196
Data connected
CWD ftp/ESP32
250 OK. Current directory is /ftp/ESP32
Return: 250
PIR_CAM_00001.jpg
STOR PIR_CAM_00001.jpg
150 Accepted data connection
Return: 150
Writing...OK
Data disconnected
Command disconnected
Going to sleep now

Ich sollte damit vielleicht mal weitermachen, soll ja auch nur als "Wettercam" dienen.

Ich hoffe mal, wir nutzen das gleiche Modul, bei mir steht nur OV2640_V05 drauf, ist das mit PIR und OLED.

Gruß aus Berlin
Michael

Michael

Ok Danke werde ich mal versuchen.
Ich hab diese Kamera hier. Das ist eine andere.
Esp32cam

Die wird in ein Ausgeschlachtetes Dummy DOM Kameragehäuse gebaut.

Ich versuch mal aus deinem Code schlau zu werden und in meinen einzubauen.
Wie ich gesehen habe hast du alle Einstellungen im Code und nicht wie ich über Webserver.
Das werde ich auch ändern. DA er ja nur Kurz laufen soll.

Ah Mist gerade gesehen das mein Code mehr wie eine Seite hat. Das ist alles in anderen Seiten. NAja mal sehen wie ich es ans laufen bekomme. Webserver usw brauche ich ja nicht.

Hallo,

Lordcyber:
Ok Danke werde ich mal versuchen.
Ich hab diese Kamera hier. Das ist eine andere.
Esp32cam

Ich versuch mal aus deinem Code schlau zu werden und in meinen einzubauen.
Wie ich gesehen habe hast du alle Einstellungen im Code und nicht wie ich über Webserver.
Das werde ich auch ändern. DA er ja nur Kurz laufen soll.

Ah Mist gerade gesehen das mein Code mehr wie eine Seite hat. Das ist alles in anderen Seiten. NAja mal sehen wie ich es ans laufen bekomme. Webserver usw brauche ich ja nicht.

ok, dieses Cam-Modul habe ich auch ier, müßte ich aber erst suchen...
Anbei mal der Sketch für alle 3 Varianten der Cam, die ich hierhabe.
Deine ist das Ai-Thinker-Modul, ist auch erstmal im #define so eingestellt.

Webserver usw. habe ich nicht eingebaut weil das Ding mal draußen laufen soll und ich die meine Einstellungen da sowieso nicht ändere. Wenn doch, muß ich sie eben neu flashen...

Kann man alles einbauen, ich wollte aber erstmal den FTP-Kram zum Laufen bekommen und klären, ob es an meinem Solar-Akkumodul klappt.

Gruß aus Berlin
Michael

Web-Mini-Cam-FTP-Timer-Alle.ino (14 KB)

Danke,
da es alles bei mir auf dem Balkon ist kann ich zur Not Akkus Tauschen.
Aber ich denke 5 WAtt 1A Sollten reichen.

Ich überlege gerade sogar 2X18650 2500mah zu nehmen.
Durch den INA219 sehe ich ja wenn es knapp wird.

Werde eh das ganze dann Dokumentieren und auf meien Homepage stellen.

Juhu Upload Funktioniert.

So laufen tut es. Aber hab doch noch ein paar fragen:

  1. Wie kann der aufwachen ohne die Brücke zu Reset? bin gerade verwundert.

  2. Ich brauche ja den Dateinamen nicht fortlaufend. Da es ja auf die Homepage kommt. hab mal versucht zu ändern aber wenn ich

String dateiname = String(wake_reason, DEC) + "_" + BILDNAME  + ".jpg";

abändere kommt ein fehler.
Wie du siehst hab ich zumindest die Bildnummer schon weg.

  1. Das Bild der Kamera stimmt nicht. Ichhab schon herausbekommen das es am AWB GAIN und WB MODE liegt WB Mode sollte auf Auto stehen. Dann stimmt das Bild.
    Wenn ich aber den Code anpasse:
//  res = s->set_special_effect(s, val);                  // Special Effekt 
//  res = s->set_wb_mode(s, val);                         // WB Mode         (Auto/Sunny/..)

auf

//  res = s->set_special_effect(s, val);                  // Special Effekt 
//  res = s->set_wb_mode(s, Auto);                         // WB Mode         (Auto/Sunny/..)

bekomem ich ebenfalls fehler.

Danke

Hallo,

Lordcyber:
So laufen tut es. Aber hab doch noch ein paar fragen:

  1. Wie kann der aufwachen ohne die Brücke zu Reset? bin gerade verwundert.

Erstmal schön zu hören daß es überhaupt so läuft.
Es war nur ein Experiment, an dem ich seit Mai nichts weiter gemacht hatte...

zu 1. Die Brück braucht nur ein ESP8266 wegen eines internen Fehlers beim Sleep-Mode.
Beim ESP32 ist da alles in Ordnung, der kann auch verschiedene Events z.B. an den I/Os geweckt werden, habe ich bei der PIR-Geschichte zumindest getestet.

zu 2. und 3.: verrate mir mal die Fehlermeldungen...

Bei den Kamera-Parametern hatte ich nur soweit nötiges gestzt, um ein Bild zu bekommen.
Es gibt da auch ein paar Abhängigkeitten bei den Parametern. Das kann man mit dem Camara-Demo aus den ESP32/Camera-Beispielen zumindest durchspielen.
Außerdem habe ich hier inzwischen 3 verschiedene Kamera-Module, die man teilweise nur am Aufdruck auf dem Filienleiter der Kamera unterschieden kann. Prinzipiell sind die direkt austauschbar, allerdings gibt es Unterscheide bei den Objektiven und damit den sinnvollen Parametern.

Du kannst ja mal schreiben, was auf Deinem Modul steht. Ich suche mal das Ai-Thinker-Modul raus und das apssende Kamera-Modul, wird aber erst irgendwann heute oder auch morgen pasieren, dann kann ich Dine Geschichte ja erstmal nachvollziehen.

Gruß aus Berlin
Michael

Wenn ich:

//String dateiname = String(wake_reason, DEC) + "_" + BILDNAME + bildnummer + ".jpg";

ändere zu:

String dateiname = String BILDNAME  + ".jpg";

zeit er mir einen Fehler zu:

#define BILDNAME "Webcam_Balkon"

SO der Fehler ist weg es musste:

String dateiname = String(BILDNAME) + ".jpg";

lauten.

BEi 3 kommt:
exit status 1
'Auto' was not declared in this scope

Ich ZEichne gerade ein Gehäuse dür den 3D Drucker. Mal sehen wie es aussieht wenn ich es Drausen teste. Drinne hat das Bild so einen GElbstich. Wenn ich den Webserver code wo man alle seinstellen kann verwende und auf WB Auto stelle stimmt da das Bild.

Auf dem Modul steht: ESP32-cam DM DIY MORE www.diymore.cc
Ist auch dieses Modul: ESP32-cam

ESP32-S AI-Thinker mit OV2640 Camera Module

Hallo :slight_smile:
ich suchte auch nach einer Möglichkeit mit der ESP32Cam(CAMERA_MODEL_AI_THINKER) einen FTP Upload zum machen und fand diesen Treat.
Meine Wetterstation ist bei WunderGround und ich suche nach einer Möglichkeit Bilder hochzuladen.
Danke für das teilen eures Codes. - :slight_smile:
Leider bin ich mit dem Programieren nicht so fit, daher habe ich nun nach dem aufgespielt einige Fragen. Hoffe Ihr könnt mir da helfen.
Ich habe diesen Code "Web-Mini-Cam-FTP-Timer-Alle" genommen und an mein Netz angepasst.
Im Serial kann ich sehen das die Cam erkannt wird,sie sich mit meinem Netz verbindet, im "DEBUG_FTP true" sehe ich das der Weg zum FTP Server gefunden wird .
Letzte Meldung ist dann "Going to sleep now"

Fragen 1. wie hole ich die Cam aus dem Tiefschlaf ? an welchen Pin muss ich den Pegel ändern
2. In dem Code ist die rede von "ESP_SLEEP_WAKEUP_TIMER" wo ist das definiert ? finde ich leider nicht
3. ... weitere Fragen kommen bestimmt noch...
Danke für Eure Hilfe

Hallo,
die Brücke des Deepsleep brauchst du beim 32 er nicht. Der hat die schon.
Hier mal mein Aktueller Code.
Leider habe ich das Problem das es ungefähr 3 Stunden funktioniert dann nicht mehr.
Ich denke aber das lag eher daran das meiner zu warm geworden ist. DA ich die Stromquelle noch nicht so hatte wie ich wollte.

Der klappt bei mir: Mußt Theoretisch nur auf deine Daten abändern.

Web-Mini-Cam-FTP-Timer-Alle - Kopie.ino (14.6 KB)

Sleep Timer ist unter:

// DeepSleep Timer
#define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds /
#define TIME_TO_SLEEP 300 /
Time ESP32 will go to sleep (in seconds) */

Hallo Lordcyber

Danke für die schnellen Antworten, ich werde deinen Code bei mir testen.
Habe ich das jetzt richtig verstanden, das die Cam nach 300 Sec von selbst wieder angeht ?

Genau. Ergibt somit 5 Minuten.

Code ist aufgespielt, aber es wird kein Bild per FTP auf dem Nas gespeichert.
wo könnte der Fehler liegen ?

im Serial Monitor steht :

Boot number: 7
Wakeup caused by timer
Setup ESP32 to sleep for every 30 Seconds
Wifi connect..
Connected to FRITZ-WA-GAS
IP address: 192.168.178.42
Cam Init ok
Bild.jpg
Command connected
Command disconnected
Going to sleep now


mit FTP Debug

Cam Init ok
Bild.jpg
Command connected
220---------- Welcome to Pure-FTPd [TLS] ----------
220-You are user number 1 of 5 allowed.
220-Local time is now 17:04. Server port: 21.
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Return: 220
AnonymusFTP
530 You aren't logged in
Return: 530
Command disconnected
Going to sleep now
ets Jun 8 2016 00:22:57

rst:0x5 (DEEPSLEEP_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:1100
load:0x40078000,len:9232
load:0x40080400,len:6400
entry 0x400806a8
Boot number: 2
Wakeup caused by timer
Setup ESP32 to sleep for every 30 Seconds
Wifi connect..
Connected to FRITZ-WA-GAS
IP address: 192.168.178.42
Cam Init ok
Bild.jpg
Command connected
220---------- Welcome to Pure-FTPd [TLS] ----------
220-You are user number 1 of 5 allowed.
220-Local time is now 17:04. Server port: 21.
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Return: 220
AnonymusFTP
530 You aren't logged in
Return: 530
Command disconnected
Going to sleep now


530 You aren't logged in

sagt doch den Grund.

Gruß Tommy

Hallo Tommy
Ja habe ich auch gelesen, dachte das kommt weil er in den Schlafmode wechselt.