LIVE: Danmarks CO2 udledning

Dette projekt er i hovedsagen en implementation af et projekt af Dybber, som kan findes på GitHub.

CO2-display

Projektet kredser om IoT og bæredygtighed. En mikrocontroller (MCU) med wifi adgang (wemos d1 mini med ESP32 chip), tilgår sitet www.electricitymap.org og henter opdaterede data om DK’s CO2 udledning i g CO2/kWh. Sitet virker troværdigt, men der vil altid være usikkerhed og evt. fejlkilder ved sådanne data. En strip af 30 stk ws2812b LEDs er koblet til microcontrolleren, som kodes til at vise CO2 udledningen med rød på en skala fra 0 til 30 LED’s svarende til 0 til 400 g CO2/kWh.

Da skolens wifi er svært tilgængeligt for IoT enheder, har jeg sat mit eget netværk op gennem netdeling fra en gammel smartphone (Samsung Galaxy 4s mini), som kører Android. Denne kan kun tilgås af 4 enheder, men jeg har kun en enhed. SSID og kodeord på netværket skal ind i koden på MCU’en. Jeg har forsøgt med en iPhone 4, men det virkede ikke.

Netværket udbydes via et taletidskort fra Lebara til 50,- i føtex. Der ligger et simkort i pakken med 10,- taletid på. Jeg kan ikke se nogen steder i dokumentationen, hvor meget data der følger med, men da det er meget meget lidt trafik projektet kræver, har jeg endnu ikke mødt problemer. Deres minimum i andre tilbud er vist 4 Gb data, og projektet her skal måske bruge 100 kb. Alternativt kan simkortet tankes op anonymt med 4 Gb data til yderligere 50,-. NB Alle Lebaras produkter SKAL bruges i løbet af 30 DAGE.


ESP8266
Billie Grace Ward from New York, USA [CC BY 2.0 (https://creativecommons.org/licenses/by/2.0)]

Mobiltelefonen skal stilles til at lade være med at opdatere noget som helst (ingen opdatering af apps, mails, notifikationer m.m.), wifi skal deaktiveres og mobilt hotspot aktiveres. Det mobile hotspot bliver holdt åbent, så længe MCU’en ofte henter data, men ønsker jeg at ændre timeout-tiden for mobilens hotspot, skal det gøres ved at gå ind i “mobile hotspot konfigurations” menuen på telefonen og trykke “apps” knappen nederst i venstre hjørne -der vises ingen ikon eller menu, som viser at man skal trykke her -men en dialog fremkommer, hvor man bl.a. kan vælge timeout = never.

Rækkevidden på hotspottet har jeg testet med en MCU (wemos ESP8266), og den er ret pæn a la de 25 meter, også gennem vægge. Det er ca. som jeg har læst mig frem til på nettet.

For at hente data på www.electricitymap.org, har jeg bestilt og modtaget et gratis API-token, og set på deres dokumentation ved API. Data hentes som en JSON-fil og token skal angives som header i en http get-request. Jeg bruger countrycode=DK-DK1, som er Fyn og Jylland.

Jeg forsøgte at kode MCU’en C++ (Arduino) til at tilgå nettet og hente data, ingen af de biblioteker jeg kunne finde tillod at have headers med i en get-request. Måske er det bare mig der ikke kender syntaxen.

I stedet har jeg koden den i MicroPython via editoren Mu, som Dybber også har gjort, og min kode er en variation over hans oplæg. Dertil har Dybber (vist) skrevet det bibliotek (Mode) til Mu-editoren, som tillader at kode ESP8266 og ESP32 med MicroPython. Ideen er, at der lægges en lille udgave af Python (kaldet MicroPython) ned på MCU’en og denne kompilerer og afvikler koden, efter den er downloaded til MCU’en. Det er forskelligt fra den traditionelle måde at styre en Arudino via C++, hvor koden kompileres på PC og kun afvikles på MCU’en.

MicroPython kommer ned på enheden via denne guide. Jeg brugte
og version 1.10 til ESP32 også version 1.10.bin til ESP8266, men inkl kommandoerne (-fm dio er vist afgørende) i windows command prompt (ikke powershell):

esptool.py –port com7 –baud 115200 erase_flash

esptool.py –port com7 –baud 115200 write_flash -fm dio –flash_size=detect 0 ./Desktop/esp8266-20171101-v1.9.3.bin (filen ligger på Desktoppen, og NB “–” er to streger efter hinanden.)

MicroPython har biblioteker for netværk, LED-strip (machine) og meget andet. Nogle afgørende punkter er, at connect() og disconnect() kræver noget tid (5-6 sekunder), for ikke at gå i stå midt en forespørgsel. Derfor er der utime.sleep(10), dvs. 10 sekunders pause, efter hver. Disconnect er måske ikke nødvendig, men det sparer nok noget energi at afkoble netforbindelsen (active(false) skulle nok også med). Hele koden kan ses på GitHub.

Jeg har ikke haft held med REPL-delen af Mu-editoren, som bl.a. kan skrive fejlbeskeder fra serial-forbindelsen til MCU’en. Eneste debugging har være en LED på MCU’en (GIO02), som kan blinke et antal gange.

.dxf tegning til lasercutter.

Lyskæden har jeg monteret i et laserskåret tårn i 3mm MDF, med påskriften “Hvor meget CO2 medfører DK’s forbrug af strøm” og tallene 400, 200 og 0 g CO2/kWh. Dertil en seddel med mere uddybende info.

Jeg er som altid spændt på hvordan eleverne tager opstillingen. Ænser de noget eller går forbi uden at kigge? Er teksten klar nok?

Update1: Da jeg skrev koden, var det koldt og CO2-udledningen lå nemt på 400 g CO2/kWh. Derfor satte jeg skaleringen til 500 g CO2=30 LEDs. Ugen efter blev det 20 grader og CO2-udledningen kommer aldrig over 250 g CO2/kWh. Årligt snit er 200 g CO2/kWh. Derfor har jeg nu skaleret aksen til 50-250 g CO2/kWh.

Derfor kom CO2 udledningen nogle gange over 250 g CO2/kWh, hvorfor antallet af kaldte LEDs blev over 30 på en LED-strip defineret til 30. Så smider programmet en undtagelse (exception) og standser.

Nu har jeg nu refaktoreret programmet, så skalerings-funktionen kan kun returnere værdier mellem 0 og 30.

Eleverne reagerer ikke og har kun skuldertrækninger tilovres for projektet. Måske fordi det endnu er i test.

Dette indlæg blev udgivet i Arduino, Maker og DIY, Programmering. Bogmærk permalinket.