Feinstaubsensor schlafenlegen


#1

Um den Stromverbrauch des Box zu senken, möchte ich den Feinstaubsensor für mehrere Minuten schlafen legen. Aus dem Protokolldatenblatt entnehme ich dazu eine Sequenz von 19 Bytes, die man an den Sensor senden kann. Aus dem Listing des Mustersketches entnehme ich, dass dafür die Library “SDS011-select-serial.h” zuständig ist.
Weiter entnehme ich dem Listing dass ein Kommando SDS.read(&pm25,&pm10) gibt.
Gibt es auch ein Kommando SDS.write oder wie kann ich die Bytefolge an den Sensor schicken und wie kann ich die Antwort entgegen nehmen?


#2

Die Library für den SDS besitzt die Funktion SDS.sleep() über die der Sensor schlafen gelegt werden kann und über SDS.wakeup()kann der Sensor wieder aufgewacht werden.


#3

Danke @mario.
Zusatzfrage wie komme ich an die Doku für solch eine Library?


#4

Die Library findest du hier. In der .h finden sich alle Funktionen, die verfügbar sind. Die Dokumentation für die Library muss allerdings noch um die sleep()und wakeup Funktionen erweitert werden


#5

Es funktioniert mit sleep() und wakeup(). Nur das Ergebnis hat mich etwas enttäuscht:
Mit aktivem SDS 170mA
Mit SDS im Ruhezustand 110 mA

Zur Teststation senseBox:edu mit HDC1080, BMP280 sowie TSL45315 & VENL6070 und natürlich SDS011.
@OllyS mit sleep() und wakeup() funktioniert es prächtig.


#6

hallo Zusammen,
leider hat die Library “SDS011-select-serial.h” bei mir nicht ganz perfekt funktioniert. Das wakeup() hat bei mir nicht funktioniert. In der SDS-serial-serial.cpp steht in der Funktion wakeup():

void SDS011::wakeup() {
sds_data.write(0x01);
sds_data.flush();
}

Lt. SDS011-Manual (https://nettigo.pl/attachments/398) brauchts ein paar mehr Bytes für das Kommando WAKEUP.
Nach dem ich die Funktion wie folgt angepasst habe, läufts.

void SDS011::wakeup() {
// Sleepcmd Byte5 +1
// Sleepcmd Byte18 +1 (checksum)
for (uint8_t i = 0; i < 19; i++) {
if (i == 4 || i == 17) {
sds_data.write(SLEEPCMD[i] + 1);
} else {
sds_data.write(SLEEPCMD[i]);
}
}
sds_data.flush();
while (sds_data.available() > 0) {
sds_data.read();
}
}

Das Stromsparen ist damit aber auch bei mir nicht wirklich berauschend.(ca 180mA vs. ca.110mA) Es bringt mehr den Sensor über
senseBoxIO.powerUART(true); //bzw (false)
komplett auszuschalten und dann auch wieder einzuschalten.
Wirklich effektiv ist es den Prozessor und IO-Hardware in den Tiefschlaf zu versetzen. Das ist aber ein neues Thema.

Bernd


#7

Hallo zusammen,

das war eine ausführliche Antwort. Laut SDS Datenblatt muss wirklich eine ganze Bytefolge an den Sensor geschickt werden. Es scheint aber wirklich auch anders zu gehen wie beim HackairProjekt ( https://github.com/hackair-project/hackAir-Arduino/blob/master/src/hackair.cpp) zu sehen ist. Anscheinend reagiert in manchen Fällen der Sensor auch, wenn er einfach irgendetwas empfängt.
Das Abschalten des UART-Ports ist eine gute Idee, bringt aber laut Datenblatt nur 4 mA, die der Sensor im Ruhezustand verbraucht.
Die offiziellen Angaben von senseBox mit 100 mA Incl. Feinstaubsensor sind nur erklärlich, wenn nur der Feinstaubsensor alleine angeschlossen ist.
P.S: @Fuchsbau ist Deine Station in Mannheim?


#8

Hallo Altprog,
52,6951 13,173186 Fuchsbau-OHV (is aber noch ne Baustelle)

Bernd


#9

@Fuchsbau

Hallo,
janz weit weg. Velten bei Berlin?


#10

Danke dir für den Fix Bernd. Denkt aber daran, dass der Sensor sich erst “aufheizen” muss bevor ihr wieder mit den Messungen beginnt.


#11

Reichen 10 s zum “Aufheizen”?


#12

Lt. SDS011-Manual (https://nettigo.pl/attachments/398) soll man 30s warten.