Thumbnail image

Project 11 — ESP32: vergelijking van platforms

Repost van Tumblr. Sources op github.

Ik heb een ESP32 Pico gekocht. Ik heb er nog geen toepassing voor. Eerst wil ik de verschillende manieren waarop je hem kunt programmeren uitproberen.

pico

De Pico is smal genoeg om op een enkel breadboard te gebruiken. Voor grotere ESP32’s heb je twee breadboards naast elkaar nodig.

Tests

Met behulp van verschillende platforms maakte ik een demo met deze functies:

  • Systeeminformatie printen op seriële monitor
  • WiFi gebruiken
  • NTP gebruiken
  • Tijd omzetten van UTC naar lokale tijd
    • Tijdzone Europe/Amsterdam: CET-1CEST,M3.5.0/2,M10.5.0/3
    • Met tussenpauzes actuele tijd printen op seriële monitor
  • MQTT
    • Publish tijd van opstarten (lokale tijd)
    • Subscribe
    • Last will and testament
  • Twee LEDs die afwisselend knipperen
    • Snelheid instelbaar via MQTT
  • Een LED aansturen met PWM
    • Helderheid instelbaar via MQTT

pico

1. Arduino IDE

Meer hier.

De eerste versie demo was snel klaar. Ik heb het programma opgezet zoals ik gewend ben met Arduino, met een standaard setup() en loop(). Voor NTP en MQTT heb ik de library’s gebruikt die ik eerder al in project 08 gebruikte.

Maar m’n code voor het omzetten van UTC naar lokale tijd kon ik achterwege laten. De library’s voor ESP kunnen overweg met tijdzones.

2. Espressif

Meer hier.

ESP-IDF is de officiële ontwikkelsoftware voor ESP van Espressif. Gebruik dit als je alles uit je ESP32 wilt halen. Beheer van het project gebeurt grotendeels via de command line.

Toen ik tutorials zocht op Youtube kwam ik al snel het begrip RTOS tegen. Espressif maakt gebruik van (een aangepaste vorm van) FreeRTOS. Het is de moeite waard je daarin te verdiepen. Voor simpele projecten volstaat de gebruikelijk opzet van Arduino met setup() en loop(), maar voor complexere projecten, waarin je ESP veel processen tegelijk moet aansturen, volstaat dat niet. Dan wil je een RTOS gebruiken, met z’n aparte taken, queues, en wat er nog meer bij komt kijken. Het doet denken aan Go met z’n goroutines en channels, dus ik voelde me er direct vertrouwd mee.

De documentatie is goed, op één ding na: er wordt bij functies niet vermeld welke headers je moet gebruiken. Dus moet je zoeken in de headerfiles waar een functie is gedeclareerd.

Ik bleek geen externe library’s nodig te hebben. Alle functionaliteit die ik nodig had wordt door Espressif zelf geboden.

3. Arduino IDE met RTOS

Meer hier.

Na m’n implementatie met Espressif wilde ik kijken of ik dezelfde principes van RTOS kon toepassen in de Arduino IDE (uiteraard alleen voor ESP). Dat werd demo2. Het bleek goed te doen. Ook hier bleek dat ik in plaats van de externe library’s voor NTP en MQTT gewoon Espressif zelf kon gebruiken.

In Arduino IDE gebruik je niet de standaard library’s van Espressif, maar de library’s die door Espressif voor de Arduino IDE zijn ontwikkeld. Ik weet niet in hoeverre dit dezelfde functionaliteit biedt als de standaardversie van Espressif. Je hebt niet de mogelijkheid om alle parameters voor het compileerproces te tunen. Misschien is dit een voordeel.

En je hoeft je minder zorgen te maken om het gebruik van headers. Dat gaat voor een groot deel vanzelf.

4. MicroPython

Meer hier.

Dit werkt makkelijk. Als je MicroPython eenmaal hebt geïnstalleerd op je ESP32 kun je met rshell de REPL starten of bestanden van en naar je ESP kopiëren.

Maar het is en blijft Python. Ik ben geen fan. Dat gedoe met spaties leidt onherroepelijk tot problemen bij grotere projecten.

Verder is de functionaliteit beperkt. Tijdzones kent MicroPython niet. Voor MQTT moest ik een externe implementatie gebruiken. In MicroPython is wel ondersteuning voor de protocollen die gebruikt worden in microcontrollers, zoals I²C, SPI, UART, etc, maar daarmee kun je nog niet elke sensor of display dat gebruik maakt van die protocollen besturen. Je moet een implementatie hebben voor dat specifieke apparaat, ergens een library downloaden, of zelf schrijven.

Hetzelfde geldt natuurlijk voor Arduino, maar voor Arduino zijn al heel veel library’s geschreven. Met MicroPython weet ik dat zo niet.

5. NodeMCU

Meer hier.

Dit is beter dan MicroPython. Hetzelfde idee, maar met Lua als programmeertaal in plaats van Python. Dat is natuurlijk een groot voordeel.

Alle functionaliteit die ik voor dit project nodig had is aanwezig in NodeMCU. Inclusief NTP, lokale tijd via tijdzones, en MQTT.

Er is niet één kernel van NodeMCU voor je ESP. Je compileert er zelf een nadat je hebt besloten welke modules je wilt gebruiken. Daardoor kan NodeMCU veel modules aanbieden, terwijl de uiteindelijke kernel niet groter wordt dan nodig. Een groot voordeel op een apparaat waar het geheugen zeer beperkt is.

6. Lua RTOS

Meer hier.

Een andere variant van Lua voor de ESP. Het gebruik is net iets simpeler dan met NodeMCU, maar dat komt doordat er maar één kernel is. En omdat alles wat Lua RTOS te bieden heeft in die ene kernel moet is er uiteraard een kleiner aanbod van modules.

Lua RTOS ondersteunt geen tijdzones, dus hiervoor moest ik weer m’n eigen code bakken.

MQTT ondersteunt geen last will and testament.

7. Mongoose OS

Meer hier.

Mongoose OS is een ramp. Ergens had ik gelezen dat dit het ideale OS voor de ESP32 zou moeten zijn. Niet dus. Je kunt programmaatjes schrijven in iets wat lijkt op JavaScript, maar waarin je niet eens twee strings met elkaar kunt vergelijken. Het is me niet gelukt mijn demo in Mongoose te implementeren.

Bovendien is er geen REPL, dus de helft van motivatie om een geïnterpreteerde taal te gebruiken ontbreekt.

Je kunt in Mongoose OS ook in C programmeren, maar waarom zou je? Dan heb je geen REPL en geen snelle uploads van scripts.

8. Zephyr

Wat is Zephyr? The Zephyr® Project strives to deliver the best-in-class RTOS for connected resource-constrained devices, built to be secure and safe. Het is vooral een ton aan software die je moet downloaden, waarbij weinig gaat zoals de handleiding veronderstelt, voordat je in staat bent om het simpelste programmaatje te compileren (een blink-programma), dat dan ook nog niet lukt. Een hello world, dat kreeg ik wel aan de praat.

Uiteindelijk komt het neer op het schrijven van een programma in C, waarna je een build doet, en dan alles naar je apparaat moet flashen. Net als Arduino IDE en Espressif, maar dan veel ingewikkelder.

Wat is het doel? Standaardisatie? Iets dat op alle IoT-apparaten zou moeten draaien? Dat lijkt mij een illusie. Met microcontrollers en zo wil je geen ballast.

9. CircuitPython

Ik had het vage idee dat CircuitPython beter (verder) ontwikkeld zou zijn dan MicroPython (de eerste is immers niet voor niets een vork van de laatste), dus wilde ik kijken wat CircuitPython te bieden heeft.

CircuitPython wordt niet ondersteund voor de ESP32. Wel voor de ESP32-S2. Zou ik een kernel voor de ESP32-S2 op de ESP32 kunnen laten draaien? Mij is het niet gelukt. Bij mijn pogingen om het voor elkaar te krijgen raakte ik verstrikt in de documentatie, die extreem slecht georganiseerd en verwarrend is.

Ik denk niet dat als ik eenmaal een board heb die wel door CircuitPython wordt ondersteund, om dan alsnog CircuitPython te gebruiken.

Het is en blijft toch Python.

Conclusies

Welk platform kun je nu het best gebruiken voor het programmeren van de ESP32? Wat mij betreft blijven er twee duidelijke favorieten over.

Arduino IDE

Voor kleine of grote eindtoepassing gebruik je de Arduino IDE.

Je kunt je programma’s op twee manieren vorm geven. De traditionele Arduino-manier, met z’n setup en loop. Dit is alleen geschikt voor simpele dingen, maar je kunt het wel makkelijker exporteren naar andere apparaten.

Of je gebruikt de FreeRTOS in Espressif, wat simpele dingen een klein beetje complexer maakt (hoewel dat meevalt), en grotere projecten een stuk handelbaarder. Je programma exporteren naar een ander soort board wordt dan wel ingewikkeld.

Het nadeel van het werken met de Arduino IDE (of direct met Espressif) is dat je voor elke verandering in de code die je wilt testen het complete programma moet compileren en flashen naar je apparaat. Dat is tijdrovend. En het is niet goed voor je apparaat om heel vaak een groot deel van het flashgeheugen te overschrijven.

NodeMCU

Voor graduele ontwikkeling, dingen testen, met kleine stukjes scripts werken, direct commando’s naar je board sturen, voor dit alles is een scripttaal en een REPL ideaal, en wat mij betreft is NodeMCU de duidelijke winnaar.

Behalve de snellere ontwikkeling met NodeMCU (in vergelijking met Arduino IDE) levert dit programmacode op die een stuk compacter en leesbaarder is dan de C++-code voor Arduino. Als je een complete toepassing voor NodeMCU hebt geschreven, en het werkt prima, en snelheid is niet echt een issue, dan kun je besluiten geen C++-versie te maken, maar gewoon de Lua-versie te blijven gebruiken.

Het is ook veel sneller om een Lua-programma te vervangen dan een C++-programma te moeten compileren en flashen.

Vervolg

Mijn testtoepassing is erg simpel.

Volstaat voor optimaal programmeren van de ESP32 de Arduino IDE, of heb je voor sommige dingen toch de ontwikkelomgeving van Espressif nodig?

Lua kent coroutines. Hoe gebruik je die effectief in NodeMCU?

Wordt NodeMCU actief doorontwikkeld? Hoe zit het met ondersteuning voor verschillende soorten displays en sensors en zo in NodeMCU?

Dat laatste is iets wat ik in de toekomst wil testen.

Thumbnail image

Project 10 — Pi Zero 2 met MQTT-broker

Repost van Tumblr. Sources op github.

Als je met je zelfgebouwde IoT-dingetjes in huis gegevens wilt verzamelen, dan moet je die gegevens ergens opslaan. Daar zijn verschillende mogelijkheden voor.

Je kunt een internet-dienst gebruiken. Ik hou daar niet van. Je bent afhankelijk, en je geeft je data uit handen.

Je kunt een service opzetten op je PC. Maar dan moet die PC wel 24 uur per dag aan staan. Dat wil je niet met zo’n energieslurper.

Wat overblijft is een mini-computer of een single board computer, een apparaat dat heel weinig energie verbruikt.

Ik wilde een Rasberry Pi 4B gebruiken. Die is al een flinke tijd voor me in bestelling. Nog steeds niet gearriveerd. Nergens leverbaar. De vraag is veel groter dan het aanbod. Gelukkig wist ik m’n hand te leggen op een Raspberry Pi Zero 2.

zero 2

Een Raspberry met Ubuntu Server 64bits, en daar dan Mosquitto op draaien (een broker voor MQTT), InfluxDB (een time series database), Telegram (om gegevens vanuit Mosquitto in InfluxDB te krijgen), en Grafana (voor de weergave van data uit InfluxDB in grafieken die beter zijn dan de grafieken die InfluxDB zelf kan produceren).

Dit alles bleek niet mogelijk. Op een Pi 4B had het gekund, met 4 of 8 Gb geheugen, maar de Zero 2 heeft maar een half Gb. InfluxDB en co vreten geheugen. Deze set-up zal moeten wachten tot (als) m’n Pi 4B arriveert.

Ik heb nu een minimale set-up. Een server met Moquitto, en een klein programmaatje dat de gegevens die binnenkomen via Mosquitto opslaat in tekstbestanden. Als m’n PC aan staat, dan worden de gegevens regelmatig van de Pi naar de PC verplaatst, en daar ingevoerd in InfluxDB. Grafana draait ook op m’n PC zodat ik daar de grafieken kan bekijken, maar ook op m’n tablet, mits de PC aanstaat. Er zit wel een vertraging van 12 tot 22 minuten in tot de gegevens op deze manier beschikbaar zijn.

Grafana

Actuele gegevens (de meest actuele waardes) zijn wel direct te zien op m’n PC (met mosquitto_sub) en op m’n tablet (met MQTT Dash, ook als de PC uit staat).

MQTT Dash

MQTT

MQTT is een prachtige techniek, een zeer eenvoudige standaard die breed wordt ondersteund, waarmee je makkelijk data-bronnen en data-gebruikers aan elkaar kunt koppelen. Alles gaat via een centraal punt, de broker, die bij mij op de Pi draait (Mosquitto). Bronnen sturen data daarheen zonder zich verder hoeven te bekommeren om waar de data uiteindelijk heen moet om gebruikt te worden. M’n Nano IoT uit project 08 stuurt de gegevens van de weersensor daarheen. M’n PC en m’n tablet sturen allebei gegevens over wanneer het scherm aan is, zodat ik inzicht krijg ik m’n schermgebruik (dat blijkt meer dan verstandig). En de Pi stuurt meetgegevens over zichzelf naar zichzelf, over geheugengebruik, temperatuur van de processor, etc.

Rapsberry Pi Zero 2: Set-up

Algemene instructies: How to install Ubuntu Server on your Raspberry Pi

Als besturingssysteem op de Pi Zero 2 gebruik ik Ubuntu Server. Ik gebruik de 64-bits versie zodat ik ook Go-programma’s kan draaien, die je trouwens gewoon op je PC kunt compileren, dankzij de cross-compileermogelijkheid van Go. (InfluxDB draait ook alleen onder 64 bits.) De Pi Zero 2 wordt (nog?) niet officieel ondersteund door Ubuntu, maar met een simpele truc kun je het er wel op installeren.

Onderstaande instructies heb ik van https://waldorf.waveform.org.uk/2021/the-pi-zero-2.html

  • Flash a fresh Ubuntu Impish image to your choice of storage media (SD card, SSD, etc). Probably the easiest means of doing this is the Raspberry Pi Imaging utility (you’ll find Ubuntu under “Other general purpose OS”).
  • Once complete, safely remove the medium and re-insert. The boot partition (and potentially the root partition if you’re on Linux) will auto-mount.
  • Open the boot partition in your file-browser and find the bcm2710-rpi-3-b.dtb file. Make a copy of this file and rename it to bcm2710-rpi-zero-2.dtb. The trick here is simply that the Zero 2’s hardware is close enough to the 3B (minus the ethernet port, some RAM, and the DSI port) that the 3B’s device-tree works.
  • You’re done! You can now boot the card on your new Zero 2. Once you’ve done that, go through the usual sudo apt update, sudo apt upgrade dance to get the “proper” device-tree installed.

Dit werkte, bijna goed. Ik kreeg een foutmelding bij apt upgrade.

Setting up linux-firmware (1.201.1) ...
update-initramfs: Generating /boot/initrd.img-5.13.0-1008-raspi
Killed
E: mkinitramfs failure zstd -q -19 -T0 137
update-initramfs: failed for /boot/initrd.img-5.13.0-1008-raspi with 1.
dpkg: error processing package linux-firmware (--configure):
 installed linux-firmware package post-installation script subprocess returned error exit status 1

Errors were encountered while processing: linux-firmware needrestart is being skipped since dpkg has failed

Een oplossing voor dit probleem vond ik elders. In /etc/initramfs-tools/initramfs.conf moet je zstd vervangen door lz4. En dan:

sudo apt install lz4
sudo apt upgrade

Mosquitto

Mosquitto installeren is simpel:

sudo apt install mosquitto mosquitto-clients

Je moet dan nog wel de configuratie aanpassen om Mosquitto bereikbaar te maken voor andere apparaten in je lokale netwerk. Maak het bestand /etc/mosquitto/conf.d/local.conf met deze inhoud:

allow_anonymous true
listener 1883

Herstarten:

sudo systemctl restart mosquitto

Ik heb twee extra services aangemaakt (zie bronbestanden op github), mqtt-logger.service en mqtt-status.service. De eerste verzamelt data die binnenkomt in Mosquitto en slaat die op in tekstbestanden. De tweede stuurt statusinformatie over de Pi naar Mosquitto.

Thumbnail image

Anthony Aguirre — Cosmological Koans

image

Anthony Aguirre, Cosmological Koans — A Journey to the Heart of Physics, 2019, 375 blz.
Gekocht: oktober 2021, Van der Velde 3
Uitgelezen: december 2021
★★★★★

Een frustrerend boek. Enkele vragen waar ik al heel lang mee zit worden eindelijk beantwoord, maar het boek roept ook weer veel nieuwe vragen op.

Ik heb aardig wat populairwetenschappelijke boeken over kwantummechanica, relativiteit en kosmologie gelezen. Meestal zijn dat van die boeken waarin van alles wordt beweerd, maar niks wordt uitgelegd. Ik denk dan vaak, ik geloof er niks van, die mensen zijn gek.

Dit boek is anders. Dit boek beweert niks, maar laat zien, laat je nadenken. Het opent je geest voor ideeën waar je eerder niet aan wilde. Het is een trip vol verwondering en aha-erlebnissen. En dingen waar ik niks van geloof.

Een boek om te herlezen.

Thumbnail image

Project 09 — Cijferloos

Repost van Tumblr. Sources op github.

Van mijn vorige project had ik een sensor over die alleen de temperatuur correct meet. Kon ik daar iets mee? Ik bedacht een thermometer die kleurcodes gebruikt om de temperatuur weer te geven. Nuttig? Je kunt de temperatuur van grote afstand aflezen, zonder bril. Verder is het gewoon een leuk speeltje.

sensor

Mijn eerste idee was een RGB-LED te gebruiken, met veel verschillende tinten. Op een beeldscherm kun je met verschillende RGB-waardes een groot aantal goed te onderscheiden kleuren maken. Met een RGB-LED valt dat erg tegen. Zuiver rood, groen en blauw zijn goed te onderscheiden, maar ga je kleuren mengen, dan krijg je al snel het is niet wit, maar wat is het dan wel?

Het volgende idee was om meerdere, gewone LEDs van verschillende kleuren te gebruiken. Na wat dingen proberen ben ik uitgekomen op het volgende. Er zijn vier LEDs, blauw, groen, geel en rood. Afhankelijk van de temperatuur geeft een van de LEDs, om de vier seconde, één, twee of drie korte flitsen. Hiermee kun je vrij simpel het temperatuurbereik van tien graden tot op de graad nauwkeurig weergeven.

codetemperatuurcodetemperatuur
1× blauwkouder dan 16°1× geel21°
2× blauw16°2× geel22°
3× blauw17°3× geel23°
1× groen18°1× rood24°
2× groen19°2× rood25°
3× groen20°3× rood26° of warmer

Ik maakte een prototype met een Arduino Nano. Hierbij gebruikte ik de DHT sensor library van Adafruit die op zijn beurt gebruikt maakt van de Adafruit Unified Sensor Library. Dit werkte prima. Maar toen ik de Nano verving door een ATtiny85 werkte het niet meer, met geen enkele pin van de Tiny voor de sensor. Na even zoeken vond ik dat er wel mensen waren die een DHT-sensor gebruiken met de Tiny, maar die gebruiken een andere library, DHTlib. Daarmee werkt het bij mij ook, en de code is veel kleiner.

schema

Het was even puzzelen hoe ik alle componenten moest rangschikken op een mini-breadboard van 170 gaten, maar dat is uiteindelijk gelukt. Breadboard en batterijhouder (3×AAA) passen samen in een transparant visitekaartdoosje, met nog een hoop ruimte over.

compleet

Op de foto worden de kleuren van de brandende LED en de LED ernaast niet goed weergegeven. De LEDs van links naar rechts zijn blauw, groen, geel, rood. Het breadboard zelf is geel, niet oranje. Een digitale camera is niet berekend op licht van een brandende LED.

Library

Sensor

DHT11 van CNT5

Onderdelen op breadboard

labeltypelabeltype
SDHT11ICATtiny85
D1blauwR11kΩ
D2groenR21kΩ
D3geelR3680Ω
D4roodR4680Ω
C0.1µFR510kΩ

Thumbnail image

Project 08 — Arduino Nano 33 IoT

Repost van Tumblr. Sources op github.

M’n eerste project met een microcontroller met toegang tot het internet. Nog geen echte IoT-toepassing. Er wordt geen data opgeslagen via het internet. De verbinding is er alleen om gegevens op te vragen. (Update: Inmiddels wel. Zie project 10.)

Ik had een ESP32 kunnen gebruiken, maar ik koos voor de drie keer zo dure Arduino Nano 33 IoT. Ik dacht, met een echte Arduino loop ik minder risico op problemen met library’s.

Het idee was dat ik een klokje had waarop ik ’s nachts zou kunnen zien hoe lang het nog zou duren voor de zon op kwam. Tegenwoordig kan ik dat direct op m’n tablet zien, maar die wil ik ’s nachts niet gebruiken.

breadboard

Ik heb het idee wat uitgebreid. Tussen zonsondergang en zonsopkomst laat het niet alleen zien hoe lang het nog duurt tot de zon opkomt, maar ook hoe lang het geleden is dat de zon onderging. En tussen zonsopkomst en zonsondergang het omgekeerde. Daarnaast laat het ook de huidige tijd zien. En ik dacht, laat ik er nog een sensor bijzetten voor temperatuur en luchtvochtigheid.

Het display is slechts 1,3 inch groot. Daar past alle info op als je het klein weergeeft, maar ik wilde de waardes van een afstandje kunnen lezen, zonder bril. Daarom laat het afwisselend steeds een van de waardes zien.

De hoeveelheid licht dat de letters op het display standaard geven is aardig sterk, te veel voor nachtelijk gebruik. De maximale waarde voor helderheid is 255. Ik gebruik nu ’s nachts de waarde 20, en overdag 100.

De tijd wordt gesynchroniseerd via NTP. De tijd wordt opgevraagd van m’n modem die tevens router en NTP-server is.

De tijden waarop op mijn lokatie de zon opkomt en ondergaat worden opgevraagd van een server. De code om die tijden te berekenen zijn te groot om door de microcontroller zelf te laten berekenen.

breadboard

Op de foto’s is de eerste opzet te zien. Er is een LED die brandt als er verbinding met het internet wordt gemaakt om gegevens op te vragen. De tijden van zonsopkomst en ondergang worden twee keer per dag opgevraagd. En ik dacht dat een of twee keer per dag de tijd opvragen voldoende zou zijn om de interne klok van de Arduino mee te synchroniseren. Dat laatste viel tegen. Afgaand op de waardes geleverd door de functie millis() loopt de boel na een aantal uur een kwartier achter. Nu is er een continue verbinding met het internet, en wordt elke minuut de tijd opgevraagd. De LED heb ik een andere functie gegeven, die gaat nu even branden op het hele en het halve uur, als een visuele bel.

Voor temperatuur en luchtvochtigheid gebruikte ik aanvankelijk een goedkope DHT11-sensor, nog te zien op de foto. Voor temperatuur is die goed genoeg. Maar de waardes voor luchtvochtigheid begonnen al snel af te wijken van de waardes van twee weerstations waarmee ik hem vergeleek. De waardes waren zo’n 20% hoger.

Ik heb de sensor vervangen door een BME280. Duurder, nauwkeuriger, en hij geeft ook de luchtdruk aan, dus die waarde wordt nu ook weergegeven.

Libraries

Docs

Display

VMA437 met chip SH1106

displayNano
GNDGND
VCC+3V3
CLK (sck)D4
MOSID5
RESRESET
DC (a0)D7
CSD6
// SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7
U8G2_SH1106_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R2, 4, 5, 6, 7);

Sensor

VMA335 met chip BME280

sensorNano
Vin+3V3
GndGND
SDAA4
SCLA5

Thumbnail image

Sylvain Neuvel — Only Human

image

Sylvain Neuvel, Only Human — Book Three of the Themis Files, 2018, 424 blz.
Gekocht: november 2021, Van der Velde 3
Uitgelezen: november 2021
★★★★★

Thumbnail image

Sylvain Neuvel — Waking Gods

image

Sylvain Neuvel, Waking Gods — Book Two of the Themis Files, 2017, 322 blz.
Gekocht: oktober 2021, Van der Velde 3
Uitgelezen: oktober 2021
★★★★☆

Thumbnail image

Jan Westerhoff — Reality

image

Jan Westerhoff, Reality — A Very Short Introduction, 2011, 123 blz.
Gekocht: juli 2012, Amazon.de
Uitgelezen: oktober 2021
★★☆☆☆

Thumbnail image

Sylvain Neuvel — Sleeping Giants

image

Sylvain Neuvel, Sleeping Giants, Book One of the Themis Files, 2016, 377 blz.
Gekocht: oktober 2021, Van der Velde 3
Uitgelezen: oktober 2021
★★★★☆

Thumbnail image

Andy Weir — Project Hail Mary

image

Andy Weir, Project Hail Mary, 2021, 476 blz.
Gekocht: oktober 2021, Van der Velde 3
Uitgelezen: oktober 2021
★★★★☆