Feinstaubsensor PMS7003/5003/3003 + ESP8286 + Arduino

Begonnen von maddhin, 23 September 2017, 17:24:17

Vorheriges Thema - Nächstes Thema

maddhin

Hi,

unter https://github.com/riverscn/pmsx003 gibt es eine super Library mit dem man einen PMS7003/5003/3003 und einem ESP8286 via Arduino IDE zum Laufen bringen kann.

Bisher gibt es noch relativ wenig Foren für den PMS und ich dachte hier finden sich vielleicht Gleichgesinnte. Der billige und gute PMS scheint ja immer populärer zu werden.

Ich habe bisher das Basis-Skript https://github.com/riverscn/pmsx003/blob/master/examples/Simple01/Simple01.ino genommen und Wifi & MQTT hinzugefügt (dann in FHEM ein MQTT_DEVICE). Das funktioniert soweit, aber woran ich scheitere ist den PMS zum schlafen zu bringen und das Ganze mit deep sleep zu kombinieren. Hat da jemand Erfahrung wie man das am Geschicktesten macht? Delays funktionieren nicht, da timed irgendetwas out und man bekommt garkeine Daten vom PMS ;(

Die Library hat ja eine relativ gute Beschreibung, aber als Noob verstehe ich das meiste nicht...

Danke im Voraus!

JoWiemann

Die PMSx... sind auch im Sketch von luftdaten.info: https://forum.fhem.de/index.php?topic=66674.0 vorhanden. Hierfür gibt es auch ein Fhem Modul und einen Wiki-Eintrag: https://wiki.fhem.de/wiki/Luftdaten.info/Feinstaub. Von mir findest Du hier auch einen alternativen Sketch, der noch mehr Sensoren ansprechen kann: https://forum.fhem.de/index.php?topic=73879.0

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

maddhin

Hallo Jörg,

lieben Dank für Deine Arbeit und Hilfe in der Community hier!

Deinen Sketch hatte ich kurz ausprobiert, aber irgendwie wollte der PMS da keine Werte ausgeben - sicherlich ein kleines Problem, aber ich wollte an meinem Sketch weiterarbeiten.

So wie ich das sehe ist diese Konfiguration für den Dauerbetrieb ausgelegt und man kann quasi nichts verändern - meine Programmierkenntnisse sind nicht gut genug um in Deinem Sketch Änderungen vornehmen zu können und für mich ist der Weg quasi das Ziel um eben meine Kenntnisse zu verbessern;)

Was mich auch etwas stört ist, dass die Daten durch den Äther fliegen.

Last but not least: ich möchte den Sensor nutzen, um die Luftqualität innen zu messen - ich lebe leider an einem Ort, wo das notwendig ist. D.h. ich möchte hier dann ggf. noch ein Display oder andere Luftqualitäts-Sensoren anschließen. Ein weiterer Sensor kommt dann auch nach draußen - da bietet sich sicherlich Dein Sketch an!

Grüße Martin

JoWiemann

#3
Hallo Martin, vielen Dank. In der Grundkonfiguration sind alle Übertragungen ausgeschaltet. Auch habe das automatische Update abgeklemmt.

Könntest Du mal Testweise den original Luftdatensketch aufspielen. Wenn da der PMS funktioniert habe ich etwas falsch übernommen. Danke Dir


Gesendet von iPhone mit Tapatalk

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

maddhin

Ja, danke, der Sketch funktioniert inzwischen (siehe anderer Thread), aber eigentlich war ja die Frage wie ich den PMS7003 zum Schlafen bringen kann bzw. nur alle 3, 5, 10, 15 min Meßwerte hole und in der Zwischenzeit den NodeMCU oder Wemos in den Deep Sleep schalte ;)

Mit delays habe ich das nicht hinbekommen, da "timed irgendwas out".

JoWiemann

Hallo,

da hilft Dir das Stichwort: deep sleep weiter. Wobei ich nicht weiß, ob das in diesem Anwendungsfall wirklich sinnvoll ist.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

maddhin


Deep Sleep per se habe ich hinbekommen, ich habe es auch geschafft den PMS zum Schlafen zu bekommen, aber ich schaffe es nicht, den PMS aufzuwecken und den ESP8266 solange warten zu lassen bis der PMS lange genug läuft um ordentliche Ergebnisse zu bekommen. Hier mal der das Ende der Void loop (deep sleep aus):

 
  //PMS7003
  delay(10000);
  //waitForData(5000);
  pms.write(Pmsx003::cmdWakeup);
  pms.waitForData(Pmsx003::wakeupTime);
  pms.write(Pmsx003::cmdModeActive);
  delay(10000);
  const auto n = Pmsx003::Reserved;
 
  Pmsx003::pmsData data[n];

  Pmsx003::PmsStatus status = pms.read(data, n);
 
    switch (status) {
    case Pmsx003::OK:
    {
      Serial.println("_________________");
      auto newRead = millis();
      Serial.print("Wait time ");
      Serial.println(newRead - lastRead);
      lastRead = newRead;

      // For loop starts from 3
      // Skip the first three data (PM1dot0CF1, PM2dot5CF1, PM10CF1)
     
      for (size_t i = Pmsx003::PM1dot0; i < n; ++i) {
        Serial.print(data[i]);
        Serial.print("\t");
        Serial.print(Pmsx003::dataNames[i]);
        Serial.print(" [");
        Serial.print(Pmsx003::metrics[i]);
        Serial.print("]");
        Serial.println();
        String topic_send = no_topic;
        String data_send = String(data[i]);
        if (i == Pmsx003::PM1dot0){
          topic_send = pm1_topic;
           }
        if (i == Pmsx003::PM2dot5){ topic_send = pm25_topic;}
        if (i == Pmsx003::PM10dot0) {topic_send = pm10_topic;}
                       
        Serial.print("Sending [");
        Serial.print(Pmsx003::dataNames[i]);
        Serial.print("] via ");
        Serial.println(topic_send);
        client.publish(String(topic_send).c_str(), String(data[i]).c_str(),true);
       
      }
      break;
    }
    case Pmsx003::noData:
      break;
    default:
      Serial.println("_________________");
      Serial.println(Pmsx003::errorMsg[status]);
 
  pms.write(Pmsx003::cmdModePassive);
  //pms.write(Pmsx003::cmdSleep);
  };
 
  //end sensors
/*
  delay(1000);
 
  Serial.println("Closing MQTT connection...");
  client.disconnect();

  Serial.println("Closing WiFi connection...");
  WiFi.disconnect();

  delay(1000);

  Serial.print("Entering deep sleep mode for ");
  Serial.print(SLEEP_DELAY_IN_SECONDS);
  Serial.println(" seconds...");

  ESP.deepSleep(SLEEP_DELAY_IN_SECONDS * 1000000, WAKE_RF_DEFAULT);

  //ESP.deepSleep(10 * 1000, WAKE_NO_RFCAL);

  delay(500);   // wait for deep sleep to happen */
}


Wenn ich mit dem Delay höher gehe z.B. delay(60000), bekomme ich keine Daten mehr. Wenn ich den PMS in Sleep schalte, wacht er nicht mehr auf... Beides verstehe ich nicht  :o

Dank & Gruß

MadMax-FHEM

Was passiert, wenn du den Sensor per z.B. FET aus- und wieder einschaltest statt ihn in deep sleep zu versetzen?

EDIT: kenne aber den Feinstaubsensor zu wenig (außer dass mich das auch schon mal interessiert hat / aber: zu wenig Zeit und zu viele andere "Baustellen")

Habe auch schon mit ESP und Batteriebetrieb gespielt...
...aber letztendlich "aufgegeben", da selbst mit dickem Akku und kurzer Wachzeit alle halbe Stunde / Stunde keine Laufzeit länger als ein paar Monate ging...

Jetzt hängt er an der Steckdose ;)

Letzte Variante war per ATtiny den gesamten Schaltkreis ein- und nach Beendigung der Messung wieder auszuschalten...

Also immer wieder durch ATtiny gesteuert booten zu lassen...


Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

maddhin

Hi Joachim,

bei FET und ATtiny, weiß ich im Moment garnicht, was das genau ich, werde ich mir aber in den nächsten Tagen anlesen bzw. anexperimentieren... Wenn dann genug Zeit da ist...

In Zusammenhang mit dem PMS habe ich eigentlich auch keine allzugroßen Hoffnungen was deep sleep angeht. Da hat Jörg schon recht.

Dennoch glaube ich, dass PM Messungen im ~10+ min Intervall ausreichend sind. Dazwischen kann man den ESP ja eigentlich schon in den deep sleep gehen lassen, auch wenn er an der Dose hängt.

Im Moment geht es mir nur erstmal darum, überhaupt ein 10min Meßintervall hinzubekommen bei dem der PMS in einen Modus geht bei dem der Lüfter ausgeschaltet ist.

D.h. ein Zyklus von:
1. PMS aufwachen
2. PMS warten bis Senor bereit zu Messung ist (~30-60 sec?)
3. Messung der Daten, ggf. 3 mal und Mittelwerte an Fhem
4. Ruhe- oder Schlafmodus (Lüfter aus, Energiesparen) oder eben deep sleep
5. Warten bis zur nächsten Messung (~10min)

Wenn ich diesen Zyklus hinbekomme, kann ich den PMS mit jedem anderen Senor kombinieren und so eine entsprechende Meßstation bauen. Das ist wichtig, weil ich den PMS innen, nicht außen, einsetzen will bzw. dank Jörg's alternativer Firmware: einsetze.



MadMax-FHEM

FET ist quasi ein "elektronisches Relais"...

Damit kann man mit kleinen Spannungen/Strömen größere Ströme/Spannungen schalten.

Also beispielsweise über einen IO des ESP den Luftsensor ein-/ausschalten...
...oder wie ich: der ATtiny schaltet ESP und Luftsensor (bei mir war es Feuchtigkeit) ein/aus.

D.h. der ATTiny wacht von Zeit zu Zeit auf und schaltet ein wartet und schaltet aus.
ESP und Sensor booten, messen senden und werden wieder ausgeschaltet.

Ich habe es mit ATTiny gemacht, da der noch weniger Strom im deep-sleep braucht bzw. ich so auch meine vorhandenen ESP-1 nutzen die sonst nicht (einfach so) deep-sleep-fähig sind...

Hier glaube ich wird es ganz gut erläutert:

https://www.youtube.com/watch?v=QbrjOjtvrNo

Aber mit Suche nach FET und Arduino findet sich einiges...
...welcher Microcontroller das nun schaltet ist eigentlich egal...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

maddhin

Ich bin jetzt leider lange nicht dazukommen hier weiterzumachen, versuche das aber in den nächsten Tagen hinzubekommen.

@JoWiemann / Jörg: welche Library hattest Du in Deiner alternativen FW benutzt? Ich habe versucht das in der *.ino Datei nachzuvollziehen, aber so wie ich das sehe benutzt Du keine externe Library, oder?

Ich möchte es zumindest mal schaffen, den Sensor so am Laufen zu haben, dass er alle 5 min mehrmals misst und den Mittelwert berechnet und ausgibt. Und das Ganze möglich ohne dann für 5 min die anderen Sensoren zu blockieren weil ich CO2/TVOC zum Beispiel alle 60-120 sek messen möchte (da macht dann erstmal deep sleep keinen großen Sinn!).

Mal sehen, wie weit ich komme, im Moment sieht das nach einer ziemlichen Herausforderung für mich aus;)

JoWiemann

Hallo maddhin, ,,mein" Sketch ist ja nur ein Fork vom Luftdaten.info Sketch. Dort wird keine Lib verwendet. Ich habe auch für die anderen Sensoren auf eine Lib verzichtet, da bestimmte Routinen bei I2C immer irgendwie identisch sind. Und das kostet nur Speicher. Wird bei EspEasy auch so gemacht.


Gesendet von iPhone mit Tapatalk

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

maddhin

Hallo Jörg, wow so spät/früh noch auf? :)

Danke für die schnelle Rückmeldung. Ich spiele mit dem Gedanken, Deinen bzw. den Luftdaten Sketch auf den PMS zu reduzieren und versuchen zu verstehen, was da gemacht wird, aber meine Kenntnisse sind beschränkt und da durchzusteigen ist sehr wahrscheinlich noch eine Nummer zu groß für mich. Der Luftdaten Sketch an sich ist ja schon recht komplex, allein das auf den PMS zu reduzieren wird eine Herausforderung :)
Aber sehr wahrscheinlich wird es darauf hinauslaufen erstmal eine library zu nutzen - der PMS soll ja den (Fein)Staub messen und nicht ansetzen! :))