112 keer bekeken / views
Dit project is gesponsord door 
In een eerdere post beschrijf ik de ontwikkeling van een aerosolsensor die meet hoeveel fijnstof er in de lucht zit en deze waarden doorgeeft aan een MQTT-broker. De gemeten waarden kunnen vervolgens bijvoorbeeld worden gebruikt om de ventilator van de centrale afzuiginstallatie aan te sturen.
Het is verrassend om te ontdekken hoeveel variatie er kan zitten in de hoeveelheid fijnstof, afhankelijk van bijvoorbeeld verkeer, houtkachels, ventilatie of gewoon waar je je bevindt. Dat bracht me op het idee om een klein, draagbaar apparaat te bouwen waarmee ik lokaal metingen kan doen.
In plaats van de PMS5003-sensor die ik in mijn vorige ontwerp heb gebruikt, wil ik nu de SPS30-sensor gebruiken (beide sensoren zijn van Sensirion).
Om echt draagbaar te zijn moet het ontwerp aan een aantal criteria voldoen:
- Omdat het draagbaar is moet het met een batterij of accu gevoed worden;
- Het stroomverbruik moet in rust (als het dus niet gebruikt wordt) zo laag mogelijk zijn om de accu niet te zwaar te belasten;
- De gemeten gegevens moeten op een display getoond worden.
Ontwerp keuzes
- In plaats van een ingewikkeld PCB-ontwerp wil ik zoveel mogelijk gebruikmaken van standaardmodules.
- Als accu wil ik een 18650 Li-ion cel gebruiken. Deze zijn makkelijk te verkrijgen, hebben een grote capaciteit en zijn niet al te groot.
- Als centrale processor wil ik een ESP32-bordje gebruiken. Deze hebben voldoende geheugen en processing power voor de sensor.
- In eerste instantie dacht ik aan het gebruik van deep sleep als het apparaat niet in gebruik is. Maar de meeste ESP32-bordjes hebben, door bijvoorbeeld de LDO, ook in deep sleep nog steeds een stroomverbruik van enkele tientallen milliampères. Daarom ben ik op zoek gegaan naar een manier om de hele unit los te koppelen van de accu en alleen aan te koppelen als het apparaat in gebruik is (en dus daadwerkelijk aan het meten is).
De oplossing is een zogenaamd soft latch-circuit. Hiermee wordt, door middel van een (p-channel) MOSFET, de stroom tussen de accu, de ESP32, de sensor en het e-Paper-display volledig verbroken. Het stroomverbruik in de “uit”-stand is daarbij slechts een paar µA. - Om de meetgegevens weer te geven wil ik een display gebruiken, maar de meeste displays tonen alleen data als er spanning op staat. Om zo min mogelijk stroom te gebruiken wil ik dat het apparaat uitgaat zodra hij klaar is met meten. Dan kun je dus niet meer lezen wat hij heeft gemeten. De uitkomst is een e-Paper display. Bij dit soort displays blijven de getoonde gegevens zichtbaar, ook als de stroom wordt uitgeschakeld.

Het resultaat is een handheld fijnstofmeter op basis van een ESP32 en een Sensirion SPS30-sensor met e-Paper-display. Het apparaat is bedoeld om even snel ergens een meting te doen: buiten op straat, in huis, bij een open raam of bijvoorbeeld in een werkplaats. Omdat het apparaat op een accu werkt is het echt een draagbaar, “handheld” apparaat.
De SPS30-sensor
De SPS30-sensor meet de massaconcentratie van fijnstof in verschillende fracties: PM1.0, PM2.5 en PM10. Dat zijn respectievelijk de concentraties van deeltjes kleiner dan 1 µm, 2,5 µm en 10 µm.
De sensor gebruikt een laser en een ventilator om de lucht door een meetkamer te trekken en de deeltjes te tellen. Dat levert vrij betrouwbare waarden op.
Het basisontwerp
Zoals geschreven wil ik zoveel mogelijk gebruik maken van standaardmodules. In dit geval:
- een module waarmee de 18650-cel opgeladen kan worden
- een soft latch-circuit
- een step-up convertermodule die de door de 18650 geleverde spanning (~2,5 V – 4,2 V) omzet in een stabiele 5 volt
- een ESP32-bordje als MPU
- een 1.54” e-Paper van Waveshare
Laadmodule
De laadmodule is er een die overal te koop is (ik heb er een paar voor een paar euro per stuk bij Amazon gekocht).
DC-DC step-up module
Ook deze heb ik voor een paar euro bij Amazon gekocht.
Let wel op: de module kan verschillende spanningen afgeven (5 V, 8 V, 9 V en 12 V). Om een uitgangsspanning van 5 volt te krijgen moeten de twee 0-ohm weerstanden (naast A en B) worden verwijderd.
Niet vergeten!
SPS30 (of PMS5003) fijnstofsensor
De SPS30 fijnstof (particulate matter) sensor is van Sensirion.
Waveshare 1.54” e-Paper
ESP32 DevKit 30-pin
Er zijn letterlijk tientallen verschillende ESP32-bordjes te koop. Voor dit project en voor de printplaat ben ik uitgegaan van een 30-pin ESP32-DevKit-V1 bordje.

Globale werking van het apparaat
Als kortstondig op de button (SW1) wordt gedrukt gaat Q101 geleiden en krijgen de ESP32, de SPS30 en het e-Paper-display spanning. De ESP32 zal als eerste actie de latch-pin (GPIO_PIN_LATCH) “hoog” maken. Hierdoor blijft het circuit ge-latched en zal Q101 blijven geleiden.
Ook de SPS30-sensor en het e-Paper-display krijgen nu dus spanning.
Voor betrouwbare metingen moet de SPS30 eerst opwarmen. Dit is (via het platformio.ini bestand) instelbaar. Volgens Sensirion moet de opwarmtijd minimaal 30 seconden zijn.
Na deze opwarmtijd doet het apparaat vijf (ook weer instelbaar) metingen die direct op het display getoond worden. Als laatste wordt het gemiddelde van alle metingen op het display weergegeven en schakelt de ESP32 de latch-pin “laag”, waarna Q101 uit gaat en de spanning wordt afgesloten.
Vereenvoudigd codevoorbeel
void setup()
{
// -- Switch off WiFi and Bluetooth as early as possible
// -- This saves power and avoids starting hardware that is not needed
disableRadios();
// -- Keep the power latch active so the device stays on
digitalWrite(pinLatch, HIGH);
// -- Initialize the display and prepare the first screen contents
epdInit();
// -- Read battery voltage early
// -- If the battery is too low, show a message and shut down
batteryVoltageLast = readBatteryVoltage();
if (batteryVoltageLast < 3.4f)
{
switchOff("BATTERY TOO LOW");
return;
}
// -- Initialize shared communication buses
// -- I2C is used for the SPS30 and optionally for the BMP280
i2cInit();
// -- Detect which sensor hardware is available
// -- The code can work with more than one particle sensor type
detectAvailableSensors();
// -- Try to start the particle sensor measurement
// -- When successful, the software enters the warm-up phase
if (!particleSensorInitAndStart())
{
messageText = "Particle sensor error";
}
else
{
messageText = "Warming up...";
}
// -- Reset all software timers used by the state machine
restartTimers();
} // setup()
void loop()
{
// -- Run small background jobs that must be serviced regularly
// -- Example: button handling, display housekeeping, sensor polling
serviceBackgroundTasks();
// -- If a shutdown was requested somewhere else in the code,
// -- execute it here as soon as possible
processSwitchOffRequest();
// -- Run the main application logic
// -- This is the state machine: warm-up, sample, validate, average, show result
runMainStateMachine();
// -- Check again after the main logic,
// -- because the state machine may have requested a shutdown
processSwitchOffRequest();
} // loop()
De Soft Latch-schakeling
Voor de goede werking is een cruciaal onderdeel de soft latch-schakeling. Op internet zijn veel varianten te vinden waarvan sommige beter werken dan andere. Na wat uitzoekwerk ben ik op de volgende schakeling uitgekomen:
Het bestaat uit twee MOSFETs; een p-channel MOSFET (AO3401) als power switch en een n-channel MOSFET (BSS138) als sturing
Verder zijn er twee signaaldiodes (1N4148) opgenomen om het mogelijk te maken de aanwezige drukknop, nadat de spanning is aangezet, te kunnen gebruiken als gewone switch op GPIO33.
Dave van EEVblog en PKAE Electronics hebben filmpjes opgenomen die de werking van de schakeling goed uitleggen.
En hoe goed is dit Soft Latch Circuit?
Om dat te testen heb ik een timer uitgang aangesloten op de “Ext.Sw” jumper (J5) en deze 700 keer de cyclus één seconde gesloten (waardoor de meetcyclus van de fijnstof-sensor begint) en twee minuten open laten herhalen (binnen deze tijd heeft de fijnstof sensor zichzelf weer uitgeschakeld).
Begonnen met een volle 18650 en na die 700 cycles was de spanning van de cel nog steeds boven de 3.8 volt (50%).
Behoorlijk efficiënt dus!
Hier is het hele schema van de Handheld Fijnstofmeter:
Printplaat
Met KiCad heb ik een printplaat ontworpen met ruimte voor de meeste onderdelen. Alleen de SPS30 en het e-Paper-display zitten niet op de print maar kunnen met standaard 2.54″ pin/headers of JST-XH connectoren worden verbonden..
Aan de bovenkant van de printplaat zitten:
• de 30-pins ESP32-module
• de soft latch-schakeling
• de drukknop
• de connector voor het e-Paper-display
• de connectoren SPS30-sensor óf eventueel PMS5003
• ruimte voor een BME280 (luchtdruk en temperatuur)
• een I²C-connector
Aan de onderkant van de printplaat zitten:
• de 18650-accu
• de laadmodule
• de step-up convertermodule
• een piezo-speakertje
PCB bestellen
Nadat de printplaat is ontworpen moet het ontwerp (in de vorm van Gerber-bestanden) naar een PCB-fabrikant worden gestuurd.
Ik maak graag gebruik van
en KiCad heeft een mooie plugin waarmee dit proces geautomatiseerd kan worden. De plugin heet “PCBWay” (hoe kóm je erop).
Installatie gaat via de Plugin and Content Manager van KiCad.
Na installatie heeft de toolbar van KiCad een nieuwe knop.

Door op deze knop te klikken worden alle benodigde bestanden in een .zip-bestand gezet en wordt via de browser naar de website van PCBWay gesprongen.

Vervolgens geef je op hoeveel printplaten je van dit ontwerp wilt laten maken en hoe je wilt dat de printplaat eruit komt te zien (kleur van het soldermask en van het silkscreen).
Na controle door de engineers van
kun je de productie- en verzendkosten betalen.
Na ongeveer een week worden je printplaten geleverd en vind je ze in je brievenbus.
Aannames zijn niet altijd handig
In mijn KiCad-installatie zat geen symbool of footprint voor de AO3401 of de BSS138. Ten onrechte nam ik aan dat al die SOT-23 MOSFETs hetzelfde symbool en dezelfde footprint zullen hebben.
Dat bleek een misvatting.
Toen ik het eerste bordje in elkaar gesoldeerd had en de spanning erop zette ging de ESP32 direct “aan”. Vreemd. Op de button klikken veranderde niets.
Na wat beter uitzoekwerk kwam ik erachter dat de MOSFETs dus niet allemaal hetzelfde zijn. Door de AO3401 scheef en met een kort draadje op de PCB te solderen en de BSS138 “op zijn kop” (omdat drain en source omgewisseld bleken) op de printplaat te solderen werkte alles zoals ik bedacht had.
Met revisie 2.0 van de printplaat heb ik dit opgelost. Ook de twee buitenste connectoren heb ik iets verplaatst en de aansluitingen voor de BME280 heb ik anders geplaatst.
En dan nog een laatste ding
Het hele apparaat doet en kan nog wat meer dan hierboven eenvoudig beschreven.
Zo zal de ESP32 bij het opstarten én vlak voor het uitschakelen de spanning van de 18650 meten en op het display weergeven. Dit is belangrijk omdat het slecht is voor de Li-ion-accu als de spanning onder de 3 V daalt. Dit kan permanente schade aan de cel veroorzaken.
Als de spanning onder de 3,5 volt zakt zal op het display de tekst Battery Low verschijnen. Daalt de spanning nog verder dan zal het apparaat zichzelf zo snel mogelijk uitschakelen (zonder metingen te doen). Op het display verschijnt dan de tekst Battery Error.


Behalve het uitlezen van de SPS30 is het mogelijk om een BME280 op de printplaat te monteren. Als zo’n module aanwezig is zal bij het opstarten en afsluiten van het apparaat de gemeten temperatuur en luchtdruk op het display worden getoond.
Omdat, om de batterij te sparen, de WiFi- en Bluetooth-transmitters bij het opstarten van de ESP32 direct worden uitgeschakeld, moest ik iets bedenken om het toch mogelijk te maken om OTA-updates op de ESP32 te flashen.
Door tijdens het opstarten drie maal op de button (SW1)te drukken zal verbinding worden gemaakt met een bekend access point. Als er geen verbinding met een AP kan worden gemaakt zal een WiFi-manager worden gestart.
In het display komt dan te staan:
WiFi Portal Started
Waiting for User Input
HHPMS-<MAC Adres>

Klik nu op “Configure WiFi en selecteer het AP met de naam “HHPMS-123456” (123456 zijn de laatste 3 bytes van het MAC adres van de ESP32 SoC en is voor iedere chip anders).
Het is nu de bedoeling dat je je computer/tablet/telefoon met dit access point verbindt en de credentials van je eigen WiFi-netwerk invoert.
Door vervolgens op [Save] te klikken worden deze gegevens in de ESP32 opgeslagen en zal hij in het vervolg verbinding proberen te maken met dit netwerk.
Op het display verschijnt nu:
WAITING FOR UPDATE
Start nu de OTA-update waarna in het display de tekst:
UPDATING
.. verschijnt.
Na de update zal het apparaat opnieuw opstarten en aan de normale meetcyclus beginnen waarna hij zichzelf weer uitschakelt.
De printplaat en de software zijn geschikt voor zowel een SPS30-sensor als voor een PMS5003-sensor. Als het apparaat bij het opstarten geen SPS30-sensor kan vinden zal hij automatisch overschakelen naar een PMS5003.
Als die óók niet aanwezig is verschijnt de melding:
NO SENSOR
en zal het apparaat zichzelf uitschakelen.
Alle ontwerp bestanden en software kun je in deze repo vinden.





















Follow