ESP32 S3 Kamera - Foto an Telegram senden, wenn eine Bewegung erkannt wird

Dieses Tutorial zeigt Ihnen, wie Sie eine Sicherheitskamera bauen, die ein Foto an Ihr Handy sendet. Ein PIR-Bewegungssensor überwacht den Raum. Wenn jemand davor vorbeigeht, macht der ESP32 S3 ein Foto und sendet es Ihnen mit Telegram. Sie erhalten das Foto in wenigen Sekunden, überall auf der Welt.

ESP32 S3 Kamera - Foto an Telegram senden, wenn eine Bewegung erkannt wird

Was Sie bauen werden:

  1. Ihren eigenen Telegram-Bot, der Ihnen Nachrichten sendet
  2. Eine ESP32 S3 Kamera mit einem PIR-Bewegungssensor
  3. Ein Foto auf Ihrem Handy, jedes Mal wenn der Sensor eine Bewegung erkennt
  4. Eine Ruhezeit, damit Sie nicht 50 Fotos derselben Person erhalten

Erforderliche Hardware

1×ESP32 S3 N16R8 OV5640 Camera
1×(Alternativ) ESP32 S3 N16R8 OV2640 Camera
1×USB-Kabel Typ-A zu Typ-C (für USB-A PC)
1×USB-Kabel Typ-C zu Typ-C (für USB-C PC)
1×HC-SR501 Bewegungssensor
1×Verbindungskabel
1×(Empfohlen) Screw Terminal Expansion Board for ESP32 S3
1×(Empfohlen) Breakout Expansion Board for ESP32 S3
1×(Empfohlen) Power Splitter for ESP32 S3

Oder Sie können die folgenden Kits kaufen:

1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

※ Notiz:

Das ESP32 S3 Kamera-Board hat 40 Pins, aber der Schraubklemmenblock und das Breakout-Board haben 44 Pins. Sie funktionieren trotzdem zusammen. Setzen Sie das Kamera-Board in die Mitte des 44-Pin-Boards, sodass links 2 Pins und rechts 2 Pins frei bleiben.

Mit dem Schraubklemmenblock können Sie Drähte mit einem Schraubendreher anschließen, ganz ohne Löten. Das Breakout-Board bietet Ihnen einfache Stiftleisten für ein Steckbrett.

Überblick über Telegram

Telegram ist eine kostenlose Chat-Anwendung für Ihr Handy und Ihren Computer. Mit Telegram können Sie einen Bot erstellen. Ein Bot ist ein Roboter-Freund in Ihrer Chatliste. Ihr ESP32 S3 sendet das Foto an den Bot, und der Bot zeigt es Ihnen.

Sie benötigen zwei geheime Texte:

NameWas es istSieht so aus
Bot-TokenDas Passwort Ihres Bots8012345678:AAHxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Chat-IDDie Nummer Ihres Chats123456789

※ Notiz:

Zeigen Sie Ihr Bot-Token niemals jemandem und stellen Sie es niemals auf eine Website oder auf GitHub. Wer Ihr Token hat, kann Ihren Bot steuern.

Schritt 1: Erstellen Sie Ihren Bot

  1. Installieren Sie Telegram auf Ihrem Handy und erstellen Sie ein Konto.
  2. Suchen Sie in Telegram nach @BotFather. Er hat ein blaues Häkchen.
  3. Öffnen Sie den Chat mit BotFather und schreiben Sie ihm so:
Telegram
Telegram 12:45
Welcome to Telegram!
ArduinoBot 10:19
Chatting with Arduino...
telegram-botfather
BotFather Yesterday
Your bot has been created.
BotFather

BotFather

bot
Today
/newbot
10:15 AM ✓✓
Alright, a new bot. How are we going to call it? Please choose a name for your bot.
10:16 AM
My ESP32 Camera
10:17 AM ✓✓
Good. Now let's choose a username for your bot. It must end in bot.
10:18 AM
my_esp32_camera_bot
10:19 AM ✓✓
Done! Congratulations on your new bot. Use this token to access the HTTP API: 8012345678:AAHxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
10:20 AM
  1. Kopieren Sie das Bot-Token aus der letzten Nachricht und bewahren Sie es sicher auf.

Schritt 2: Finden Sie Ihre Chat-ID

  1. Suchen Sie in Telegram nach dem Namen Ihres neuen Bots und öffnen Sie den Chat.
  2. Senden Sie eine beliebige Nachricht an Ihren Bot, zum Beispiel hello. Dieser Schritt ist notwendig. Telegram erlaubt einem Bot nicht, Ihnen zu schreiben, bevor Sie ihm geschrieben haben.
Telegram
Telegram 12:45
Welcome to Telegram!
ArduinoBot 10:19
Chatting with Arduino...
telegram-botfather
BotFather Yesterday
Your bot has been created.

ArduinoBot

bot
Today
hello
10:15 AM ✓✓
  1. Öffnen Sie diese Adresse in Ihrem Webbrowser. Setzen Sie Ihr eigenes Bot-Token anstelle von <YOUR_BOT_TOKEN> ein:
https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates
  1. Der Browser zeigt einen langen Text. Suchen Sie nach "chat":{"id":. Die Zahl dahinter ist Ihre Chat-ID:
{ "ok": true, "result": [ { "update_id": 700000001, "message": { "message_id": 1, "from": { "id": 123456789, "first_name": "John" }, "chat": { "id": 123456789, "first_name": "John", "type": "private" }, "date": 1790000000, "text": "hello" } } ] }

※ Notiz:

Zeigt der Browser {"ok":true,"result":[]} ohne Inhalt an? Dann haben Sie Ihrem Bot noch keine Nachricht gesendet. Gehen Sie zurück zu Schritt 2, senden Sie hello an Ihren Bot und laden Sie die Adresse erneut.

※ Notiz:

Viele andere Tutorials empfehlen, den Bot @myidbot mit der Nachricht /getid zu fragen. Dieser Bot gehört jemand anderem und antwortet sehr oft überhaupt nicht. Die obige Webadresse funktioniert immer, weil sie Telegram direkt fragt.

※ Notiz:

Schritt 2 vergessen? Dann zeigt der ESP32 S3 die Antwort Forbidden: bot can't initiate conversation with a user im Seriellen Monitor. Öffnen Sie den Chat mit Ihrem Bot, senden Sie ihm eine beliebige Nachricht und versuchen Sie es erneut.

Schritt 3: Tragen Sie die Werte in den Code ein

Öffnen Sie den Code und ändern Sie diese vier Zeilen:

const char *WIFI_SSID = "YOUR_WIFI_SSID"; const char *WIFI_PASSWORD = "YOUR_WIFI_PASSWORD"; const char *BOT_TOKEN = "YOUR_TELEGRAM_BOT_TOKEN"; const char *CHAT_ID = "YOUR_TELEGRAM_CHAT_ID";

Überblick über PIR Motion Sensor

Ein PIR-Bewegungssensor erkennt die Wärme eines menschlichen Körpers. PIR bedeutet "Passive InfraRed" (passiv infrarot). Wenn sich ein warmer Körper davor bewegt, geht der OUT-Pin auf HIGH.

PIR-Bewegungssensor HC-SR501

Wichtige Spezifikationen

EigenschaftWert
Stromversorgung5V
Ausgang3,3V HIGH bei erkannter Bewegung, LOW wenn nichts erkannt wird
Reichweite3 bis 7 Meter (einstellbar)
Winkeletwa 110°
Aufwärmzeit30 bis 60 Sekunden nach dem Einschalten

Der Sensor hat zwei kleine orangefarbene Schrauben. Drehen Sie die Schraube für die Verzögerungszeit ganz nach links, sodass der Ausgang nur etwa 3 Sekunden lang HIGH bleibt.

Weitere Details zum Bewegungssensor finden Sie im Tutorial ESP32 S3 - Bewegungssensor. Um die Fotos auf einer microSD-Karte zu speichern, anstatt sie an Telegram zu senden, siehe das Tutorial ESP32 S3 Kamera - Foto auf SD-Karte speichern, wenn eine Bewegung erkannt wird.

Wiring Diagram between PIR Motion Sensor and ESP32 S3

Verbinden Sie den PIR-Bewegungssensor mit drei Jumper-Kabeln mit Ihrem ESP32 S3.

ESP32 S3 PIR-Bewegungssensor Telegram Schaltplan

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

PIR-Sensor PinESP32 S3 Pin
VCC5V
GNDGND
OUTGPIO21

Sicherheitshinweise

Der PIR-Sensor benötigt 5V an seinem VCC-Pin, nicht 3,3V. Mit 3,3V scheint er zu funktionieren, liefert aber falsche Signale. Sein OUT-Pin liefert 3,3V, was für den ESP32 S3 korrekt ist.

Die Kamera verwendet GPIO4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17 und 18. Verwenden Sie diese Pins nicht für den Sensor. GPIO21 ist frei, deshalb verwenden wir ihn.

Arduino IDE Einstellungen für die ESP32 S3 Kamera

Die Kamera funktioniert nicht mit den Standardeinstellungen der Arduino IDE. Sie müssen einige Punkte im Menü Tools ändern, bevor Sie den Code hochladen.

Menüpunkt in ToolsDiese Option wählen
BoardESP32S3 Dev Module
Flash Size16MB (128Mb)
PSRAMOPI PSRAM
Partition SchemeHuge APP (3MB No OTA/1MB SPIFFS)
CPU Frequency240MHz (WiFi)
USB ModeHardware CDC and JTAG
Upload ModeUART0 / Hardware CDC
Upload Speed921600
USB CDC On BootEnabled

※ Notiz:

PSRAM muss OPI PSRAM sein, und Partition Scheme muss Huge APP sein. Ändern Sie zuerst Flash Size, da sich danach die Liste der Partition-Scheme-Optionen ändert.

Wie man ein Foto an Telegram sendet

Sie müssen keine Bibliothek installieren. Der Code spricht direkt mit Telegram.

  • Telegram verwendet https, daher benötigen wir einen sicheren Client.
#include <WiFiClientSecure.h> WiFiClientSecure client; client.setInsecure(); // do not check the certificate of the Telegram server client.connect("api.telegram.org", 443);

※ Notiz:

setInsecure() bedeutet, dass der ESP32 S3 nicht prüft, wer der Server wirklich ist. Für ein kleines Heimprojekt ist das in Ordnung und spart viel Speicher. Das Foto wird trotzdem über eine verschlüsselte Verbindung gesendet.

  • Um ein Foto zu senden, verwenden wir die Telegram-Adresse /bot<TOKEN>/sendPhoto. Das Foto wird innerhalb einer Multipart-Nachricht übertragen. Eine Multipart-Nachricht besteht aus Teilen, und eine Textzeile namens Boundary trennt die Teile. Dieses Projekt verwendet drei Teile: die Chat-ID, den Text und das Foto.
String head = "--" BOUNDARY "\r\n"; head += "Content-Disposition: form-data; name=\"chat_id\"\r\n\r\n"; head += String(CHAT_ID) + "\r\n"; head += "--" BOUNDARY "\r\n"; head += "Content-Disposition: form-data; name=\"caption\"\r\n\r\n"; head += "Motion detected!\r\n"; head += "--" BOUNDARY "\r\n"; head += "Content-Disposition: form-data; name=\"photo\"; filename=\"photo.jpg\"\r\n"; head += "Content-Type: image/jpeg\r\n\r\n"; String tail = "\r\n--" BOUNDARY "--\r\n";

※ Notiz:

Der Teil caption ist der Text unter dem Foto in Telegram. Ändern Sie Motion detected! in eine beliebige Nachricht.

  • Die Content-Length muss die Größe von allem sein: dem ersten Teil, dem Foto und dem letzten Teil.
size_t totalLength = head.length() + fb->len + tail.length();

※ Notiz:

Eine falsche Content-Length ist der häufigste Fehler. Telegram wartet dann auf weitere Daten und antwortet nie.

  • Senden Sie das Foto in kleinen Stücken. Ein großes write() schlägt bei einer sicheren Verbindung oft fehl.
for (size_t i = 0; i < fb->len; i += 1024) { size_t piece = fb->len - i; if (piece > 1024) piece = 1024; client.write(fb->buf + i, piece); }
  • Lesen Sie die Antwort. Dieser Teil hat eine Falle. Telegram antwortet und schließt die Verbindung sofort, daher muss Ihr Code auch nach dem Schließen der Verbindung weiterlesen.
while (millis() - startTime < 15000) { while (client.available()) { answer += (char)client.read(); startTime = millis(); } if (answer.length() > 0 && !client.connected()) break; // the whole answer arrived and the server hung up delay(10); }

※ Notiz:

Eine Schleife der Form while (client.connected() && ...) sieht richtig aus, ist aber falsch. Telegram schließt die Verbindung sehr schnell, daher ist client.connected() oft schon false. Die Schleife läuft dann nie, und Sie verwerfen eine Antwort, die tatsächlich vorhanden ist. Der Serielle Monitor meldet, dass das Foto fehlgeschlagen ist, obwohl das Foto auf Ihrem Handy angekommen ist.

  • Wenn alles in Ordnung ist, enthält die Antwort von Telegram "ok":true.
if (answer.indexOf("\"ok\":true") > 0) { Serial.println("The photo was sent to Telegram"); }

※ Notiz:

Dieses Projekt verwendet eine kleine Bildgröße (FRAMESIZE_SVGA, 800×600), da ein kleines Foto viel schneller gesendet wird. Ein Foto mit 50 KB dauert etwa 3 Sekunden. Ein Foto mit 200 KB dauert etwa 10 Sekunden.

ESP32 S3 Code

Der folgende Code sendet jedes Mal ein Foto an Ihren Telegram-Chat, wenn der Sensor eine Bewegung erkennt. Die Ruhezeit beträgt 30 Sekunden. Um sie zu ändern, ändern Sie die Zeile #define QUIET_TIME 30000.

/* * Dieser ESP32 S3 Code wurde von newbiely.de entwickelt * Dieser ESP32 S3 Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/esp32-s3/esp32-s3-camera-send-photo-to-telegram-when-motion-detected */ #include <WiFi.h> #include <WiFiClientSecure.h> #include "esp_camera.h" const char *WIFI_SSID = "YOUR_WIFI_SSID"; // CHANGE IT const char *WIFI_PASSWORD = "YOUR_WIFI_PASSWORD"; // CHANGE IT const char *BOT_TOKEN = "1234567890:ABCDefGhIJKlmNoPQRsTUVwXYZ1234567890"; // CHANGE IT const char *CHAT_ID = "1234567890"; // CHANGE IT #define PIR_PIN 21 // the PIR motion sensor is connected to GPIO21 #define QUIET_TIME 30000 // wait 30 seconds before the next message (30000 milliseconds) // Camera pins of the ESP32-S3-N16R8 camera board. // The same pins work for the OV2640, OV3660 and OV5640 versions. #define PWDN_GPIO_NUM -1 #define RESET_GPIO_NUM -1 #define XCLK_GPIO_NUM 15 #define SIOD_GPIO_NUM 4 #define SIOC_GPIO_NUM 5 #define Y9_GPIO_NUM 16 #define Y8_GPIO_NUM 17 #define Y7_GPIO_NUM 18 #define Y6_GPIO_NUM 12 #define Y5_GPIO_NUM 10 #define Y4_GPIO_NUM 8 #define Y3_GPIO_NUM 9 #define Y2_GPIO_NUM 11 #define VSYNC_GPIO_NUM 6 #define HREF_GPIO_NUM 7 #define PCLK_GPIO_NUM 13 #define TELEGRAM_HOST "api.telegram.org" #define BOUNDARY "diyablesphoto" int lastPirState = LOW; unsigned long lastSendTime = 0; // Returns the name of the camera sensor that is installed on the board const char *getSensorName(int pid) { switch (pid) { case OV2640_PID: return "OV2640 (2 MP, max UXGA 1600x1200)"; case OV3660_PID: return "OV3660 (3 MP, max QXGA 2048x1536)"; case OV5640_PID: return "OV5640 (5 MP, max QSXGA 2592x1944)"; default: return "Unknown sensor"; } } bool initCamera() { 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_sccb_sda = SIOD_GPIO_NUM; config.pin_sccb_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; config.frame_size = FRAMESIZE_SVGA; // 800x600 - small, so it is sent quickly config.jpeg_quality = 12; // 0 to 63, a lower number means a better image config.fb_count = 1; config.fb_location = CAMERA_FB_IN_DRAM; config.grab_mode = CAMERA_GRAB_WHEN_EMPTY; if (psramFound()) { config.fb_location = CAMERA_FB_IN_PSRAM; config.jpeg_quality = 10; config.fb_count = 2; config.grab_mode = CAMERA_GRAB_LATEST; } else { config.frame_size = FRAMESIZE_QVGA; Serial.println("WARNING: PSRAM not found. Please set PSRAM to OPI PSRAM in the Tools menu."); } esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x\n", err); return false; } sensor_t *s = esp_camera_sensor_get(); Serial.printf("Camera sensor: %s\n", getSensorName(s->id.PID)); // Each sensor needs slightly different settings switch (s->id.PID) { case OV2640_PID: s->set_vflip(s, 0); s->set_hmirror(s, 0); break; case OV3660_PID: s->set_vflip(s, 1); // the OV3660 image is upside down by default s->set_brightness(s, 1); // make the image a little brighter s->set_saturation(s, -2); // make the colors a little softer break; case OV5640_PID: s->set_vflip(s, 0); s->set_hmirror(s, 0); break; default: break; } return true; } // Sends one photo to your Telegram chat bool sendPhotoToTelegram(camera_fb_t *fb) { WiFiClientSecure client; client.setInsecure(); // do not check the certificate of the Telegram server client.setTimeout(15); Serial.println("Connecting to Telegram..."); if (!client.connect(TELEGRAM_HOST, 443)) { Serial.println("Cannot connect to Telegram"); return false; } // The first part of the message: who receives the photo, and the text String head = "--" BOUNDARY "\r\n"; head += "Content-Disposition: form-data; name=\"chat_id\"\r\n\r\n"; head += String(CHAT_ID) + "\r\n"; head += "--" BOUNDARY "\r\n"; head += "Content-Disposition: form-data; name=\"caption\"\r\n\r\n"; head += "Motion detected!\r\n"; head += "--" BOUNDARY "\r\n"; head += "Content-Disposition: form-data; name=\"photo\"; filename=\"photo.jpg\"\r\n"; head += "Content-Type: image/jpeg\r\n\r\n"; // The last part of the message String tail = "\r\n--" BOUNDARY "--\r\n"; size_t totalLength = head.length() + fb->len + tail.length(); // Send the HTTP header client.print("POST /bot" + String(BOT_TOKEN) + "/sendPhoto HTTP/1.1\r\n"); client.print("Host: " TELEGRAM_HOST "\r\n"); client.print("Content-Type: multipart/form-data; boundary=" BOUNDARY "\r\n"); client.print("Content-Length: " + String(totalLength) + "\r\n"); client.print("Connection: close\r\n\r\n"); // Send the message client.print(head); // Send the photo in small pieces of 1024 bytes. // We check every piece. If one fails, Telegram would wait for ever. size_t sent = 0; for (size_t i = 0; i < fb->len; i += 1024) { size_t piece = fb->len - i; if (piece > 1024) piece = 1024; size_t written = client.write(fb->buf + i, piece); if (written != piece) { Serial.printf("Sending stopped after %u of %u bytes\n", (unsigned)(sent + written), (unsigned)fb->len); client.stop(); return false; } sent += written; } client.print(tail); // Read the answer of Telegram. // Do NOT stop when the connection closes. Telegram answers and closes at once, // and the answer is often still waiting in the buffer at that moment. String answer = ""; unsigned long startTime = millis(); while (millis() - startTime < 15000) { while (client.available()) { answer += (char)client.read(); startTime = millis(); } if (answer.length() > 0 && !client.connected()) break; // the whole answer arrived and the server hung up delay(10); } client.stop(); if (answer.length() == 0) { Serial.println("Telegram did not answer at all."); Serial.println("Check your internet, and check that your network does not block Telegram."); return false; } if (answer.indexOf("\"ok\":true") > 0) { Serial.println("The photo was sent to Telegram"); return true; } Serial.println("Telegram did not accept the photo. The answer was:"); Serial.println(answer); return false; } void takeAndSendPhoto() { camera_fb_t *fb = esp_camera_fb_get(); if (!fb) { Serial.println("Photo capture failed"); return; } Serial.printf("Photo taken: %u bytes\n", fb->len); sendPhotoToTelegram(fb); esp_camera_fb_return(fb); // give the memory back to the camera } void setup() { Serial.begin(115200); delay(1000); pinMode(PIR_PIN, INPUT); if (!initCamera()) { Serial.println("Stopped"); while (true) delay(1000); } WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.print("Connecting to WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.print("Connected. IP address: "); Serial.println(WiFi.localIP()); Serial.println("The PIR sensor is warming up. Please wait 30 seconds and do not move."); delay(30000); Serial.println("Ready. Waiting for motion..."); } void loop() { int pirState = digitalRead(PIR_PIN); // LOW to HIGH means the sensor has just seen a movement if (lastPirState == LOW && pirState == HIGH) { if (millis() - lastSendTime >= QUIET_TIME) { Serial.println("Motion detected!"); takeAndSendPhoto(); lastSendTime = millis(); } } lastPirState = pirState; }

Schnelle Schritte

  • Neu beim ESP32 S3? Absolvieren Sie zuerst unsere Anleitung Erste Schritte mit dem ESP32 S3.
  • Erstellen Sie Ihren Telegram-Bot und finden Sie Ihre Chat-ID. Siehe die Schritte oben.
  • Ziehen Sie das USB-Kabel ab und verdrahten Sie dann den PIR-Sensor wie in der Tabelle oben.
  • Drehen Sie die Schraube für die Verzögerungszeit des Sensors ganz nach links.
  • Kopieren Sie den obigen Code und fügen Sie ihn in die Arduino IDE ein.
  • Ändern Sie YOUR_WIFI_SSID, YOUR_WIFI_PASSWORD, YOUR_TELEGRAM_BOT_TOKEN und YOUR_TELEGRAM_CHAT_ID.
  • Ändern Sie die Einstellungen im Menü Tools. Siehe die Tabelle oben.
  • Kompilieren Sie den Code und laden Sie ihn auf das ESP32 S3 Board hoch, indem Sie in der Arduino IDE auf die Schaltfläche Upload klicken.
Arduino IDE Code hochladen
  • Öffnen Sie den Seriellen Monitor in der Arduino IDE.
Wie man den Seriellen Monitor in der Arduino IDE öffnet
  • Drücken Sie einmal die Taste RESET und verlassen Sie dann den Raum für 30 Sekunden. Der Sensor wärmt sich auf.
  • Kommen Sie zurück und gehen Sie vor der Kamera vorbei.
  • Schauen Sie auf Ihr Handy. Das Foto kommt in Ihrem Telegram-Chat an, mit dem Text darunter:
Telegram
Telegram 12:45
Welcome to Telegram!
ArduinoBot 10:19
Chatting with Arduino...
telegram-botfather
BotFather Yesterday
Your bot has been created.

ArduinoBot

bot
Today
Motion detected!
10:15 AM
ESP32 S3 Kamera Foto in Telegram

Serieller Monitor

Die folgenden Messwerte wurden im Jahr 2026 aufgezeichnet:

∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32S3 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32S3 Dev Module' on 'COM15')
New Line
9600 baud
[2026-09-23 13:00:01] Camera sensor: OV5640 (5 MP, max QSXGA 2592x1944) [2026-09-23 13:00:01] Connecting to WiFi... [2026-09-23 13:00:04] Connected. IP address: 192.168.0.2 [2026-09-23 13:00:04] The PIR sensor is warming up. Please wait 30 seconds and do not move. [2026-09-23 13:00:34] Ready. Waiting for motion... [2026-09-23 13:01:12] Motion detected! [2026-09-23 13:01:12] Photo taken: 51353 bytes [2026-09-23 13:01:12] Connecting to Telegram... [2026-09-23 13:01:15] The photo was sent to Telegram
Ln 11, Col 1
ESP32S3 Dev Module on COM15
2

Fehlerbehebung

Der Serielle Monitor zeigt Forbidden: bot can't initiate conversation with a user.

Sie haben Ihrem Bot nie geschrieben. Öffnen Sie Telegram, suchen Sie Ihren Bot und senden Sie ihm eine beliebige Nachricht. Drücken Sie dann RESET auf dem Board.

Der Serielle Monitor zeigt Unauthorized.

Ihr Bot-Token ist falsch. Kopieren Sie es erneut von BotFather. Das Token besteht aus zwei Teilen, die durch : verbunden sind, und Sie benötigen es vollständig.

Der Serielle Monitor zeigt chat not found.

Ihre Chat-ID ist falsch. Fragen Sie @myidbot erneut mit /getid. Setzen Sie keine Leerzeichen um die Zahl.

Der Serielle Monitor zeigt Telegram did not answer at all.

Das Board hat das Foto gesendet, aber nichts zurückbekommen. Prüfen Sie Ihre Internetverbindung. Manche Schul- und Firmennetzwerke blockieren Telegram, versuchen Sie es daher mit dem Hotspot Ihres Handys. Wenn das Foto auf Ihrem Handy ankommt, obwohl das Board einen Fehler meldet, stoppt Ihre Leseschleife zu früh. Siehe den Hinweis zu client.connected() oben.

Der Serielle Monitor zeigt Sending stopped after ... bytes.

Das WLAN ist abgebrochen, während das Foto gesendet wurde. Stellen Sie das Board näher an den Router oder verwenden Sie eine kleinere Bildgröße.

Der Serielle Monitor zeigt Cannot connect to Telegram.

  • Prüfen Sie, ob Ihr WLAN funktioniert. Die IP-Adresse muss im Seriellen Monitor erscheinen.
  • Manche Schul- und Firmennetzwerke blockieren Telegram. Versuchen Sie es mit dem Hotspot Ihres Handys.

Telegram antwortet nie, und das Board wartet.

Die Content-Length stimmt nicht mit der tatsächlichen Größe überein. Ändern Sie die Texte head und tail nicht, es sei denn, Sie ändern auch die Größe.

Das Foto dauert lange.

Verwenden Sie eine kleinere Bildgröße. FRAMESIZE_VGA (640×480) ist etwa halb so groß wie SVGA.

Der Sensor erkennt ständig eine Bewegung.

Warten Sie nach dem Start eine volle Minute, drehen Sie die Schraube für die Empfindlichkeit etwas nach links und prüfen Sie, ob VCC an 5V angeschlossen ist.

Ich erhalte zu viele Fotos.

Erhöhen Sie QUIET_TIME von 30000 auf 60000 (eine Minute).

Anwendungen

Eine ESP32 S3 Kamera mit Bewegungssensor und Telegram ist eine komplette Sicherheitskamera, die sehr wenig kostet und keine monatlichen Gebühren erfordert. Hier sind praktische Projekte, die Sie mit diesem Code bauen können:

  1. WLAN-Sicherheitskamera für zu Hause: Erhalten Sie ein Foto auf Ihr Handy, sobald jemand Ihr Haus, Ihren Flur oder Ihr Treppenhaus betritt.
  2. Paketlieferungs-Benachrichtigung: Erfahren Sie sofort, wenn der Zusteller an Ihre Tür kommt, und sehen Sie das abgelegte Paket.
  3. Babyzimmer-Monitor: Erhalten Sie ein Foto, wenn Ihr Kind nachts aus dem Bett steigt.
  4. Haustierkamera für Hunde und Katzen: Sehen Sie, was Ihr Haustier macht, während Sie bei der Arbeit sind, ohne für eine Cloud-Kamera zu bezahlen.
  5. Ferienhaus-Wächter: Überwachen Sie ein leeres Haus oder einen Zweitwohnsitz aus einem anderen Land.
  6. Garagen- und Einfahrtsalarm: Erhalten Sie ein Foto, wenn jemand in die Nähe Ihres Autos, Ihres Fahrrads oder Ihres Motorrads kommt.
  7. Büro und Geschäft nach Feierabend: Behalten Sie ein Foto von jeder Person, die sich nach Geschäftsschluss im Inneren bewegt.
  8. Garten- und Wildtierkamera: Fotografieren Sie Vögel, Katzen, Füchse oder die Tiere, die nachts Ihr Gemüse fressen.
  9. Hilfe bei der Seniorenbetreuung: Wissen Sie, dass sich ein Familienmitglied wie gewohnt im Haus bewegt, ohne dass den ganzen Tag eine Kamera läuft.
  10. Lagerhalle und Hoftor: Überwachen Sie einen Ort weit weg von Ihrem Haus, an dem eine verkabelte Alarmanlage zu teuer wäre.

Video Tutorial

Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.

Sehen Sie sich unten die Schritt-für-Schritt-Videoanleitung für dieses ESP32 S3 Projekt an.

Herausforderungen

  1. Einsteiger: Senden Sie eine Textnachricht mit dem Foto, zum Beispiel die Zeit seit dem Start des Boards.
  2. Fortgeschritten: Fügen Sie einen Schalter hinzu, der den Alarm ein- und ausschaltet, damit Sie keine Fotos erhalten, wenn Sie zu Hause sind.
  3. Profi: Speichern Sie zusätzlich jedes Foto auf der microSD-Karte, damit Sie eine Kopie behalten, auch wenn das Internet ausfällt.

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!