Een ESP32-project maken met PlatformIO: een inleiding voor beginners
PlatformIO biedt in combinatie met Visual Studio Code een krachtige, flexibele en gebruiksvriendelijke omgeving voor de ontwikkeling van firmware voor microcontrollers. In dit artikel beschrijven we een voorbeeld van de integratie van PlatformIO en VSC om een ontwerp te maken voor het uitlezen van vochtigheids- en temperatuurwaarden met een digitale sensor en een ESP32-module.
PlatformIO
PlatformIO is een open-source geïntegreerde ontwikkelomgeving (Integrated Development Environment, IDE) die steeds meer wordt gebruikt in de hobbysector, maar vooral ook door professionals. Een geïntegreerde ontwikkelomgeving is software die ontwikkelaars voorziet van een uitgebreide toolset voor het schrijven, testen en debuggen van softwarecode.
Een IDE integreert een aantal essentiële tools en functies om het software-ontwikkelproces te vereenvoudigen, de productiviteit te verbeteren en een consistente omgeving te bieden voor de hele levenscyclus van een project. Zo’n IDE bevat meestal:
- een geavanceerde teksteditor die de syntaxis van de gebruikte programmeertaal ondersteunt, met functies zoals syntax highlighting, automatisch aanvullen en inspringen;
- tools voor het compileren van broncode naar uitvoerbare machinetaal;
- een ingebouwde debugger om fouten in de code op te sporen en te corrigeren tijdens het uitvoeren van het programma;
- een systeem dat het toevoegen, beheren en bijwerken van bibliotheken en project-afhankelijkheden vergemakkelijkt;
- een gecontroleerde uitvoeringsomgeving om de software tijdens de ontwikkeling te testen;
- systemen voor integratie met versiebeheerprogramma’s (zoals SVN, Git, Mercurial enzovoort), functies voor projectbeheer en een eenvoudige en intuïtieve gebruikersinterface.
Een populaire IDE en veelgebruikte is bijvoorbeeld Visual Studio Code (VSC).
PlatformIO is eigenlijk geen echte stand-alone IDE, maar veeleer een plugin (dat wil zeggen add-on software) die kan worden geïntegreerd in verschillende ontwikkelomgevingen, waaronder Visual Studio Code (VSC), Atom en Eclipse. Op dit moment is Visual Studio Code de belangrijkste IDE die wordt ondersteund door PlatformIO, en waarschijnlijk ook de IDE waaraan de meeste professionele ontwikkelaars de voorkeur geven.
Door PlatformIO te integreren in Visual Studio Code kunnen ontwikkelaars profiteren van verschillende functies; PlatformIO is in feite ontworpen om het ontwikkelproces van microcontroller-firmware te vereenvoudigen en te verbeteren. Het ondersteunt een groot aantal verschillende microcontrollers-typen, waaronder de verschillende Arduino-versies, maar ook andere microcontrollers en ESP8266/ESP32-gebaseerde boards.
In essentie is een van de onderscheidende kenmerken van PlatformIO de compatibiliteit met verschillende platforms, waaronder Arduino, Espressif IoT Development Framework (ESP-IDF) en vele andere. Hierdoor kunnen ontwikkelaars het platform kiezen dat het beste past bij hun behoeften, terwijl ze (en dat is niet onbelangrijk) altijd dezelfde IDE gebruiken.
Het ondersteunt verschillende programmeertaalopties, zoals C, C++ en Python en is compatibel met bibliotheken die al voor Arduino zijn gemaakt. PlatformIO vereenvoudigt het beheer van projectafhankelijkheden en de verschillende versies van bibliotheken (zowel zelfgemaakt als van derden) die kunnen worden opgenomen in aanzienlijke mate, en biedt geavanceerde compilatietools. Zo kunnen ontwikkelaars gemakkelijk externe bibliotheken in hun projecten opnemen zonder zich zorgen te hoeven maken over installatiedetails.
Verder ondersteunt PlatformIO het versiebeheer van bibliotheken, waardoor het ontwikkelproces robuuster (en tegelijk eenvoudiger) wordt. De IDE biedt uitgebreide ondersteuning voor debugging alsmede geavanceerde tools voor apparaatbewaking en -controle tijdens het uitvoeren van firmware. Samenvattend biedt PlatformIO een uniforme, flexibele, intuïtieve en relatief eenvoudig te beheersen omgeving die het ontwikkelproces vereenvoudigt en bijdraagt aan efficiënter projectbeheer.
In dit artikel zullen we zien hoe we een PlatformIO-gebaseerd project kunnen maken en beheren, specifiek voor de ESP32-microcontroller, die zal worden gecombineerd met een DHT22 sensor om realtime waarden voor omgevingstemperatuur en luchtvochtigheid te detecteren en deze weer te geven op de PlatformIO-console.
De ESP32-module
De ESP32 is een low-power microcontroller ontwikkeld door Espressif Systems, en staat bekend om zijn veelzijdigheid en rekenkracht. Gebaseerd op de Xtensa LX6-architectuur van Tensilica, integreert de ESP32 verschillende geavanceerde functies die hem ideaal maken voor een breed scala aan toepassingen voor het Internet of Things (IoT) en embedded computing.
In het oog springende features van de ESP32 zijn:
- Dual-Core architectuur: de ESP32 heeft twee Xtensa LX6-kernen, die parallelle bewerkingen mogelijk maken en de systeemprestaties als geheel verbeteren.
- Hoge klokfrequentie: met klokfrequenties tot 240 MHz biedt de ESP32 een hoge verwerkingskracht voor complexe toepassingen.
- Draadloze connectiviteit: geïntegreerde WiFi- en Bluetooth-connectiviteit, waardoor draadloze communicatie met andere apparaten en netwerken moeiteloos verloopt.
- Ingebouwd flashgeheugen: de ESP32 heeft voldoende geheugenruimte voor het laden van firmware en gegevens.
- Talrijke gevarieerde I/O-periferie, zoals GPIO-, UART-, I2C-, SPI- en PWM-poorten, voor eenvoudige interactie met andere apparaten.
- Signaalprocessor (DSP): de ESP32 is uitgerust met een DSP die de verwerkingsmogelijkheden voor audio- en signaalverwerkingstoepassingen verbetert.
- Low-power modus: ondersteunt energiezuinige modi om de levensduur van de accu/batterij te verlengen in betreffende apparaten (‘deepsleep’).
- Open-source ontwikkelomgeving: Espressif ondersteunt een open-source ontwikkelomgeving via het gebruik van frameworks zoals Arduino en PlatformIO, wat het programmeer- en ontwikkelproces vereenvoudigt.
- Beveiliging: de ESP32 bevat geavanceerde beveiligingsfuncties, waaronder hardware-encryptie, waardoor hij geschikt is voor projecten die een hoger beschermingsniveau vereisen.
Vanwege deze eigenschappen wordt de ESP32 veel gebruikt voor het ontwikkelen van IoT-projecten, slimme sensoren, domotica-applcaties en meer. De ESP32 is een processor die, althans voor onze doeleinden, een extra elektronisch onderdeel nodig heeft dat de juiste voeding levert en een interface maakt met een USB-poort op een computer, zodat hij geprogrammeerd kan worden (dat wil zeggen de firmware die geschreven en gecompileerd wordt op PlatformIO overbrengen naar het interne geheugen) en ermee kan communiceren via de seriële poort (via de console van de seriële monitor van PlatformIO).
Figuur A maakt duidelijk dat de module niet zonder meer kan worden gebruikt. Maar gelukkig bestaan er onder de naam NodeMCU kleine kaarten die naast de ESP32-microprocessor de eerder genoemde elektronica bevatten. Dergelijke kaarten hebben connectoren waarmee ze kunnen worden aangesloten op de externe omgeving (sensoren, actuatoren en verschillende apparaten).
Dit artikel is gebaseerd op het NodeMCU ESP32-board van figuur B, waarin de microprocessor, de periferie en de aansluitingen met de buitenwereld duidelijk te zien zijn.
De DHT22-sensor
Omdat we hem in dit miniproject gebruiken, zullen we een paar woorden wijden aan deze sensor, die overigens bij insiders enige bekendheid geniet. De DHT22, ook bekend onder de naam AM2302, is een digitale temperatuur- en vochtigheidssensor die een betrouwbare en nauwkeurige oplossing biedt voor het monitoren van omgevingscondities. Deze sensor wordt veel gebruikt in domotica-projecten, omgevingsbewaking en weerapplicaties. De DHT22-sensor gebruikt een capacitieve sensor om de relatieve vochtigheid te meten en een thermistor om de temperatuur te meten.
Enkele van de belangrijkste technische kenmerken zijn:
- Nauwkeurigheid en betrouwbaarheid: de DHT22 biedt een hoge nauwkeurigheid bij zowel temperatuur- als vochtigheidsmeting.
- Ruim meetbereik: de sensor kan temperaturen in een bereik van –40 °C tot +80 °C en relatieve vochtigheid in het bereik van 0...100% detecteren.
- Digitaal signaal: de DHT22 verzendt direct digitale signalen via één pin, wat het interfacen met microcontrollers zoals Arduino of ESP32 vereenvoudigt, die dan geen analoog signaal hoeven te bemonsteren en te digitaliseren.
- Snelle reactietijd: de sensor staat bekend om zijn snelle reactietijd van ongeveer 2 seconden.
- Hoge resolutie: de sensor levert gegevens met een resolutie van 0,1 °C voor temperatuur en 0,1% voor vochtigheid, wat uiterst nauwkeurige metingen mogelijk maakt.
- Hoge ongevoeligheid voor ruis: dankzij de capacitieve meettechnologie is de sensor relatief ongevoelig voor externe interferentie.
Interfacing met de DHT22 is over het algemeen eenvoudig en vereist alleen een microcontroller en een speciale bibliotheek.
Installatie van Visual Studio Code en PlatformIO
Zoals al opgemerkt, is PlatformIO een plugin voor de Visual Studio Code IDE, dus de eerste stap is om die IDE te installeren. De directe link naar de downloadpagina is te vinden op . Zoals te zien in figuur 1, is dike software beschikbaar voor de belangrijkste besturingssystemen (Windows, verschillende distributies van Linux, macOS). Zodra we het juiste bestand voor ons eigen OS hebben gedownload, installeren we het.
Welke versie u ook kiest, er verschijnt een welkomstpagina zodra het programma start. Als u die sluit, verschijnt de hoofdpagina van de IDE in de linkerkolom met knoppen (waaronder de rood gemarkeerde knop in figuur 2). Die wordt gebruikt om de gewenste plugins (extensies) voor VSC te zoeken en te installeren. Door erop te klikken wordt het zoekvenster in de linkerkolom geopend.
Om een plugin te vinden, vult u de naam in het rechthoekige vak linksboven in. Als u platformio intypt, verschijnt de plugin in de lijst. Het enige wat we hoeven te doen, is op de knop Install van de PlatformIO plugin klikken, zoals in figuur 3. Binnen een paar minuten is de plugin geïnstalleerd en wordt deze aangegeven door een klein nieuw pictogram in de linkerkolom (figuur 4). PlatformIO is nu geïnstalleerd en klaar voor gebruik.
Een project op PlatformIO maken
Als het VSC is opgestart, moeten we eerst op het PlatformIO-pictogram klikken. De hoofdpagina wordt geopend, waar we op de knop Create New Project klikken (figuur 5). Er wordt een nieuwe welkomstpagina geopend (figuur 6), waar we de knop + New Project aanklikken. Dit opent een eenvoudige projectwizard die ons vraagt om de naam van het project, het platform en het gebruikte framework in te voeren (figuur 7).
U kunt een willekeurige projectnaam kiezen (bijvoorbeeld testESP32), terwijl de keuze van het type board natuurlijk afhangt van het board dat we gaan gebruiken. Als u ESP32 typt in het tekstvak Board, verschijnt er een lijst met alle beschikbare ESP32-gebaseerde boards. In dit geval hebben we gekozen voor het AZ-Delivery ESP-32 Dev Kit C V4 board. Als framework laten we Arduino staan. Met het selectievakje Location geeft PlatformIO aan of de standaardmap gebruikt moet worden als werkmap of dat er een andere map gebruikt moet worden. We gebruiken hier de standaardmap.
Het resultaat van deze keuzes is te zien in figuur 8. Door op de knop Finish te klikken wordt het project aangemaakt. Na een paar seconden verschijnt het scherm van figuur 9. PlatformIO toont links de boomstructuur van het project, terwijl in de werkruimte het bestand platformio.ini wordt getoond (ook onderdeel van het project) waarin de projectinstellingen worden verzameld. Op dit moment zijn dit de enige instellingen die worden meegegeven bij het compileren van de wizard.
In de projectstructuur (de ‘boom’ aan de linkerkant) zien we enkele mappen. Een daarvan heet includes en is momenteel leeg. De functie ervan is het verzamelen van alle bestanden die in het project moeten worden opgenomen (meestal .h-bestanden). Een andere map heet src en bevat het bestand main.cpp dat het hoofdbestand van de sketch wordt, dat wil zeggen, het bestand waar het programma terechtkomt.
Figuur 10 toont de inhoud van dat bestand. Merk op dat hier de twee belangrijkste functies die worden gebruikt in sketches voor Arduino verschijnen: setup en loop. Het project is georganiseerd in een bestandssysteem als in figuur 11.
Opmerking: bij het schrijven van dit artikel hebben we Linux als besturingssysteem gebruikt. Het is mogelijk dat op Windows en macOS de organisatie van de bestanden in het bestandssysteem anders is. Maar de interface van PlatformIO zal altijd hetzelfde zijn, ongeacht het gebruikte besturingssysteem.
Bibliotheken aan het project toevoegen
Het toevoegen van bibliotheken aan het project is vrij eenvoudig. Stel dat we de DHT sensor library for ESP willen toevoegen (die wordt gebruikt om de gegevens te lezen die worden verzonden door de DHT22 temperatuur- en vochtigheidssensor). Eerst moeten we in de linkerkolom van de IDE op het PlatformIO-pictogram klikken. Dit opent de hoofdpagina van PlatformIO, waar de sectie QUICK ACCESS beschikbaar wordt. Een van de items daar is Libraries. Door hierop te klikken wordt het zoekvenster voor bibliotheken geopend (figuur 12).
Als we DHT22 in het zoekvak typen, verschijnen er meerdere resultaten. We kiezen voor de DHT sensor library for ESPx van Bernd Giesecke (figuur 13). Door die aan te klikken wordt de bibliotheekpagina geopend (figuur 14). Om de bibliotheek te installeren, klikt u op de knop Add to Project, selecteert u in de volgende wizard het gewenste project (in ons geval testESP32) zoals in figuur 15 en klikt u op de knop Add. PlatformIO zal de bibliotheek automatisch downloaden in de projectmap. De bibliotheek wordt ook toegevoegd aan het platformio.ini-configuratiebestand (figuur 16).
Dit is de standaardprocedure voor het toevoegen van een bibliotheek aan het project. Een alternatieve procedure is om het bestand platformio.ini direct te bewerken door de regel lib_deps = toe te voegen, gevolgd door de lijst met bibliotheken die toegevoegd moeten worden. In ons geval zou het voldoende zijn geweest om deze regel toe te voegen:
lib_deps=beegee-tokyo/DHT sensorbibliotheek voor ESPx@^1.19
Samenvattend kunnen bibliotheken worden toegevoegd met de zoekpagina of rechtstreeks aan het bestand platformio.ini als u de naam en het pad kent. Om de zojuist aan het project toegevoegde bibliotheek te gebruiken, moet deze bijvoorbeeld worden opgenomen in het bestand main.cpp, door de regel #include "DHTesp.h" direct na de regel #include "Arduino.h" toe te voegen.
Aan het bestand platformio.ini voegen we bovendien de volgende regels toe:
monitor_speed = 115200
upload_speed = 921600
zodat het eruitziet als in figuur 17. Deze beide commando’s worden gebruikt om de snelheid van de seriële poort in te stellen voor communicatie met de computer en de snelheid waarmee de sketch in het geheugen van de microcontroller wordt geladen.
Het project testen
Om een werkend voorbeeld te krijgen van het nieuw aangemaakte (en dus nog lege) project, gebruiken we een DHT22-sensor, lezen we de gemeten waarden van de omgevingstemperatuur en luchtvochtigheid in realtime uit en geven deze via de seriële monitor van PlatformIO weer. Naast de microcontroller en de sensor hebben we daarvoor een breadboard, een weerstand van 4,7 kΩ en wat draden nodig om de eenvoudige schakeling van figuur 18 op te bouwen. U ziet dat het helaas niet mogelijk was om de ESP32 NodeMCU op het breadboard te plaatsen zodat die ernaast ligt.
De sketch
Listing 1 maakt deel uit van het bestand main.cpp. De sketch begint met het toevoegen van de benodigde bibliotheken. Vervolgens wordt het dht-object van het type DHTesp geïnstantieerd, dat wordt gebruikt om de sensor aan te sturen. Vervolgens wordt de GPIO van de ESP32 toegewezen die de gegevens van de sensor zal inlezen (in ons geval 14).
Er worden variabelen gedefinieerd die de meetwaarden bevatten en variabelen die de timing van de metingen regelen (in dit geval vinden de metingen elke 3 s plaats). Het zou goed zijn om niet onder deze waarde te gaan, omdat de DHT22 er ongeveer 2 s over doet om een meting uit te voeren.
Vervolgens komt de printData()-functie, die de temperatuur- en vochtigheidsvariabelen uitleest en afdrukt naar de seriële monitor van PlatformIO, met minimale opmaak. De setup-functie initialiseert de seriële poort (waardoor naar de seriële monitor wordt geprint) en verbindt GPIO 14 met de sensor.
Tot slot detecteert de loop-functie elke measureDelay ms de metingen die door de sensor worden gedaan en slaat ze op in de twee variabelen Temperature en Humidity. Vervolgens wordt de functie printData() aangeroepen om de resultaten af te drukken. Dit gebeurt allemaal cyclisch. Om de sketch in het board te laden, klikt u op de knop met het cijfer 1 in figuur 19.
De sketch wordt eerst gecompileerd en vervolgens, als er geen compilatiefouten optreden, geladen in het interne geheugen van de ESP32-microcontroller. Om de resultaten te visualiseren, moet de seriële monitor worden geactiveerd door op de knop met het cijfer 2 (nog steeds in figuur 19) te klikken. Figuur 20 toont de resultaten die worden afgedrukt naar de seriële monitor.
Klaar om te gaan coderen?
U ziet dat het creëren van een project met PlatformIO en het toevoegen van eventuele bibliotheken al met al een vrij eenvoudige en gestandaardiseerde operatie is. PlatformIO combineert gebruiksgemak met uitgebreide functionaliteit, die hier niet aan bod komen omdat dit niet het doel van dit artikel is.
Geavanceerd bibliotheekbeheer en eenvoudige installatie van afhankelijkheden vereenvoudigen het ontwikkelproces nog verder, waardoor u zich meer kunt richten op het creëren van het project in plaats van op het configureren van de omgeving. Daarnaast biedt de ingebouwde integratie met Arduino en zijn grote gemeenschap van ontwikkelaars extra voordelen, waardoor toegang wordt verkregen tot een uitgebreid ecosysteem van gedeelde resources en oplossingen.
Het gebruik van PlatformIO voor ESP32 betekent een belangrijke stap naar een efficiënter, beter georganiseerd, schaalbaar en professioneler ontwikkelproces. Het platform biedt de tools die nodig zijn om innovatieve ideeën te verkennen, complexe ontwerpen te maken en de ontwikkelcyclus te versnellen, waardoor de programmeerervaring soepeler verloopt en dus meer voldoening geeft.
Dit artikel (240370-03) verschijnt in Elektor november/december 2024.
Opmerkingen van de redacteur: Geïnteresseerd in ESP32-projecten, PlatformIO en meer? Dit project verscheen oorspronkelijk in Elettronica IN.