Projektvorstellung: Barcodescanner für die smarte Einkaufsliste - DIY-Projekt (ESP32)

Wie bereits in einem anderen Thread erwähnt, möchte ich euch ein DIY-Projekt vorstellen, welches mich die letzten Wochen stark beschäftig hatte. Es geht hier um einen Barcode-Scanner auf ESP32-Basis, der die Einkaufsliste füllt.

Einleitung:
Im Web gibt es bereits ähnliche Projekte, aber keines war wirklich brauchbar - zumal viele Projekte aufgrund Änderungen in ESPHome nicht mehr funktionierten. Außerdem funktionierten die “alten” Lösungen bisher nur soweit begrenzt, dass man hauptsächlich nur Lebensmittel scannen konnte. Wenn ein Lebensmittel nicht erkannt wurde, stand “unknown” in der Einkaufsliste - was nicht sonderlich hilfreich war.
Es musste also eine neue Lösung her. Und wenn man schon eine neue Lösung baut, dann überlegt man natürlich vorher, was man denn alles als Features haben möchte.

Ziel:

Ich wollte einen Barcode-Scanner, der folgendes konnte:

  • Produkte scannen und automatische Eintragung in die Einkaufsliste von Home Assistant und in die Bring!-App
  • Aufbau einer Produktdatenbank für Produkte, die nicht erkannt wurden. Mit dieser Datenbank werden kann künftige Produkte beim ersten Scan direkt erkannt. Als Datenbank habe ich “Grocy” als eigenständigen Docker verwendet.
  • Scan-Möglichkeit per Barcodescanner und/oder Smartphone
  • Lager-Modus –> man soll Bestände ins Lager einbuchen können
  • Multiscan-Funktion –> Es soll möglich sein, dass man (wie an der Kasse) mehrere Produkte gleichzeitig scannen kann
  • “Beep”-Ausgabe bei erfolgreichem Scan
  • Anzeige des Barcodes und Produktnamen an einem Display
  • automatische Beleuchtung beim Scanvorgang (damit der Barcode gut gelesen werden kann)
  • Maximale Flexibilität: Alles soll mit ESPHome und Home-Assistant Automationen funktionieren

Die Ziele waren also gesetzt, die Aufgabe somit groß!

Materialien:

Zuerst überlegte ich mir, welche Hardware ich dafür verwenden werde. Meine Wahl fiel auf einen ESP32-S3, da dieser sehr leistungsstark ist und er eine Menge geeigneter PINs für die vielen Sensoren besitzt.
Neben den ESP32-S3 habe ich verwendet:

  • GM60-Barcodescanner
  • passiver Piezo Buzzer
  • 1.77” TFT-Display
  • Taster
  • leuchtstarke LED
  • eine Status-LED-Platine (KY-016 FZ0455)
  • Ultraschall-Sensor (HC-SR04)
  • Lochrasterplatine 5x7cm
  • jede Menge Dupont-Kabel
  • ein paar Stift- und Buchsenleisten (2,54mm)

Umsetzung:

Alle Ziele wurden erreicht. Der Scanner macht alles so, wie gewünscht. Er “beept” beim Scanvorang, die LED leuchtet, das Display zeigt alles an. Die Einkaufslisten werden gefüllt, die Grocy-Datenbank wächst. Der Lagermodus füllt den Bestand… Ich bin glücklich :slight_smile:

Das “Endprodukt” wochenlanger Tüftlerei sieht nun so aus:

Video zur Funktion (inkl. Kurzbeschreibung):

Fazit
Es war ein - für mich - extrem kniffliges Projekt, vor allem die Software hat 90% der gesamten Arbeitszeit verlangt… Ich möchte gar nicht mehr überlegen, wieviele Stunden es tatsächlich waren - aber es waren sehr viele… :smiley:

Fragen?
Gerne bei mir melden!

4 „Gefällt mir“

Mega das du es geschafft es. Ich würde es gerne mit den Teilen von Daniel zum laufen bekommen und würde mich über Hilfestellungen sehr freuen. Liebe Grüße

Bei mir piept er direkt nach dem flashen non stop. Hier ist der Log:

[18:23:14][W][api.connection:2226]: Home Assistant 2026.1.3 (192.168.0.105): Reading failed CONNECTION_CLOSED errno=128 [18:23:15][D][api.connection:2221]: Home Assistant 2026.1.3 (192.168.0.105): connected [18:23:15][D][uart_debug:157]: <<< "\x02\x00\x00\x00\xFB\xFF\x95\xFF\xFF\x03\xC0\x06\xFF\x00\x00\x00\x0F\xF7\x00\a\xFE\xDB\xBD\x01\xF6\xFC\xFF\xDE\xB8\x00\x008\xFF\xFF\xFF\xF7\xFB\xD6\x19\xE0\x00\x18\x00|\x00\x00\x00\x00\x00\x10\x00\x10\x00\x10\x00\x10\x10\x10\x00\x00\xF4\xFF\x00\xDC\xFD\x10\x00\x00\x10\x10\x10\x00\x10\x00>\x10\x10\x10\x00\xF0\xDF\xC0P\xF7\xFA\xFF\xBF\xFF\xDF?~\xFF\xEF\xBE\xFF\xD0\xFF\t\xC0\x1E\xF7T\x15\xF5\xFF\xFF\xBD\x00\xFF\x05\xF4\xAB\x16\x00\xFF\t\x00\x00\x00\x00\x101\xFF\x1Fp\xDB\xBF\ [18:23:15][D][text_sensor:119]: 'Barcode' >> '' [18:23:15][W][rtttl:040]: Already playing: ok [18:23:15][D][rtttl:405]: Playback finished [18:23:15][D][uart_debug:157]: <<< "\xAF\x02\xEE\x02\xFB\x01\xCFH\xE3\xBF\x06\xFF\x01\x02\x00\x00\xC0\x00\xFF\xFF=Y\xFC\xDC\xDF\xFF\xFE\xFF\xFB\xF8}\x80\xAF\xAB\x84\x037\xFF|\x00\x00\n" [18:23:15][D][text_sensor:119]: 'Barcode' >> '����H��' [18:23:15][D][rtttl:062]: Playing song ok [18:23:15][W][api.connection:2226]: Home Assistant 2026.1.3 (192.168.0.105): Reading failed CONNECTION_CLOSED errno=128 [18:23:15][D][api:139]: Accept 192.168.0.105 [18:23:15][D][api.connection:2221]: Home Assistant 2026.1.3 (192.168.0.105): connected [18:23:15][D][rtttl:405]: Playback finished [18:23:15][D][uart_debug:157]: <<< "\x00\x00\x1F\x83\xFB\x01\xFF\x03\x03\x00\xF0\xFB\xA7\xDF\xFF\xFF\xF8\xFF\xFE\xFEG\x0FM\x00\x00\x00\xF7\x05W\x05{\xDF\xFC\x00\x00\x00\xFE\xFF\xFFt\x00\xF8\xFB\xFF\xF7\xFF\xFE\xF7\xFF\xFB?\x01\xFF\xFF\xFF\xCB(\xFF\xF5\xFF\xD2?\x00@QU\xC9U{\xFD\xE7\x9F\xEBU\x85\xC1Z\x92\x00\xE0\x12\x05\x00\x10\xFB\xBFN\xFE\xE8\a\xFF\xBF\xFE\xFB\xFF\xFF\x8E\xDE\xFF\xC8\xFE\xFF\xB7\xF8\x00\x00\xFF\x02\x14\x00\x03\xFC\x00\x00\x1F\xFF\x03\x00\xDFE\x1F\xCF\xFF~\x03 y\xE1\x00\x00\x00\x12\x14\x00 [18:23:15][D][text_sensor:119]: 'Barcode' >> '' [18:23:15][D][rtttl:062]: Playing song ok [18:23:15][D][api:139]: Accept 192.168.0.105 [18:23:15][W][api.connection:2226]: Home Assistant 2026.1.3 (192.168.0.105): Reading failed CONNECTION_CLOSED errno=128 [18:23:15][D][api.connection:2221]: Home Assistant 2026.1.3 (192.168.0.105): connected [18:23:15][D][rtttl:405]: Playback finished [18:23:15][D][uart_debug:157]: <<< "\xFF\b\xEF\x00\x00\xFF\xFC\xEC\xF9\xFE\xE8\xF7\xDF\x1E\x1F})\x03\x00\x00\x00\xFFn\xFF\xFF\xFF\xFE\x00\xDC\xF5\xFE\xF7\xFF\xFEi\xFA\xDB\xC7\xFF|\xFF\xDF\xE7V\x01\x00\xFFU\xD5U\xD5}\xAD{\x84U\x01\xFE^\xDD\x00\xF0\b\x00\x00\x00 \x8E\xFF\x97\xEC\xE3\xF6\xFF\xFF\xFFO\x92\xFF\xAB\xFD\xF0\x01\xB7\x01\x14\x01\x00\x00\xFF\x01\xFF\xF7\x00\x00\x00\xF7\x02w\xF7\t\xAB\x00.\t\xFF\x03%\x033\x00\x05\xF8\xFF\xFF\x1C\x00\xF4\xFF\x8B\x01\x01\x04\x03\t\xFF\xF1\xFF|\xB8\x00\x00\xDF\x00\x00 [18:23:15][D][text_sensor:119]: 'Barcode' >> '��' [18:23:15][D][rtttl:062]: Playing song ok [18:23:16][W][api.connection:2226]: Home Assistant 2026.1.3 (192.168.0.105): Reading failed CONNECTION_CLOSED errno=128 [18:23:16][D][api:139]: Accept 192.168.0.105 [18:23:16][D][api.connection:2221]: Home Assistant 2026.1.3 (192.168.0.105): connected [18:23:16][D][uart_debug:157]: <<< "\x83\x02\x04\x80\x00\x01\x10\x00\x10\x10\x10\x10\x10\x00\x10\x10\x10\x10\x10\x10\x00 \x00<\x10\x10\x00\xE0\x00\b\x10\x10\x10\x00\x10\x00\x10\xFF\xCE\x93\xFD?\xFC\xFF\b\x00,\x00\x0F\x00\xDF\x00\xEF\xFF\xFB\xFFP\xE0\xE4\xFF\xF7?\xDF\x00\x00\xFE\x00\x00\x0F\x00\x00\xFF\xFF1#\xD6\x1F\x00\x00\xBA\xFF,j\x00\x00\x00\x06\xFF\xF7\xF7\xFE_\xFB\xFF\xFE\xAF/\xFE\xDF\xFF\xDF\xFF\x9F\x97\xFF\x00\xFCDQ\xFE\x95\xFF\xFF\xFF\xDF\x15=\xD9]\xFFoPGJ\xED\x00\xE0\x1F\xEE\x00\x00\x00\xFB\xDF\\z\v\ [18:23:16][D][text_sensor:119]: 'Barcode' >> '��'

Und es kommen komische Zeichen als Barcode raus. Muss man den GM60 erst noch kalibrieren?

Muss ich hier noch was einstellen?

:crayon:by HarryP: Code-/Logzeilen formatiert (bitte immer in </> einbinden)
s.a.: (Neues Update & Features - Hier in der Community 🫶)

Ich hab das so ähnlich gebaut, auch mit grocy im Backend und esphome mit LVGL und den entsprechenden API Aufrufen über HA. Es gibt eine „Lagerliste“ fürs Lager und den „empfohlenen Notvorrat“ (Schweizer wissen was das bedeutet :grin:) und die Einkaufsliste die alle Artikeldaten aus dem grocy holt aber in einer To-Do Liste landet. Das Zeug fürs Lager/Notvorrat hat Mindestbestand und ist rollierend.

Der Scanner im Lager, Standardverhalten ist rauspiepsen


und reinpiepsen, mit Anzahl und Haltbarkeitsdatum, 99 für keins, oder YYYYMM / YYYYMMDD

Der Scanner in der Küche (links seitwärts) für den täglichen Krimskrams

Und das ganze ist auch auf den Dashboards verfügbar um das in die Einkaufsapp einzuscannen



3 „Gefällt mir“

Einfach nur klasse :heart_eyes: :waving_hand:

Sieht gut aus @der_Micro
Respekt

Aber auch hier wird der Aufwand ziemlich groß gewesen sein, oder?
Wenn ich da bei mir an das Projekt denke… :face_with_spiral_eyes:

Ohhh ja, die grössten Happen waren die Scripte die die API und die Eingaben von ESPHome auswerten und das LVGL Design hat auch Zeit gekostet da es ja keinen UI Yaml Editor für Yaml gab, mittlerweile soll das irgendwie über VSCode möglich sein. Im Groben…nen halbes Jahr hat es gedauert.

1 „Gefällt mir“

Du scheinst aber da vermutlich beruflich in der Materie unterwegs zu sein, oder? Sieht zumindest richtig professionell aus.

Ich bin einfacher DIY-Bastler, der nach dem Prinzip „Try & Error“ sich irgendwie durchkämpft :joy:

Das, was ich hier gemacht hab, war bisher mein größtes Projekt was ESP betrifft

1 „Gefällt mir“

@der_Micro Könntest du mal auflisten welche Hardware du verwendet hast und gibt es von deinem Projekt auch eine Nachbau Anleitung :partying_face:?

1 „Gefällt mir“

@Channex, nunja, ich bin zwar im Engineering tätig (Windows/Intune/Azure) und kenne Powershell wie meine Westentasche, aber das hier was mit HA/ESPhome/Linux/Docker/Yaml ist auch Neuland für mich. Mein Job bringt aber gewisse analytische und logische Vorteile mit sich, das ist schon so. Und Python…krieg ich nicht gebacken :rofl:

@Sushibomba Eine Anleitung? Krieg ich nie im Leben hin, es fällt mir schon schwer das zu beschreiben :zany_face: Das Konstrukt als solches ist schon nicht einfach. Da spielen Docker, ein Haufen Pain im LVGL Design, viel ESPHome Abenteuer und solche Sachen eine Rolle. Für den Lagerscanner hab ich ein Seeedstudio Sensecap Indicator genutzt, weil ich bastel und lötfaul bin und wenn ich alles einzeln kaufen und qualvoll bauen muss ist das zeitlich teurer als das Teil. Kostet bei der bastelgarage um die 50CHF, mittlerweile habe ich 3 davon im Haus.Aber es hat eine besonderheit, da sind 2 Minicomputer verbaut der eine ist fürs Display, BLE, Wlan und solch Zeug, der andere für UART, IIC etc, Hat mich eine Menge Zeit gekostet die miteinander intern reden zu lassen da der RP2040 kein Netzwerk kennt.

1 „Gefällt mir“

Hi Channex, bevor ich jetzt alles final am Einbauort installiere habe ich noch eine Frage. Du hast ja noch einige weitere Hardware in deinem Kasten verbaut. Könntest du mir zum einen sagen welche Teile du genau verwendet hast und warum du diese Positionen noch zusätzlich eingebaut hast?

Gerne.

Also den Ultraschallsensor (HC-SR04) hab ich für die Bewegungserkennung eingebaut. Der Scanner ist ja standardmäßig auf Standby. Wenn man einen Barcode vor den Scanner hält, erkennt der Ultraschallsensor, dass etwas davor ist und schaltet das Display sowie die Beleuchtungs-LED ein. Er „weckt“ das ganze sozusagen auf.
Das ganze dann auch umgekehrt. Wenn kein Produkt mehr darunter ist, dann leuchtet alles noch 30 Sekunden nach und geht dann wieder in den Standby.

Die Beleuchtungs-LED ist aus meiner Bastelkiste. Das war ursprünglich mal die LED einer Taschenlampe.

Der Taster ist für die Wahl des Modus da. In meinem Code kann ich zwischen „Lagermodus“, „Produktregistrierung“ und „Einkaufsliste“ wählen.

Und die KY-016 FZ0455 ist rein für die Statusanzeige da, welcher Modus aktiv ist.

Für das alles brauchst du denke ich ein „Eigenbau“-Gehäuse. Ich glaub nicht, dass das alles vernünftig in das 3D-Gehäuse (also vom alten Prokelt) passt.
Außerdem musst du beachten, dass ich das alles an einem
ESP32-S3 betreibe. Der hat deutlich mehr GPIOs verfügbar.

Ok vielen Dank für die Erklärung. Also was für mich noch ganz interssant wäre sind die Ultraschall Thematik. Habe auch glaube ich noch zwei Stück hier rum fliegen und das mit dem Taster und Umschalten des Modus. Könntest du mir dafür noch mal sagen welche du genau verwendet hast und welche funktionieren?

Mit „Welche“ meinst du den Ultraschallsensor oder den Taster?

Ultraschallsensor ist HC-SR04

Der Taster ist ein normaler Drucktaster von „Am…“n

Ja ich meinte eher Infos in die Richtung ob der 4 Kabel oder nur 2 haben muss etc.

Nachdem ich hier leider den Produktlink nicht posten kann, hier die Bezeichnung

„ANVINKU Drucktaster 6 Stück, 16mm Taster, Wasserdichte Tastschalter, 2A/12V/24V/125V/250V Druckschalter, Hervorstehend Druckschalter für hupen, Auto Runde“

2 Klemmen, nichts zu löten

Ich habe hier eine Anleitung inkl. Code zusammengebastelt, mit der ihr euch eine “Lite”-Version des Scanners zusammenbauen könnt:

Die Seite ist jetzt nichts besonderes, aber ich parke hier künftig meine Projekte.

Derzeit arbeite ich auch noch an einer Doku für die PRO-Version mit etwas größerem Display, mehreren Modis (Einkaufsliste, Lagermodus, etc…), bei der dann auch die Grocy-Datenbank integriert ist.

3 „Gefällt mir“

Upgrade!!!
Bei Interesse werde ich auch diesen Teil veröffentlichen

4 „Gefällt mir“

nachdem es hier etwas ruhiger geworden ist, wollte ich endlich mal meine Fotos nachreichen. Der ganze Einbau in die Küche hat sich bis letzte Woche bei mir verschoben, ich musste mich noch um die Stromversorgung für den Barcodescanner kümmern (es fehlte ein 3m USB Kabel)

jetzt ist der Scanner bereit, wenn die Türe zum Mülleimer geöffnet wird.

als Sensor habe ich sowas verwendet und noch in die Automation eingebaut.

@Channex- nochmals vielen Dank für Dein tolles Projekt. Ich bin dabei, wenn es hier später nochmal weitergehen sollte ….

1 „Gefällt mir“

Ja ist ein wenig ruhiger geworden, weil ich an diversen anderen Scaner-Projekten rumgebastelt habe. Seit ein paar Tagen arbeite ich aber speziell an dieser Version wieder weiter.