MQ-135 auf Pico W

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo ihr Lieben,

    ich habe einen Luftsensor MQ-135 am RSP4 mit der "https://tutorials-raspberrypi.de/raspberry-pi-g…n-und-auslesen/" Anleitung zum laufen bekommen.

    Wie bekomme ich den Sensor MQ-135 auf meinem Pico W unter Micropython zum laufen?

    "https://cdn.shopify.com/s/files/1/1509…028124689217935"

    habe ich herunter geladen von "https://www.az-delivery.de/products/mq-135-gas-sensor-modul"

    3,3V

    GND

    A0 vom Sensor an ADC0 vom Pico. Ich verstehe diesen Anschloss so, dass eben kein AD-Wandler mehr dazwischen muss.

    Wie macht ihr das? Falls es jemand schon getestet hat....

  • Zur hilfreichsten Antwort springen
  • Moisnen,

    Wenn der Sensor mit 5,0 V betrieben wird, musst du Software-seitig den ADC genau seine Referenzspannung / Meßbereich ) auf 3,3 V stellen, und dann auf eine geeignet Art die maximale Ausgangsspannung des Sensor OUT auf 3,3 V reduzieren. Das kann über einen Spannungsteiler erfolgen, das kann durch eine solchen Levelshifter erfolgen, wobei diese Methode mit dem internen Pull-UP eher zu einer Wertverfälschung beiträgt. Oder wenn dir bekannt ist, welcher Ausgangsstrom der Sensor überhaupt liefern kann, einen OPV zur Meßstromverstärkung mit einem Spannungsdividierer kopplen und dann in den ADC leiten.

    Franky

  • Hallo,

    ich bestrome mit 5v und mit Hilfe des HW-221 setzte ich den analogen Ausgang auf 3,3v herunter zum ADC Eingang des Pico W.

    Folgende Fehlermeldung erscheint "AttributeError: 'ADC' object has no attribute 'read'"

    Diese Bibliothek verwende ich, die nicht mal Fehlerfrei durch läuft.

    Den ADC Port teste ich mit:

    from machine import ADC

    adc = ADC(26)

    val = adc.read_u16()

    print('Geräusche: ',val)


    Mit Erfolg.

  • Moinsen

    Das ist doch auch ganz normal !
    Zur Referenzierung muss du der Bibliothek nach dem INIT auch die Werte für Temperatur und Luftfeuchtigkeit übergeben.
    Also brauchst du noch einen zweiten Sensor wie einen GHY21 oder BME280 um das real zu ermitteln.
    Siehe Zeile 97. Wenn das nicht halbwegs passt wird das auch nichts

    Franky

  • Moinsen,

    neben der Anmerkung von KleinDev kommen hier noch weitere, den RAW-Wert verschiebende Faktoren hinzu.
    So gibt in der aktuellen Version von Micropython für RP2040 nur die ADC Abfragefunktion adc.read_u16(), welche einen 16 Bit RAW zurückgibt. Dieser hat einen Bereich von 0 bis 65535 und nicht wie tatsächlich 0 - 4095, denn in Wirklichkeit hat der ADC des RP2040 nur eine Auflösung 12 Bit .

    Damit ist auch die Auswertung in Zeile 61 fehlerhaft.

    Code
        def get_resistance(self):
            """Returns the resistance of the sensor in kOhms // -1 if not value got in pin"""
            adc = ADC(self.pin)
            value = adc.read()
            if value == 0:
                return -1
    
            return (1023./value - 1.) * self.RLOAD

    Hier wird von einem 10 Bit ADC ( 0 - 1023 ) ausgegangen. Die Schreibweise mit dem "." zur Floatpoint-Umwandlung ist bei µPython nicht notwendig.

    Weiterhin gibt es eine Funktionseinschränkung der Funktion math.pow, so dass die Schreibweise x ** y aber auf Kosten der Verarbeitungszeit math.pow(x , y) vorzuziehen wäre.
    -> Siehe dazu Zeilen 69, 74, 78, 83

    Hier wäre es gut zu erfahren, für welchen µController der Autor ( Quellenangabe ) diese aufgezeigte Bibliothek geschrieben hat.

    Franky

    Einmal editiert, zuletzt von Franky07 (10. Januar 2023 um 10:10)

  • Hallo,

    Danke für die Rückmeldung.

    Ich werde die Tage weiter machen. Bin gerade Beruflich ausgelastet. Ich melde mich.

    Aber ich kann sagen, die aktuellste Micropython Version für den PicoW verwende ich vom 20.12.2022.

    Ich frage mich nur, wie Andere den MQ-135 verwenden? Der wird doch mehrfach verkauft.

    Naja. Am WE gehts weiter.

  • Moinsen,

    Wie schon erwähnt wurde, vielleicht solltest du mal die Quelle dieses Codes bekanntgeben !?
    MicroPython ist nicht gleich MicroPython, besonders wenn um die unterschiedlichen Controller-Boards geht, auf dem dieses installiert werden kann.
    ZB bei den Produkten aus dem Hause Espressif, welche den ESP8266 und ESP32 Chip produzieren reicht dieses einfache READ.

    Franky

  • Hallo,

    ersetze mal in Zeile 54-60 von 'mq135' hierdurch:

    Code
        def get_resistance(self):
            """Returns the resistance of the sensor in kOhms // -1 if not value got in pin"""
            adc = ADC(self.pin)
            value = adc.read_u16()
            return -1 if value == 0 else (65535 / value - 1) * self.RLOAD

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

    • Hilfreichste Antwort

    Moinsen,

    Wie schon gesagt, wenn du diese Anpassungen vornimmst sollte der Code laufen

    Dennoch würde ich an deiner Stelle zur besseren Kalibrierung einen entsprechenden Sensor für Temperatur und Luftfeuchtigkeit vorsehen. Der Code für den GY-21 HTU21, der hier nur symbolisch ohne andere, mögliche preiswertere Quellen aufzeigen zu wollen:

    Franky

  • Hallo,

    tausend Dank!

    Er läuft.

    Ich habe die Zeilen 57 und 61 entsprechend angeglichen.

    Ferner einen DHT11 mit eingebunden.

    Jetzt geht es für mich noch um die Interpretation der ausgegebenen Werte. (Was wird mir angezeigt).

    Temperatur und Luftfeuchte ist mir klar.

    DHT11 Temperature: 22 Humidity: 48

    MQ135 RZero: 90.50353 Corrected RZero: 92.92871 Resistance: 56.37128 PPM: 261.504 Corrected PPM: 236.589ppm

    Was soll da CO2 sein? Das sollte ein Wert um die 412ppm sein. Ich denke, Kalibrieren wird das Stichwort sein. In der mq135.py sind Werte vorgegeben. Das teste ich mal.

    2 Mal editiert, zuletzt von Bluhminga (15. Januar 2023 um 13:40)

Jetzt mitmachen!

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