[ 506 keer bekeken / views ]
In november 2022 heb ik een nieuwe versie van de Slimme Meter Uitlezer ontwikkeld, gebaseerd op de ESP32-WROVER module. Deze ESP32-chip beschikt over 8 MB PSRAM-geheugen en biedt aanzienlijke voordelen ten opzichte van versies zonder PSRAM.
Een van de belangrijkste verbeteringen aan de DSMRlogger32 is de toevoeging van een hardwarematige watchdog, die in zeldzame gevallen de logger automatisch kan resetten. Daarnaast zijn er drie Neopixels toegevoegd, die visueel aangeven wat de DSMRlogger32 aan het doen is.
Een andere handige uitbreiding is de secundaire P1-poort, waarmee je eenvoudig een extra P1-lezer kunt doorlussen. Tot slot is er de mogelijkheid om een shield aan te brengen op de DSMRlogger32, waardoor alle vrije GPIO-pinnen benut kunnen worden.
Overstappen van de Arduino IDE naar VSCode met PlatformIO
Naarmate projecten complexer worden, kan het lastig zijn om ze over te dragen aan anderen. Hoewel GitHub een goede oplossing biedt voor het delen van code, blijft het een uitdaging om ervoor te zorgen dat anderen dezelfde versies van externe bibliotheken gebruiken en dat de juiste instellingen voor de microcontroller (MCU) worden toegepast. Bij gebruik van de Arduino IDE probeer ik deze informatie als commentaar in de code op te nemen, maar dit wordt vaak over het hoofd gezien, wat kan leiden tot fouten en vragen.
Zie ook deze post!
PlatformIO biedt hiervoor een elegante oplossing door alle benodigde instellingen en bibliotheek-versies in een configuratiebestand (platformio.ini
) op te slaan. Door simpelweg het project te clonen via GitHub of als .zip
-bestand te downloaden en uit te pakken, kan je de DSMRlogger32-map openen in Visual Studio Code.
Selecteer (in dit geval) de tweede DSMRlogger32
map:
… en klik op [Open].
PlatformIO zorgt er dan automatisch voor dat de juiste versies van de compiler, toolchain en bibliotheken worden opgehaald en dat de correcte instellingen voor de MCU worden toegepast. Het enige wat je zelf moet instellen, is de juiste upload- en monitor-poort, omdat die per gebruiker kan verschillen.
Daarna is het simpelweg een kwestie van de code uploaden, en je bent klaar.
Remote Firmware Update
Als de overstap naar PlatformIO te ingewikkeld lijkt, is er nog een eenvoudigere manier om firmware te updaten. Vanaf firmwareversie 5.3.0 is het namelijk mogelijk om de DSMRlogger32 op afstand te voorzien van nieuwe firmware via mijn remote firmware server.
In de FSmanager
is een nieuwe knop beschikbaar:
Wanneer je op de [Update Remote] knop klikt, verschijnt er een scherm waarin je via een dropdown-menu de gewenste firmwareversie kunt selecteren.
Na het klikken op [Update] wordt de firmware van de server gedownload en op de DSMRlogger32 geïnstalleerd.
Na een succesvolle update zal de DSMRlogger32 automatisch herstarten.
Om deze functionaliteit te kunnen gebruiken, moet je eerst een paar stappen doorlopen die hier uitvoerig beschreven staan.
Uitbreiding voor de Aansturing van een Relais
Een gebruiker van DSMRlogger versie 4 wil overstappen naar de DSMRlogger32, omdat hij een relais wil aansturen op basis van zijn elektriciteitsverbruik en -opbrengst. Hij vroeg mij om daarbij te helpen, wat ik uiteraard graag deed.
In plaats van een shield te ontwerpen, besloten we het relais via een stekkeraansluiting direct op de DSMRlogger32 aan te sluiten. Dit bespaart het ontwerpen en produceren van een PCB en is voor deze eenvoudige uitbreiding de meest praktische en kosteneffectieve oplossing.
We kozen voor een 3v3 relais-module, die wordt geleverd met ingebouwde leds: een groene led die aangeeft dat de module spanning ontvangt, en een rode led die oplicht wanneer het relais bekrachtigd wordt. Het relais zelf heeft een wisselcontact.
Voor de aansturing van het relais heb ik een Shield32
-class geschreven. Deze class bevat methoden die verantwoordelijk zijn voor de sturing van het relais.
class Shield32 { public: Shield32(); void setup(int pinNr, int8_t inversedLogic, int onValue, int offValue, uint32_t onDelay, uint32_t offDelay); void loop(int actualValue); void flipSwitch(); };
Een instantie van de class, myShield
, wordt global aangemaakt en de setup
-methode wordt in de (main) setup()
-functie aangeroepen:
//================ Start Shield ===================================== myShield.setup(devSetting->ShieldGpio, devSetting->ShieldInversed , devSetting->ShieldOnThreshold , devSetting->ShieldOffThreshold , devSetting->ShieldOnDelay , devSetting->ShieldOffDelay);
Daarnaast heb ik een functie doTaskShield()
geschreven die in de (main) loop()
wordt aangeroepen.
void loop () { //--- do the tasks that has to be done //--- as often as possible doSystemTasks(); doTaskTelegram(); doTaskShield(); . ' }
Hoewel dit misschien overbodig lijkt voor de huidige toepassing, biedt het de mogelijkheid om in de toekomst meer functies toe te voegen en de code netjes te groeperen.
De doTaskShield
functie ziet er zo uit:
//==[ Do Shield Processing ]=============================================================== void doTaskShield() { int actPower = 0; if (digitalRead(_FLASH_BUTTON) == LOW) { myShield.flipSwitch(); } if (DUE(shieldTimer)) { if (Verbose1) { DebugTln("doTaskShield.."); } //-- do what's needed for the Shield actPower = (int)(tlgrmData.power_returned *1000) + (int)(tlgrmData.power_delivered *-1000); myShield.loop(actPower); } } // doTaskShield()
In actPower
wordt het som van het geproduceerde (zonnepanelen) [+] en gebruikte vermogen [-] opgeslagen. Deze waarde wordt vervolgens in myShield.loop(actPower)
verwerkt.
In de GUI zijn extra parameters toegevoegd waarmee de aansturing van het relais kan worden geconfigureerd.
Nieuwe grafische presentatie
Voortbordurend op de gauges van HJM is deze presentatie nu standaard op te roepen:
Hallo Willem,
Ook mij is het upgraden gelukt met jouw aanwijzingen.
Via remote Update heb ik versie 5.4.0 (firmware en SPIFFS) geïnstalleerd.
De update Local werkt niet meer, ook bij versie 5.3.0 niet.
Hallo Jan,
Mooi dat het remote updaten bij jou ook is gelukt!
Waarom/Of Update Local niet meer werkt moet ik uitzoeken. Daar is namelijk niets aan veranderd.
Mijn versie was V5.2.2
Ik heb ook eerst de update naar V5.2.9 uitgevoerd, dat ging probleemloos. Deze versie heeft de functie “update remote”. Deze functie heb ik uitgevoerd, gewenste software-versie geselecteerd.
Na 2 minuten updaten en automatisch opnieuw opstarten draait alles weer. Dit werkt echt super. Nu staat V5.3.0 erop.
Hallo Willem,
Geweldige update van de DSMR-logger.
Maar jij geeft aan dat de versie 5.3.0 bin bestanden te downloaden zijn via Github.
Maar hier vindt ik alleen de bron bestanden.
En als ik die dan in VScode compileer, wordt alleen de firmware.bin aangemaakt.
Verder heb jij het over RING-bestanden, waar kan ik die vinden?
Als ik iets verkeerd doe, dan hoor ik het graag.
Henk,
Ik moet de post nog aanpassen.Upgraden moet anders dan in de post beschreven.De post is ondertussen aangepast. Ik heb dat getest met mijn iMac maar heb geen Windows computer om te testen.In de GitHub repo is een map “UpgradeTo_v5.2.9”. In het README.md bestand staat wat je moet doen en in welke volgorde.
Ook daar moet nog wel wat bijgeschaafd worden.Bijvoorbeeld dat je python3 op je computer moet hebben staan.Je zou me een groot plezier doen om die procedure te volgen en aan mij door te geven wat er anders of duidelijker moet.
Wat sowieso beter beschreven moet worden is dat, als je een USB TTL Serial kabeltje (3v3!) gebruikt met drie of vier draadjes, de de ESP32 in flash mode moet worden gezet door de [flash] knop in te drukken en ingedrukt te houden, dan de [reset] knop indrukken en los laten en dán de [flash] knop los laten.Dan pas het conversie programma starten.
De RING-bestanden staan op je DSMRlogger32 (downloaden naar je computer met de FSmanager).
Hallo Willem,
Ik heb de upgrade gedaan volgens jou aanwijzingen in Github.
Het bedraad flashen van de Upgrade_v5.2.9 via de computer verliep zonder problemen.
Daarna via de nieuwe Remote Update versie 5.3.0 geïnstalleerd.
Ook dat ging zonder problemen.
Heb nu mijn DSMRlogger32 op de laatste firmware v5.3.0 draaien.