Feinstaubmessung mit dem Raspberry Pi

  • Ja, so ähnlich mach ich das auch. Nachdem der Feinstaubsensor eine Weile direkt am Raspberry Pi angeschlossen war, hab ich nun doch einen kleinen NodeMCU drangemacht. Somit kann ich ihn nun auch draussen im Schuppen betreiben, ohne ein Kabel verlegen zu muessen. Allerdings verwende ich eine eigene Firmware für den NodeMCU (damit auch das OLED-Display funktioniert). Der Pi bekommt die Daten per UDP ueber WLAN. Wenn die WLAN-Verbindung abreisst, dann speichert der NodeMCU bis zu 256 Datensaetze zwischen und überträgt die dann, wenn die Verbindung wieder da ist. Zeitstempel werden per NTP synchronisiert.

    Ich überlege noch, ob ich dem NodeMCU am Feinstaubsensor noch mehr Aufgaben geben kann. Z.B. könnte man noch einen Geigerzähler anschliessen (oder einen Gamma-Detektor auf PIN Dioden-Basis). Dann kann man noch Radioaktive Wolken messen.

  • noch ein Projekt,um Feinstaub zu messen,,,etwas anders als die üblichen,aber mit linux bzw. dem Raspberry zu verwirklichen.

    es wird der Sensor SDS 011 benutzt in der Form mit Anschluss an den USB Port benutzt.

    den gibt es preiswert auf ebay,den aus China sichbestellen ist sehr aufwändig.

    iEs war ziemlich leicht, die Daten auszulesen (als Raw-Daten). Das war nur der Test, ob der Sensor funktioniert.

    Das Datasheet vom SDS 011 findet man hier hier


    Code
    $ stty –F /dev/ttyUSB0
    9600 raw
    $ od –x –endian=big  /dev/ttyUSB0

    Dann kommen die Werte als Hex-Daten, wobei AAC0 das Datenstartraket ist.

    Danach wurde es kompliziert, zumindest für mich.

    Da Ich die Werte selbst weiterverarbeiten wollte habe ich überall nach einer Lösung gesucht.

    Dann mit Hilfe von meinem Enkel (der hat sie mir gestrickt) die Lösung gefunden.

    Die steht hier, läuft unter Linux Ubuntu 18.04 und dem Raspberry und ist an meine Auswertung angepasst.

  • So Schlafstörungen haben ja was gutes - ich kann in aller Ruhe schreiben und keiner will was8o

    Also hab ich mir nen Beispielcode in Python irgendwo ausm Netz geladen. Ich hab die Funktion welche die Daten holt mal rausgenommen und kommentiert. Das dürfte die Sache wie man an die Dezimalzahlen kommt verständlicher machen.


    im RAW Format bekommt man sowas rein:

    Code
    b'\xaa\xc0\xaa\x0f\xd2\x17\x08o\x19\xab'

    Die \ sind Trennzeichen und man beginnt in einer Liste bei 0 an zu zählen. Das b am Anfang sagt aus das es sich um Bytes handelt.

    für pm25 nimmt man nun byte Nummer 3 ('x0f' = 15) , nimmt es mal 256 und zählt byte Nummer 2 ('xaa' = 170) dazu.

    Das ganze teilt man durch 10 und hat seinen Dezimalwert.

    Für pm10 läufts nach dem gleichen Schema ab, halt mit den passenden Positionen ausm empfangenen String.

    Dazu muss man jetzt auch kein neues Zahlensystem lernen wenn man spicken kann ( oder irgend ne Bibliothek oder so benutzt).

  • Dazu muss man jetzt auch kein neues Zahlensystem lernen wenn man spicken kann ( oder irgend ne Bibliothek oder so benutzt).

    Oder aber Du machst es Dir leicht und nutzt die wie in vielen anderen Sprachen so auch in Python eingebaute Konvertierung der hexadezimalen Zahlen in ein Format Deiner Wahl...?

  • im RAW Format bekommt man sowas rein:

    Code
    b'\xaa\xc0\xaa\x0f\xd2\x17\x08o\x19\xab'

    Die \ sind Trennzeichen und man beginnt in einer Liste bei 0 an zu zählen. Das b am Anfang sagt aus das es sich um Bytes handelt.

    Nein!

    Der Backslash ("\") mit einem darauffolgendem "x" zeigt an, dass die folgenden Zeichen Hexadezimalwerte sind.

    Siehe auch hier: https://stackoverflow.com/questions/2672…thon-string-xaa

  • Falscher (Denk)Ansatz!

    Die von dir gemacht und von mir korrigierte Aussage definiert ein programmiertechnisches Feature/Design falsch (du: Trennzeichen).

    Da hier viele Newcommer und (Programmier-)Laien unterwegs sind, führt das zu Irritationen und fehlerhaftem (Halb-)Wissen.

    Solange Rechtschreibfehler die Lesbarkeit nicht drastisch reduzieren, überliest oder ignoriert man die (jedenfalls die meisten, solange die Aussagen sich nicht durch den RSF ändert).

    z.B.: Feinstaub/Feilstaub :)

  • Hallo zunächst an die Experten hier im Forum,

    ich bin derzeit auch dabei ein Projekt mit dem o.g. Feinstaubsensor aufzubauen, hänge aktuell aber fest, eigentlich keine große Sache, komme jedoch nicht weiter ...

    In der Suche bin ich auch nicht fündig geworden, vielleicht hat einer von euch einen heißen Tipp, es geht um folgendes:

    Bin am Aufbau des Projekts, gemäß der folgenden schön gemachten Anleitung zur Auswertung des Feinstaubsensors:

    https://kuehnast.com/s9y/index.php?…spberry-Pi.html

    Der Sensor ist korrekt installiert, die Schnittstelle lässt sich auch manuell mit "dmesg" anzeigen.

    Allerdings kennt der "Octal Dump" die folgenden Befehle nicht:

    Code
    od –endian=big
    od ––endian=big

    Es erscheint dann folgender Fehler im Output:

    Code
    pi@raspberrypiraspbian ~ $ od -x -endian=big  /dev/ttyUSB0
    od: ungültige Option --  ânâ
    âod --helpâ gibt weitere Informationen.

    Auch so läuft's nicht:

    Code
    pi@raspberrypiraspbian ~ $ od -x --endian=big /dev/ttyUSB0
    od: unbekannte Option â--endian=bigâ
    âod --helpâ gibt weitere Informationen.

    Mit nur "-x" läuft es jedoch komischerweise:

    Code
    pi@raspberrypiraspbian ~ $ od -x /dev/ttyUSB0
    0000000 c0aa 0018 0066 43ee abaf c0aa 0018 0061
    0000020 43ee abaa c0aa 0019 0062 43ee abac c0aa
    0000040 0019 0064 43ee abae c0aa c0aa 0016 0066

    Das Betriebssystem ist ein aktuell gehaltenes Raspbian Wheezy auf einem Raspberry Pi Version 3

    Irgendwie komme ich nicht weiter, hat jemand vielleicht eine Idee?

    Danke

    Gruß Johannes

    4 Mal editiert, zuletzt von razorback (20. Januar 2019 um 15:15)

  • Danke für eure Antworten.

    Ne, läuft leider nicht:

    Code
    pi@raspberrypiraspbian ~ $ od -x --endian=big /dev/ttyUSB0
    od: unbekannte Option â--endian=bigâ
    âod --helpâ gibt weitere Informationen.

    Unter help kommt das hier:

    endian finde ich hier nirgendwo ...

    Kann es sein, dass noch etwas nachinstalliert werden muss?

    Gruß Johannes

  • Ups, hab ich übersehen dass Du den richtigen Befehl auch schon probiert hast.

    Ich habe es eben auf einem Pizero mit dem aktuellen Raspbian ausprobiert. Bei mir nimmt er den Befehl ohne meckern an.

    zu "endian". Ausschnitt aus "man od" auf meinem Pizero:

    Spoiler anzeigen

    NAME

    od - dump files in octal and other formats

    SYNOPSIS

    od [OPTION]... [FILE]...

    od [-abcdfilosx]... [FILE] [[+]OFFSET[.][b]]

    od --traditional [OPTION]... [FILE] [[+]OFFSET[.][b] [+][LABEL][.][b]]

    DESCRIPTION

    Write an unambiguous representation, octal bytes by default, of FILE to standard output. With more than one FILE argument, con-

    catenate them in the listed order to form the input.

    With no FILE, or when FILE is -, read standard input.

    If first and second call formats both apply, the second format is assumed if the last operand begins with + or (if there are 2

    operands) a digit. An OFFSET operand means -j OFFSET. LABEL is the pseudo-address at first byte printed, incremented when dump

    is progressing. For OFFSET and LABEL, a 0x or 0X prefix indicates hexadecimal; suffixes may be . for octal and b for multiply

    by 512.

    Mandatory arguments to long options are mandatory for short options too.

    -A, --address-radix=RADIX

    output format for file offsets; RADIX is one of [doxn], for Decimal, Octal, Hex or None

    --endian={big|little}

    swap input bytes according the specified order

    Irgendwas scheint mit Deinem Zeichensatz nicht zu stimmen.

    Hast Du mal versucht in "raspi-config" unter "localisation options -> change locale" ob es mit einem anderen Zeichensatz funktioniert?

    Edit: Ich habe mir Deine Fehlermeldung nochmal angeguckt. Es scheint so als wenn hinter "big" noch ein (unsichtbares) Zeichen

    Zeichen steht. Darum auch die Meldung "unbekannte Option â--endian=bigâ".

    Hast Du den Befehl per Hand eingegeben oder per "paste and copy"?

    Einmal editiert, zuletzt von ait (20. Januar 2019 um 16:07)

  • Danke, den Zeichensatz in Putty hab ich umgestellt auf UTF-8, im Betriebssystem hat's schon gepasst, läuft aber trotzdem nicht:

    Code
    pi@raspberrypiraspbian ~ $ od -x --endian=big /dev/ttyUSB0
    od: unbekannte Option „--endian=big“
    „od --help“ gibt weitere Informationen.

    Aber es müsste doch unter --help aufgeführt sein oder täusche ich mich?

    Kannst du mal bitte bei dir schauen ob endian unter --help als Parameter gelistet wird?

    Komme einfach nicht drauf was hier das Problem sein könnte ...

  • Sehr sonderbar ...

    Code
    pi@pi-lcurr:~ $ sudo od -x --endian=big /dev/ttyS0 
    ^C
    pi@pi-lcurr:~ $ uname -a
    Linux pi-lcurr 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux
    pi@pi-lcurr:~ $ 

    //EDIT:

    Aber es müsste doch unter --help aufgeführt sein oder täusche ich mich?

    Wenn ich es nicht überlesen habe, erscheint die Option nicht:

    Spoiler anzeigen

    pi@pi-lcurr:~ $ od --help

    Aufruf: od [OPTION]... [DATEI]...

    oder: od [-abcdfilosx]... [DATEI] [[+]OFFSET[.][b]]

    oder: od --traditional [OPTION]... [DATEI] [[+]OFFSET[.][b] [+][LABEL][.][b]]

    Eine eindeutige Darstellung der DATEI, auf Standardausgabe ausgeben (Vorgabe:

    Oktalzahlen). Bei mehr als einem Argument DATEI, die Dateien in der

    angegebenen Reihenfolge einlesen.

    Ohne DATEI oder wenn DATEI „-“ ist, Standardeingabe lesen.

    Wenn die erste und zweite Aufrufform beide zutreffen, wird das zweite Format

    angenommen, wenn der letzte Operand mit + oder (wenn es zwei Operanden gibt)

    einer Ziffer anfängt. Ein OFFSET‐Operand bedeutet -j OFFSET. MARKE ist die

    Pseudoadresse des ersten auszugebenden Bytes; sie wird entsprechend erhöht,

    wenn die Ausgabe fortschreitet. Für OFFSET und MARKE bedeutet ein „0x“‐ oder

    „0X“‐Präfix hexadezimal; Endungen können „.“ für oktal und „b“ für Vielfaches

    von 512 sein.

    Erforderliche Argumente für lange Optionen sind auch für kurze erforderlich.

    -A, --address-radix=BASIS entscheiden, wie Dateioffsets ausgegeben werden

    BASIS kann [doxn] für Dezimal, Oktal, Hex oder

    Keine sein

    -j, --skip-bytes=BYTES BYTES Eingabebytes am Anfang jeder Datei

    übergehen

    -N, --read-bytes=BYTES Ausgabe auf BYTES Eingabebytes pro Datei

    begrenzen

    -S Bytes, --strings[=BYTES] Ketten mit wenigstens BYTES alphanumerischen

    Zeichen ausgeben. Vorgabe ist 3 falls BYTES

    nicht angegeben

    -t, --format=TYP Ausgabeformat(e) wählen

    -v, --output-duplicates nicht * benutzen, um Zeilenunterdrückung

    anzuzeigen

    -w[BYTES], --width[=BYTES] Anzahl BYTES pro Ausgabezeile ausgeben.

    Vorgabe ist 32 falls BYTES nicht angegeben

    --traditional Argumente in dritter, oben angegebener Form

    akzeptieren

    --help diese Hilfe anzeigen und beenden

    --version Versionsinformation anzeigen und beenden


    Traditionell spezifizierte Formatangaben können gemischt werden; sie werden

    akkumuliert:

    -a dasselbe wie -t a, benannte Zeichen wählen, oberstes Bit ignorieren

    -b dasselbe wie -t o1, Oktalbytes wählen

    -c dasselbe wie -t c, ASCII‐Zeichen oder Rückschrägstrich‐Escapes wählen

    -d dasselbe wie -t u2, dezimale vorzeichenlose 2‐Byte‐Zahlen wählen

    -f dasselbe wie -t fF, Fließkommazahlen wählen

    -i dasselbe wie -t dI, dezimale Integer wählen

    -l dasselbe wie -t dL, dezimale Longs wählen

    -o dasselbe wie -t o2, oktale 2‐Byte‐Zahlen wählen

    -s dasselbe wie -t d2, dezimale 2‐Byte‐Zahlen wählen

    -x dasselbe wie -t x2, hexadezimale 2‐Byte‐Zahlen wählen


    TYP setzt sich zusammen aus einer oder mehreren dieser Spezifikationen:

    a ein benanntes Zeichen, oberstes Bit ignorieren

    c ASCII‐Zeichen oder Rückschrägstrich‐Escape

    d[ANZAHL] dezimal mit Vorzeichen, ANZAHL Bytes pro Zahl

    f[ANZAHL] Fließkomma, ANZAHL Bytes pro Zahl

    o[ANZAHL] oktal, ANZAHL Bytes pro Zahl

    u[ANZAHL] dezimal ohne Vorzeichen, ANZAHL Bytes pro Zahl

    x[ANZAHL] hexadezimal, ANZAHL Bytes pro Zahl

    ANZAHL ist eine Zahl. Wenn TYP einer von „d“, „o“, „u“, oder „x“ ist, kann

    ANZAHL auch „C“ für sizeof(char), „S“ für sizeof(short) , „I“ für sizeof(int)

    oder „L“ für sizeof(long) sein. Wenn TYP „f“ ist, kann ANZAHL auch „F“ für

    sizeof(float), „D“ für sizeof(double) oder „L“ für sizeof(long double) sein.

    Durch Anhängen von „z“ an einen beliebigen Typ werden am Ende jeder ausgegebe-

    nen Zeile druckbare Zeichen angezeigt.


    BYTES ist hexadezimal bei vorangestelltem 0x oder 0X und kann folgende

    multiplikative Endungen haben:

    b 512

    kB 1000

    K 1024

    MB 1000×1000

    M 1024×1024

    und so weiter für G, T, P, E, Z, Y.

    GNU coreutils Onlinehilfe: <http://www.gnu.org/software/coreutils/>

    Melden Sie Übersetzungsfehler für od an <translation-team-de@lists.sourceforge.net>

    Die vollständige Dokumentation ist hier: <http://www.gnu.org/software/coreutils/od>

    oder auch lokal mittels „info '(coreutils) od invocation'“

    pi@pi-lcurr:~ $

    cu,

    -ds-

  • Moin,

    Zitat

    Kannst du mal bitte bei dir schauen ob endian unter --help als Parameter gelistet wird?

    unter "--help" bei mir auch nicht.

    Jetzt hast Du ein " hinter big. Ich vermute dass Putty oder Windows, falls Du es benutzt, Dir das Zeichen da rein "schmuggelt".

    Da ich beides nicht benutz kenne ich mich damit nicht aus. Mein Test lief von einem Debian PC über SSH auf dem Pizero mit Raspbian Stretch.

  • Nach etlichen weiteren und leider erfolglosen Versuchen habe ich nun "Raspbian Jessie" installiert.

    Und was soll ich sagen, läuft auf Anhieb perfekt:

    Code
    pi@raspberrypiraspbian ~ $ od -x --endian=big /dev/ttyUSB0
    0000000 aac0 4d00 c600 ee43 44ab aac0 4d00 c900
    0000020 ee43 47ab aac0 4d00 c600 ee43 44ab aac0
    0000040 4d00 c500 ee43 43ab aac0 aac0 4900 b600
    0000060 ee43 30ab aac0 4a00 b300 ee43 2eab aac0

    Keine Ahnung wieso das bei meinem Raspbian Wheezy nicht läuft, es bleibt für mich ein Mysterium ...
    Jedenfalls nochmals Danke für die guten Tipps!

    Gruß Johannes

    Einmal editiert, zuletzt von razorback (23. Januar 2019 um 14:24)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!