Feinstaub messen mit PM2.5 Sensor

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Hallo Willi,
      wird wohl nicht alles „richtig so“ |sein, dann würdest du wohl nicht nachfragen.
      Ja wenn du, den für mich nicht nachvollziehbaren Anhang meinst, er ist leserlich.
      Spaß genug.
      Beschreibe mal, wo drückt der Schuh. Eins vorab ich habe solche Sensoren nicht zum Test rumzuliegen.Wenn es darum geht irgendwelche Datenströme lesbar zu zerlegen, wirst du hier im Forum, bestimmt Hilfe bekommen.

      Auf die Plätze los. Diskussion kann beginnen.

      Mit freundlichen Grüßen
    • WilliW schrieb:

      Hallo Michael : s.o. PM2.5 Sensor
      du bist nicht allein auf der Welt und es gibt deshalb auch mehr als einen Sensor da draußen.
      Der hier z.B.

      ti.com/lit/ug/tidub65c/tidub65c.pdf

      Ich würde dir ja helfen, aber für den von mir verlinkten Sensor passt dein Programmansatz überhaupt nicht.


      WilliW schrieb:

      Ich denke am Anfang:

      Dim Staub As String *10 'DatenString 10 Byte Bytes von Sensor
      Die Variable benutzt du nicht an der Stelle, an der die serielle abgefragt wird.
    • Und wo hast du die seriellen Daten her? Ist das die Variable 'B', die in deiner isr gefüllt wird? Dann musst du vielleicht nur noch Staub=b schreiben, die Staub verwendest du ja zum Berechnen.


      Ja, ich hab's grad gesehen, du hast ein overlay.
      Aber wenn du schon mit b ein array hast, warum machst du einen string draus um den dann wieder in einzelne bytes zu wandeln (und dabei vielleicht Fehler machst)?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()

    • Den Overlay-Hinweis wollte ich noch bringen, Michael war aber beim Editieren schneller :)

      Der Sensor liefert die Daten (10 Bytes) als Hex-Wert. In Hex benötigt die Darstellung eines Daten-Bytes 2 Bytes Speicherplatz > Empfangsstring zu klein, Buffer overrun


      Beim Auswerten der Daten sehe ich keine Umwandlung von Hex in Bytes...


      So in etwa sollte es funktionieren (nicht getestet):


      BASCOM-Quellcode

      1. Dim Staub As String * 20
      2. Dim Hexstr As String * 2
      3. Dim Result As Word
      4. Dim ResultLow As Byte At Result Overlay
      5. Dim ResultHigh As Byte At Result + 1 Overlay
      6. Hexstr = Mid(Staub, 5, 2) ' Low byte PM2.5
      7. ResultLow = Hex(Hexstr)
      8. Hexstr = Mid(Staub, 7, 2) ' High byte PM2.5
      9. ResultHigh = Hex(Hexstr)
      10. Result = Result / 10
      Alles anzeigen
      Edit:
      Nehme alles zurück, der Sensor sendet die Daten binär, habe mich da vom Datenblatt irritieren lassen.

      Edit2:
      Val() ist das das Problem, Asc() wäre richtig

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von zaubara ()

    • tschoeatsch schrieb:

      Und wo hast du die seriellen Daten her? Ist das die Variable 'B', die in deiner isr gefüllt wird? Dann musst du vielleicht nur noch Staub=b schreiben, die Staub verwendest du ja zum Berechnen.


      Ja, ich hab's grad gesehen, du hast ein overlay.
      Aber wenn du schon mit b ein array hast, warum machst du einen string draus um den dann wieder in einzelne bytes zu wandeln (und dabei vielleicht Fehler machst)?
      Hast es schon im Ansatz erkannt (Uard kann nur Byte lesen/schreiben) um diese in einen String zu „packen“ benötigt der Speicherbereich immer ein bekannten Zähler.
      Ja den Zählerindex sehe ich momentan auch nicht.

      Michael schrieb:

      Ups, ich nehm das zurück, ist ja Overlay
      Nein, Nein, dies macht doch seine Problem zum Problem. Er speichert Daten wie wild, würde ich mal so sagen.
    • fredred schrieb:

      Ja den Zählerindex sehe ich momentan auch nicht.

      Michael schrieb:

      Ups, ich nehm das zurück, ist ja Overlay
      Nein, Nein, dies macht doch seine Problem zum Problem. Er speichert Daten wie wild, würde ich mal so sagen.
      Hier die Hauptschleife:

      Quellcode

      1. Do
      2. If Daten_count = 10 Then ' Datenzähler wird hochgezählt von Onrxd
      3. Interrupt ( pro Byte Empfang
      4. Print #1 , Staub ' Staub-Werte
      5. ' Hex : AA C0 C5 03 3B 04 EB DB B7 AB
      6. Daten_count = 0
      7. Gosub Staub_auswerten: ' Daten vom Sensor auswerten
      8. End IF
      9. Loop
      10. End
      11. ' ----- Interrupt-Routine Empfang Daten vom PM Sensor ------------
      12. MessFeinstaub: ' Sup Interrupt Urxc
      13. Incr Daten_count ' Datenzähler um 1 erhöhen bis 10 Byte da
      14. b(Daten_count) = Udr ' Byte aus USart hole und die x. Stelle von Daten_count nach Staub
      15. Return
      Alles anzeigen
    • zaubara schrieb:

      Beim Auswerten der Daten sehe ich keine Umwandlung von Hex in Bytes...
      Wie kommst du auf hex?
      Ich sehe im Datenblatt keinen Hinweis, da ist von Low- und High-Byte die Rede:
      nettigo.pl/attachments/398
      Also ganz normale Verbindung.

      Der Fehler im Programm liegt eher im sturen Abzählen von 10 Bytes in der Hauptschleife.
      Das gibt ein Problem bei der Synchronisation.

      Hier muss im seriellen Interrupt einfach der Zähler bei einem 0xAA auf Anfang gesetzt werden und die neun Folgebytes aufsummiert werden, wie jetzt auch.
      Bei einem AB im Telegramm wird dann der serielle Strom umkopiert und in der Hauptschleife wird nur der kopierte Datensatz zerlegt.
      Strings sind hier unnötig und im Datenblatt gibt es auch eine Beispielrechnung ohne diese.
    • Ja, habe ich bereits oben editiert (wohl während du deine Antwort geschrieben hast), das mit den Hex-Werten war ein Irrweg meinerseits.
      Ad. Strings/Synchronisation: kann ich grundsätzlich nur zustimmen.
      Für einen Test sollte es aber trotzdem so auch funktionieren, wenn denn die richtigen String-Funktionen verwendet werden :) (auch oben editiert, Val()/Asc() - Verwechslung)
    • Hallo Zusammen,
      Danke für Eure Mühe,bin aber nicht weiter.
      Zur Erklärung: Der Feinstaubwert setzt sich zusammen aus den High + Low Bytes ( 3+4 / 5+6) im Datensatz des Sensors.
      Mit diesen Werten muss ich rechnen laut Datenblatt.
      Habe den empfangenen Datensatz ja beigefügt ist o.k. . Die Prints sind nur zur Kontrolle was im Program passiert. ( später gehts aufs Display )
      Die Daten habe ich mit Mid heraus gefiltert. In den Prints zu sehen, die stimmen.
      Mein Problem, ich muss mit diesen Daten ( 2Low,2High / 10Low, 10High ) rechnen.
      und da klemmt es bei mir . Die Rechnung ist immer 0.
      Anstatt Val habe ich jetz auch Asc versucht = 0

      Hab auch die Variablen schon in Byte,Long usw. geändert, ich da irgendwo was falsch.

      Gruss Willi
    • WilliW schrieb:

      Die Rechnung ist immer 0.
      Du hast mehrere Fehler im Programm.

      Erstmal benutzt du vermutlich die falschen Pins für die serielle.
      Deine Open-Deklarationen deuten darauf hin.
      Dann benutzt du den URXC Interrupt, der nur von der echten Hardware ausgelöst werden kann.
      Also PinD.0 und PinD.1

      Dann benutzt du String-Variablen, wo Bytes ankommen, wobei Strings gar nicht nötig sind.

      Dann ist da noch das besagte Sync-Problem.

      Du solltest also folgende Dinge abändern, um zum Erfolg zu kommen:

      -Umstellen auf Hardware Pins für die serielle, damit der Interrupt auch funktioniert.
      -Im URXC Interrupt wird als erstes der Wert des UDR gesichert (als allererstes)
      -Dann prüfst du den Wert auf Hex(AA)
      Ist er AA, dann wird der Zähler auf 1 gesetzt
      Ist er es nicht, dann wird der vorher gesicherte Wert des UDR in das Array(Zähler) gesichert.

      Damit ist der Empfang abgeschlossen (Überläufe später für die Fortgeschrittenen)

      In der Hauptschleife berechnest du den Wert des Array(2) und Array(3) für den 2.5er Wert

      Soweit klar erst mal?
    • Was mir auffällt:
      ich würde statt integer word verwenden. Integer kann als negative Zahl interpretiert werden, ist bei einer Zusammensetzung dann blöd.
      Wenn du Einzelbuchstaben raus zupfst, dann würde ich auch Einzelbuchstaben dimen, also dim 2Low as string*1.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Dein Problem ist nach wie vor das du das Array B() zwar füllst aber es nirgendwo an die Variable "Staub" übwegibst.
      "Staub" ist immer leer also sind deine anderen Variablen in der SUB Staub_auswerten auch immer leer ( = 0 ).
      Wenn du genau weisst an welcher Stelle im Array B() die Bytes stehen die du zum berechnen brauchst kannst du die auch direkt über den Index an deine anderen Variablen übergeben.

      BASCOM-Quellcode

      1. 2l = B(2)
      2. 2h = b(1)
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.