ESP32 S3 Kamera - Foto an Telegram senden, wenn die Tür geöffnet wird

Dieses Tutorial zeigt Ihnen, wie Sie mit dem ESP32 S3 eine Türkamera bauen. Ein magnetischer Türsensor überwacht Ihre Tür. Sobald jemand sie öffnet, macht der ESP32 S3 ein Foto und sendet es mit Telegram an Ihr Handy. Sie sehen, wer die Tür geöffnet hat, von überall auf der Welt.

ESP32 S3 Kamera - Foto an Telegram senden, wenn die Tür geöffnet wird

Was Sie bauen werden:

  1. Ihren eigenen Telegram-Bot, der Ihnen Nachrichten sendet
  2. Eine ESP32 S3 Kamera mit einem magnetischen Türsensor
  3. Ein Foto mit dem Text "The door is open!" auf Ihrem Handy, jedes Mal wenn die Tür geöffnet wird
  4. Saubere Erkennung, sodass eine Türbewegung genau ein Foto sendet

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×Türsensor
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 Door Camera
10:17 AM ✓✓
Good. Now let's choose a username for your bot. It must end in bot.
10:18 AM
my_esp32_door_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 Door Sensor

Ein Türsensor besteht aus zwei Teilen:

  1. Einem kleinen Kunststoffgehäuse mit zwei Drähten. Dieser Teil enthält einen Reedschalter. Sie befestigen ihn am Türrahmen.
  2. Einem zweiten Kunststoffgehäuse ohne Drähte. Dieser Teil enthält einen Magneten. Sie befestigen ihn an der Tür selbst.

Wenn die Tür geschlossen ist, befindet sich der Magnet neben dem Reedschalter und schließt ihn. Wenn die Tür geöffnet wird, entfernt sich der Magnet, und der Schalter öffnet sich wieder.

Türsensor

Weitere Details zum Türsensor finden Sie im Tutorial ESP32 S3 - Türsensor.

Wichtige Spezifikationen

EigenschaftWert
TypMagnetischer Reedschalter (Schließer, normalerweise offen)
Drähte2, ohne Polarität
Schaltabstandetwa 15 mm bis 25 mm
StromversorgungKeine. Es ist nur ein Schalter.

※ Notiz:

Die beiden Drähte haben kein Plus und kein Minus. Sie können sie in beliebiger Richtung anschließen.

Wie der ESP32 S3 die Tür ausliest

Der Türsensor ist nur ein Schalter, daher muss der ESP32 S3 selbst eine Spannung bereitstellen. Wir verwenden den internen Pull-up-Widerstand:

pinMode(DOOR_PIN, INPUT_PULLUP);

Mit INPUT_PULLUP ist der Pin HIGH, wenn nichts ihn nach unten zieht. Die Tabelle zeigt, was passiert:

TürMagnetReedschalterPin liest
GeschlossenNeben dem SchalterGeschlossen (mit GND verbunden)LOW
OffenVom Schalter entferntOffen (nichts verbunden)HIGH

Im Code also:

#define DOOR_CLOSED LOW #define DOOR_OPEN HIGH

Warum der Code 50 Millisekunden wartet

Ein Metallschalter wechselt nie sauber. In den ersten Millisekunden springt er viele Male zwischen offen und geschlossen. Das nennt man Prellen. Ohne Schutz würde eine einzige Türbewegung fünf Fotos senden.

Der Code wartet, bis der Wert 50 Millisekunden lang gleich bleibt:

if (reading != lastReadState) { lastReadState = reading; lastChangeTime = millis(); // the value changed, so start counting again } if (millis() - lastChangeTime >= DEBOUNCE_TIME && reading != doorState) { doorState = reading; // the value is stable now, so we believe it }

Bewegungssensor oder Türsensor?

Beide ergeben eine kleine Sicherheitskamera, aber sie sind nicht gleich:

TürsensorBewegungssensor (PIR)
ErkenntNur das Öffnen der TürJeden warmen Körper, der sich bewegt
FehlalarmeFast nieManchmal (Heizungen, Fenster, Tiere)
AufwärmzeitKeine30 bis 60 Sekunden
Benötigt StromNeinJa, 5V
Funktioniert durch GlasJaNein

Ein Türsensor ist die bessere Wahl, wenn Sie von einem genauen Ereignis erfahren möchten. Siehe auch das Tutorial ESP32 S3 Kamera - Foto an Telegram senden, wenn eine Bewegung erkannt wird.

Wiring Diagram between Door Sensor and ESP32 S3

Verbinden Sie die beiden Drähte des Türsensors mit Ihrem ESP32 S3.

ESP32 S3 Türsensor Telegram Schaltplan

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

Draht des TürsensorsESP32 S3 Pin
Erster DrahtGPIO2
Zweiter DrahtGND

Befestigen Sie dann die beiden Teile des Sensors an Ihrer Tür:

  1. Befestigen Sie den Teil mit den Drähten am Türrahmen.
  2. Befestigen Sie den Teil ohne Drähte an der Tür selbst.
  3. Bewegen Sie die Tür, bis die beiden Teile nebeneinander liegen. Sie müssen sich fast berühren, mit einem Abstand von weniger als 15 mm.
  4. Richten Sie die Kamera auf die Tür.

Sicherheitshinweise

Der Türsensor benötigt keinen Strom. Schließen Sie ihn nicht an 5V oder 3,3V an. Ein Draht geht an GPIO2, der andere an GND. Es kann nichts kaputtgehen, weil es nur ein Schalter 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. GPIO2 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 += "The door is open!\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 The door is open! 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 die Tür geöffnet wird. Wenn die Tür wieder geschlossen wird, wird nichts gesendet. Die Ruhezeit beträgt 30 Sekunden, sodass eine Person, die die Tür mehrmals öffnet und schließt, Ihren Chat nicht überflutet. 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-door-opens */ #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 DOOR_PIN 2 // the door sensor is connected to GPIO2 #define DEBOUNCE_TIME 50 // wait 50 milliseconds, because the switch bounces #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" // The door sensor is a switch: // LOW = the switch is closed = the magnet is near = the door is CLOSED // HIGH = the switch is open = the magnet is away = the door is OPEN #define DOOR_CLOSED LOW #define DOOR_OPEN HIGH int doorState = DOOR_CLOSED; int lastReadState = DOOR_CLOSED; unsigned long lastChangeTime = 0; 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 += "The door is open!\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); // INPUT_PULLUP: the pin is HIGH when the switch is open pinMode(DOOR_PIN, INPUT_PULLUP); 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()); doorState = digitalRead(DOOR_PIN); lastReadState = doorState; if (doorState == DOOR_OPEN) Serial.println("Ready. The door is open now."); else Serial.println("Ready. The door is closed now."); } void loop() { int reading = digitalRead(DOOR_PIN); // The switch bounces, so we wait until the value is stable if (reading != lastReadState) { lastReadState = reading; lastChangeTime = millis(); } if (millis() - lastChangeTime >= DEBOUNCE_TIME && reading != doorState) { doorState = reading; if (doorState == DOOR_OPEN) { Serial.println("The door is open!"); if (millis() - lastSendTime >= QUIET_TIME) { takeAndSendPhoto(); lastSendTime = millis(); } else { Serial.println("Too soon after the last photo. Nothing is sent."); } } else { Serial.println("The door is closed."); } } }

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 schließen Sie dann die beiden Drähte des Türsensors wie in der Tabelle oben an.
  • 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.
  • Legen Sie die beiden Teile des Sensors nebeneinander. Der Serielle Monitor meldet, dass die Tür geschlossen ist.
  • Bewegen Sie die beiden Teile voneinander weg, wie bei einer sich öffnenden Tür.
  • 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
The door is open!
10:15 AM
ESP32 S3 Türkamera 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 14:00:01] Camera sensor: OV5640 (5 MP, max QSXGA 2592x1944) [2026-09-23 14:00:01] Connecting to WiFi... [2026-09-23 14:00:04] Connected. IP address: 192.168.0.2 [2026-09-23 14:00:04] Ready. The door is closed now. [2026-09-23 14:01:12] The door is open! [2026-09-23 14:01:12] Photo taken: 51353 bytes [2026-09-23 14:01:12] Connecting to Telegram... [2026-09-23 14:01:15] The photo was sent to Telegram [2026-09-23 14:01:31] The door is closed.
Ln 11, Col 1
ESP32S3 Dev Module on COM15
2

Wenn die Tür zu schnell wieder geöffnet wird, meldet der Code dies und sendet nichts:

∞
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 14:01:38] The door is open! [2026-09-23 14:01:38] Too soon after the last photo. Nothing is sent.
Ln 11, Col 1
ESP32S3 Dev Module on COM15
2

Fehlerbehebung

Der Serielle Monitor meldet immer, dass die Tür offen ist, auch wenn sie geschlossen ist.

  • Die beiden Teile sind zu weit voneinander entfernt. Sie müssen sich fast berühren, mit einem Abstand von weniger als 15 mm.
  • Prüfen Sie den Draht an GPIO2 und den Draht an GND.
  • Manche Türsensoren sind "normalerweise geschlossen" (Öffner) statt "normalerweise offen" (Schließer). Dann müssen die beiden Zeilen #define DOOR_CLOSED LOW und #define DOOR_OPEN HIGH ihre Werte tauschen.

Der Serielle Monitor meldet immer, dass die Tür geschlossen ist.

Die beiden Drähte berühren sich wahrscheinlich, oder ein Draht ist am falschen Pin. Ein Draht geht an GPIO2, der andere an GND.

Eine Türbewegung sendet zwei oder drei Fotos.

Erhöhen Sie DEBOUNCE_TIME von 50 auf 150.

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 daher mit dem Hotspot Ihres Handys.

Das Foto dauert lange.

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

Das Foto ist dunkel.

Die Kamera kann im Dunkeln nicht sehen. Bringen Sie ein Licht in der Nähe der Tür an oder eine Lampe, die sich mit der Tür einschaltet.

Anwendungen

Ein Türsensor liefert Ihnen ein klares Ereignis mit fast keinen Fehlalarmen, daher eignet sich dieses Projekt überall dort, wo etwas geschlossen bleiben muss. Hier sind praktische Projekte, die Sie mit diesem Code bauen können:

  1. Sicherheitskamera für die Haustür: Sehen Sie, wer Ihre Haustür öffnet, während Sie bei der Arbeit oder im Urlaub sind.
  2. Paketkasten-Kamera: Erhalten Sie ein Foto, wenn der Zusteller Ihren Paketkasten oder Ihren Briefkasten öffnet.
  3. Medizinschrank-Alarm: Erfahren Sie, wenn ein Kind einen Schrank öffnet, der geschlossen bleiben muss.
  4. Ladentür-Zähler: Behalten Sie ein Bild von jedem Kunden, der die Ladentür öffnet.
  5. Alarm für Werkzeugkasten, Tresor oder Spind: Erhalten Sie ein Foto, sobald jemand ihn öffnet, auch wenn Sie weit weg sind.
  6. Garagentor-Benachrichtigung: Erfahren Sie, wenn Ihr Garagentor oder Ihr Schuppen nachts geöffnet wird.
  7. Fensteröffnungs-Alarm: Befestigen Sie den Sensor an einem Fenster statt an einer Tür und erhalten Sie ein Foto, wenn es geöffnet wird.
  8. Serverschrank und Schaltschrank: Führen Sie eine Fotoaufzeichnung von allen, die bei der Arbeit einen Schrank öffnen.
  9. Kühlschrank- oder Gefrierschrank-Wächter: Ein lustiges Heimprojekt, um zu sehen, wer das letzte Stück Kuchen nimmt.
  10. Hotelzimmer oder Mietwohnung: Wissen Sie, dass die Tür geschlossen blieb, während das Zimmer leer war.

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: Ändern Sie den Text unter dem Foto von The door is open! in Ihre eigene Nachricht.
  2. Fortgeschritten: Senden Sie auch eine Nachricht, wenn die Tür wieder geschlossen wird, damit Sie wissen, wie lange sie offen war.
  3. Profi: Senden Sie ein Foto nur nachts, zwischen 22:00 und 06:00 Uhr. Verwenden Sie einen NTP-Zeitserver, um die echte Uhrzeit zu lesen.

※ 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!