Mit dem Barcode Laser Handscanner am Raspberry Pi Kalorien und Nährwerte zählen und sich bewusster ernähren
Das in diesem Artikel beschriebene Projekt baut auf Vorgängerprojekten auf, so dass wir als Basis einen Raspberry Pi 3B+ (ein Raspi 4 oder 5 geht natürlich auch) mit aufgestecktem TFT-Display und per USB-Dongle angeschlossener Tastatur haben.Wer die Vorgängerartikel noch nicht kennt: In einem meiner letzten Artikel hatte ich beschrieben, wie man den 3.5 Zoll RPi Display TFT Touchscreen für Konsole (Lite) und Desktop für Raspberry Pi OS Version Bullseye einrichtet. Und schließlich habe ich auch den Touchscreen unter dem Desktop richtig zum Laufen gebracht, so dass dort der Mausersatz richtig funktioniert.
Den Desktop brauchen wir heute aber nicht, der ist mir gelinde gesagt auf dem kleinen Display auch zu klein und auf dem Pi-3B+ auch zu langsam. Was wir auch nicht unbedingt brauchen, ist der Alere Pima Thermodrucker aus dem letzten Artikel. Obwohl man den aber natürlich zum Ausdrucken von Daten benutzen kann. Ansonsten spielt sich alles auf dem Bildschirm ab.
Der Handscanner OCOM OCBS-LA11, USB
Als neue Hardwarekomponente kommt ein sogenannter Handscanner zum Einsatz. Das ist ein Barcode-Scanner, der mittels Laserstrahl Barcode lesen kann und das viel schneller, als es das Smartphone könnte. Den habe ich für knapp 15 Euro auf Pollin als Sonderposten geschossen und habe mich über das Schnäppchen gefreut, weil ich die Preise für Handscanner viel höher im Kopf hatte. Es stellte sich aber heraus, dass es auf amazon auch schon Barcode-Scanner um die 20 Euro gibt, und sogar schon kabellose mit Akku und 2.4 GHz Funk für etwa 25 Euro.
Egal. Nun hatte ich den Handscanner, der mich allein schon wegen der Technologie interessierte. Im Inneren gibt es einen drehenden Spiegelkörper, auf den ein roter Laserstrahl geworfen wird. Durch die Form des drehenden Spiegelkörper wird der Laserstrahl aufgefächert und es entsteht eine Laserstrahl-Linie. Diese wird von Objekten reflektiert und trifft dann auf eine Fotodiode im Inneren des Scanners, der die Helligkeitsverhältnisse des zurückgeworfenen Laserlichts auswertet.
Hält man jetzt einen Barcode, der ja aus weißen und schwarzen Strichen besteht, vor den Scanner, dann kommen in bestimmter Geschwindigkeit schwache und starke Lichtstrahlen im Scanner an. Diese "staucht" die Elektronik und macht daraus Bits (Nullen und Einsen) und erkennt so den Barcode. Dabei helfen die Start- und End-Striche mit festgelegter Breite. Der Bitcode wird dann dekodiert und das Ergebnis via Tastatur-Emulation über USB an den PC geschickt. Wer sich für die Kodierungen der Barcodes interessiert, dem empfehle ich einen Blick auf z. B. den Barcode-128 auf Kryptografie.de. Dort sind auch noch viele weitere Barcode-Arten verlinkt.
Der Handscanner hier kann eigentlich so gut wie alle Strichcodes, also eindimensionale (1D) Codes. 2D-Codes wie QR-Codes kann er nicht, denn er sendet ja eine Laser-Linie aus und erfasst kein Bild über eine Kamera. Vorteil des Laser-Handscanners ist allerdings, dass er sehr schnell und eigentlich auch gut erfasst. Der Laser zischt so schnell hin und her, dass eine durchgehende Linie entsteht. Und jedesmal könnte der Scanner einen Barcode erfassen. Das dauert mal gerade eine fünftel Sekunde.
Sehr stromhungrig ist der Scanner auch nicht, er begnügt sich mit dem, was er über den USB-Port bekommt. Zum Scannen reicht es, einen Barcode im ungefähr richtigen Abstand vor das Fenster im Scanner zu halten. Dann piept er kurz und spuckt die gescannte Nummer oder den alphanumerischen String als Tastatureingabe aus. Das ist sehr praktisch und natürlich hochkompatibel, da es mit jedem Gerät funktioniert, bei dem man über USB eine Tastatur anschließen kann. Nach der gescannten Nummer schickt der Scanner wahlweise ein Tabulator-Zeichen oder einen Zeilenumbruch - dass kann man über spezielle Barcodes einstellen. So kann man bequem Text- oder Excel-Dateien mit Daten füllen.
Eine praktische Anwendung für den Scanner
Nach dem üblichen Ausprobieren und Herumspielen wollte ich natürlich auch eine praktische Anwendung für den Scanner. Als erstes habe ich meinem Thermodrucker beigebracht, Code-128-Barcodes in anständiger Qualität zu drucken, was nur durch Direktansteuerung im Grafik-Modus ging. Aber dann konnte ich gut scanbare Etiketten drucken. Für den Code-128 habe ich mich entschieden, weil er Ziffern, Klein- und Großbuchstaben sowie ein paar Sonderzeichen umfasst. Man kann damit also auch Texte und nicht nur Nummern kodieren. Allerdings ist bei 14 Zeichen Schluss, mehr passt auf die Thermodrucker-Etiketten von der Breite nicht drauf.Jetzt kann ich also für und auf alles eine Barcode-Etiketten ausdrucken und draufkleben. Vielleicht ganz praktisch, um gleichaussehenden Gegenständen eine unterscheidbare Nummer zu geben oder um eine Inventur zu machen. Aber das ist mehr Theorie, ich habe kein Lager, dass groß genug wäre, eine Inventur machen zu wollen und zur Unterscheidung reichen auch Etiketten mit Klartext.
Also dachte ich ein wenig nach und kam zurück auf das, wo man diese Handscanner am meisten antrifft: Im Supermarkt.
Lebensmittel scannen und Nährwerte erfassen
Auf jedem Lebensmittel, auf jeder Ware, die man im Supermarkt kaufen kann, gibt es einen Barcode - von seltenen Ausnahmen wie Obst mal abgesehen. Meist sind dies EAN-Codes. Und EAN-Codes sind eindeutig. Jeder Hersteller von Produkten muss sich dafür registrieren und bekommt dann einen Nummernbereich zugewiesen. Es gibt zwar Discounter, die sich die EAN-Gebühren sparen und eigene Nummern benutzen, aber auch die sind eindeutig, zumindest für den Discounter gesehen. Trotzdem glaube ich nicht, das z. B. Aldi, Lidl, Norma und Co. Codenummern haben, die sich überschneiden. Kurzum: Jedes Produkt hat seine eigene, eindeutige Nummer.
Scanner dranhalten und die Nummer wird gescannt. Schon wissen wir, was wir vor uns liegen haben. Welche Kodierungsart der Barcode hat, muss uns eigentlich nicht interessieren. Der Handscanner erkennt EAN, Code-128, Code-39, Codabar, 2of5, Code-93, MSI, Code-11m ISBN, ISSN, Chinapost und weitere. Eigentlich alles, was ich ihm an 1D-Codes vorgesetzt habe. Raus kommt immer eine Nummer oder eine Zeichenkette.
Oben abgebildet ist die Rückseite einer "Culinea Cannelloni Vier-Käse"-Verpackung von Lidl mit deren Nummer 4056489675778. Da steht zwar nicht die Nummer in Klartext drunter (dafür auf der Seite der Verpackung), aber wir haben ja unseren Scanner.
Neben dem Barcode hat es hier direkt die Nährwert-Tabelle. Die findet sich eigentlich auf allen in Deutschland verkauften Lebensmitteln und enthält immer die folgenden Nährwertangaben pro 100 g:
- Energie in kcal (und kJ)
- Fett
- davon gesättigte Fettsäuren (das sind die "schlechten")
- Kohlenhydrate
- davon Zucker
- Eiweß
- Salz
Jetzt habe ich mir ein kleines Python Script zum "Kalorienzählen" geschrieben. Obwohl ich Python eigentlich nicht mag: Python ist langsam, viele Befehle der Programmiersprache sind inkonsistent (warum zählt zum Beispiel "for i in range (1,5)" von 1 bis 4 und nicht von 1 bis 5? Warum schreibt "fobj.writelines(zeilen)" alles in eine Zeile ohne Linefeeds? Python ist voll von solchen Grausamkeiten!), die Sache mit dem Einrücken von Blöcken statt Verwendung von Klammern bzw. "endif", "wend" und Co. ist unsicher bzw. besser gesagt eine mittlere Katastrophe und macht die Programmlogik von ein paar Spaces abhängig (OMG!). Kurzum: Python ist schrecklich und ein großer Rückschritt. Da war schon Basic in den Achtziger Jahren besser. Python ist keine Einsteigersprache, es ist ein Ungetüm, dass Programmieranfänger abschreckt oder ihnen die falsche Methodik beibringt. Aber genug des Rant. Warum ich trotzdem Python benutzt habe? Weil es ein Interpreter ist und auf meinem PC und auf dem Raspberry Pi läuft und dort die gleichen Ergebnisse produziert, von den unterschiedlichen Bildschirmgrößen mal abgesehen; da muss man dann halt den "kleinsten gemeinsamen Teiler" nehmen. Und es ist ja auch nur ein Winz-Progrämmchen, da kommt es nicht so auf einen guten Programmaufbau an.
Halte ich das erste Mal ein Produkt vor den Scanner, dann fragt das Programm mich nach Produktnamen, Packungsgröße, Portionsgröße und den sieben Nährwerten aus obiger Tabelle. Die speichert es sich in einer Datei, die es dann beim nächsten Scan wiederfindet.
Lebensmittel scannen und Kalorien und Nährwerte zählen
Ist ein Produkt schon bekannt, die Datei also schon vorhanden, dann gilt das Scannen als Konsumieren. Das Programm holt sich dann die Nährwert-Daten aus der Datei, berechnet die Werte pro Portionsgröße und addiert diese fortlaufend, rechts Nährwertangaben am Beispiel einer Portion Milch.
Die Packung gibt zwar 250ml (jetzt mal gleichgesetzt mit 250g) als Portionsgröße an, meine Portionen sind aber 166g groß, weil die Milch Grundlage für meinen Latte Macchiato ist, der ja noch aufgeschäumt wird, da muss ein bisschen Platz im Glas blieben. Lest dazu auch meinen Artikel Bester Latte Macchiato mit Kaffeemühle und Siebträger.
Aber da die Angaben ja pro 100g (bzw. ml) gespeichert sind, kann mir die aufgedruckte Portionsgröße egal sein. Die interpretier ich sowieso maximal als Verzehrempfehlung. Denn mal ehrlich: wer isst nur 30g Chips als Portion? Ist die Tüte einmal offen, dann mach ich sie auch leer. Mein Programm rechnet die Werte auf die angegebene Portionsgröße um.
Für eine 166ml Portion 3.5% Frischmilch sind das:
Naechsten Barcode scannen... 4061462865015
Konsum von: Frische Vollmich 3.5% Milsani (Aldi)
1000.0 g Packungsgroesse
166.0 g konsumierte Portionsgroesse (100, wenn nachfolgend absolute Werte)
107.9 kcal
5.976 g Fett
4.15 g gesaettigte Fettsaeuren
7.968 g Kohlenhydrate
7.968 g Zucker
5.644 g Eiweiss
0.1826 g Salz
Heute konsumiert:
---------------------------
kcal: 4%, 107.9 / 2200 #.............................
Fett: 8%, 6.0 / 73 ##............................
gs. Fs.: 11%, 4.2 / 36 ###...........................
KoHydr.: 2%, 8.0 / 275 ..............................
Zucker: 15%, 8.0 / 50 ####..........................
Eiweiss: 7%, 5.6 / 80 ##............................
Salz: 3%, 0.2 / 5 ..............................
Ich bin der Meinung, dass jeder Körper anders ist und anders funktioniert. Der eine kann Fett besser verdauen und verwerten und zieht mehr Energie aus Fetten, weil er die Enzyme, die die Fette zur Verdauung aufspalten perfekt produzieren kann. Bei dem anderen klappt das vielleicht nicht so toll mit den Enzymen. So kann es sein, dass bei einer Person Zucker dick macht und Fett eben nicht und bei einer anderen Person ist es genau umgekehrt.
Dazu kommen vielleicht auch noch Überempfindlichkeiten: Bei Bluthochdruck soll man zum Beispiel möglichst wenig Salz zu sich nehmen. Ich bin jetzt kein Ernährungexperte, aber überzeugt davon, dass jeder so seine eigenen Verdauungsparameter und damit Kalorien- und Nährwertbedarfe hat. Außerdem bewegt sich der eine mehr und der andere weniger. Das macht auch noch mal eine Menge aus.
Bewusst ernähren - wissen, was man isst
Aber der erste Schritt, herauszufinden, wie man tickt und wieviel man wovon essen sollte, um gesund zu bleiben, ist überhaupt zu erfassen, was man isst. Das man sich bewusst wird, wieviel man wovon isst. Kurzum: eine bewusste Ernährung.Zum Beispiel war ich mir gar nicht bewusst, wieviel Kalorien und Fett eine 150g Dose Cashew-Kerne hat:
Naechsten Barcode scannen... 4061458056618
Konsum von: Farmer Cashew Kerne (Aldi) (geroestet und gesalzen)
150.0 g Packungsgroesse
150.0 g konsumierte Portionsgroesse (100, wenn nachfolgend absolute Werte)
927.0 kcal
75.0 g Fett
13.8 g gesaettigte Fettsaeuren
33.0 g Kohlenhydrate
8.7 g Zucker
28.5 g Eiweiss
1.5 g Salz
Und natürlich habe ich die ganze Dose Cachew-Nüsse an einem Fernsehabend nebenbei weg gemümmelt. Weil Cashew Kerne sind halt wieder sowas, da kann man nicht aufhören, bis die Packung leer ist. Cashew-Kerne sind bestimmt nicht ungesund. Da sind viele wertvolle Nährstoffe drin. Aber es ist kalorienmäßig einfach zu viel eine ganze Dose zu essen.
Darüber bin ich mir jetzt bewusst geworden. Und ich wette, ich mache noch die eine oder andere überraschende Entdeckung, ganz einfach dadurch, dass ich die Nährwerte eingeben muss und lesen muss und immer wieder angezeigt bekomme und weiß, wo ich am Ende des Tages herauskomme. Vielleicht kann ich ja das eine oder andere Lebensmittel durch ein anderes auswechseln mit einem günstigeren Nährwert-Abdruck.
Mit der Zeit werde ich dann schon herausfinden, wie hoch mein persönlicher Kalorien-Tagesbedarf ist, um mein Gewicht zu halten und ohne auf zuviel zu verzichten. Denn auch Genuss und die damit verbundende Freude am Leben ist wichtig. Man braucht schon ein bisschen was, für das es sich zu Leben lohnt. Und da ist Genuss durch Essen ein wichtiger Bestandteil.
Ein paar Tage lang von morgens bis abends alles zu scannen, was ich trinke und esse, wird mir einen Überblick verschaffen, wie es mit der Nährwertzufuhr überhaupt aussieht. Bisher habe ich immer gegessen, wenn ich Hunger hatte und dann das, auf was ich Lust hatte. So sorglos essen führt in der heutigen Zeit allerdings schnell zu Übergewicht und/oder zuviel Salz- oder Zuckerkonsum.
Die Nahrungsmittelindustrie weiß nämlich, dass sie durch den Einsatz von Zucker in den Produkten die Kundenbindung stärken kann, denn im Grunde genommen ist Zucker so etwas wie eine Droge. Sie schüttet nach dem Essen Glückshormone aus. So eine Ausschüttung war in den Zeiten, wo unser Verdauungssystem entstanden ist, eine seltene Angelegenheit, so nach dem Motto: "Hey, du hast einen Platz gefunden, wo reife, süße Brombeeren wachsen. Merk dir den gut und auch die Zeit und komm wieder, um dein Überleben zu sichern. Damit du dir das besser merken kannst, hier einen Glücksmoment".
Fun Fact nebenbei: Habt ihr gewusst, dass man im Mittelalter zum Beispiel den Leuten, die die Grundstücksgrenzen bezeugen sollten, "von Amts wegen" eine kräftige Ohrfeige gegeben hat, damit sie sich später besser an die Grundstücksgrenzen erinnern konnten? Brutal! Dabei hätte es ein Löffel Honig bestimmt auch getan...
Dummerweise gewöhnt man sich schnell an Süßes und will dann immer mehr. Kann ich aus eigener Erfahrung bestätigen, denn früher habe ich immer Cola statt Wasser getrunken. Einmal an Cola als Hauptgetränk gewöhnt, wollte ich nichts anderes, weil "das schmeckt ja nach nichts". Heute trinke ich als Hauptflüssigkeitslieferant nur noch Mineralwasser. Und habe bemerkt, dass man da durchaus Unterschiede in den Wässern herausschmecken kann. Doch ich schweife ab, hier soll es doch um Technik gehen.
Sonderfunktionen durch spezielle Barcodes
Jetzt habe ich mir also vorgenommen, den ganzen Tag alles zu scannen, was ich so zu mir nehme. Das ist ja ansich kein Problem - ich nehme die Verpackung ja eh aus dem Schrank oder etwas aus der Verpackung. Dann kann ich auch kurz den Scanner dranhalten.
Für meinen Latte Macchiato, von dem ich mir so drei am Tag gönne, hab ich mir allerdings eine Abkürzung gebaut und einen Barcode namen "Latte2Z" gedruckt, der für "Latte Macchiato mit 2 Stück Zucker" steht. In dem Datensatz habe ich die Nährwertsummen von 166ml Milch und zwei Stück Zucker eingetragen.
So muss ich nur einmal Latte2Z scannen, statt einmal den Milchkarton und zweimal den Würfelzuckerkarton. Den "Kassenzettel" mit dem Barcode habe ich vorne an meinem Kühlschrank mit Magneten befestigt. Da ist er bequem zu sehen und zu scannen.
Naechsten Barcode scannen... Latte2Z
Konsum von: Latte Machiato, 1 Glas mit 2 Stk Zucker (mit 166ml 3.5% Vollmilch und 6g Zucker)
100.0 g Packungsgroesse
100.0 g konsumierte Portionsgroesse (100, wenn nachfolgend absolute Werte)
131.9 kcal
6.0 g Fett
4.15 g gesaettigte Fettsaeuren
14.0 g Kohlenhydrate
14.0 g Zucker
5.64 g Eiweiss
0.18 g Salz
Im Prinzip kann ich mit zusätzlichen Barcodes mit Fantasienamen alles steuern, was mir einfällt. Ich muss dann nur das Programm entsprechend erweitern.