← Back to CoursesStemExpert
StemExpert
Intermediate · Werkboek · 30. Datalogging en communicatie
StemExpert · Brecht Corbeel · schoolium.me
StemExpert
I30. Datalogging en communicatie — werkboek
IIntermediate · deel I7 · Programmeren

Werkboek · hoofdstuk 30Datalogging en communicatie

Een logboek dat zichzelf schrijft: van bits op een draad tot een grafiek in Python

Je begint met bits, bytes en regels lezen, rekent dan aan kabels en sensoren en schrijft Python die met rare regels overweg kan, en eindigt met het ontwerp van het logboek van de module, een protocol om de klok te zetten en een eigen meting. Alle code in de oplossingen is getest. Opdracht 30.13 hoort in je Habitat-portfolio.

5× oefenen7× toepassen4× uitdagen± 441 min0/16 gedaan
Elke minuut een regel op de kaart: het logboek van de klimaatmodule.
Elke minuut een regel op de kaart: het logboek van de klimaatmodule.
Hoe lees je een opdracht?
Drie tredenOefenen Toepassen Uitdagen

Elk hoofdstuk bouwt op: eerst oefenen (één stap, direct toepassen), dan toepassen (meerdere stappen, in een context), dan uitdagen (transfer, open problemen, andere leerlijnen erbij).

De StemExpert-schaal5

Eén moeilijkheidsschaal van 1 tot 9 over de drie niveaus heen: Fundamental loopt van 1 tot 4, Intermediate van 3 tot 7, Expert van 6 tot 9. Zo zie je dat de uitdaging van het ene niveau de oefening van het volgende is.

Oefenen

Oefenen

één stap, direct toepassen
30.1

Een teken van de draad lezen

Oefenen3Analyseren12 min
Een logicanalysator toont de TX-lijn van de Mega op 9600 baud (8N1). Elke bit duurt 104 µs.
TX025050075010001250t (µs)
Eén teken: vóór en na het teken is de lijn in rust.
  1. a
    Waar begint het teken? Schrijf de acht databits in de volgorde waarin ze verstuurd worden.
  2. b
    Zet ze om naar een byte (b7 … b0), in hexadecimaal en decimaal. Welk teken is het (ASCII)?
  3. c
    Teken hoe het teken 'A' (65) eruitziet, met startbit en stopbit.
Hint
Het minst belangrijke bit (b0) komt eerst. In ASCII is 'A' 65 en 'K' 75.
30.2

Tekens per seconde

Oefenen3Rekenen12 min
Een seriële verbinding gebruikt 8N1: 10 bits per teken.
  1. a
    Hoeveel tekens per seconde bij 9600, 19 200 en 115 200 baud?
  2. b
    Het programma serieel_csv.ino stuurt om de 2 s een regel van ongeveer 20 tekens. Welk deel van de tijd is de lijn bezig bij 9600 baud?
  3. c
    Iemand wil om de 10 ms een regel van 50 tekens sturen. Welke baudrates kunnen dat?
30.3

De scanner lezen

Oefenen3Begrijpen12 min
Drie leerlingen draaien de I²C-scanner op hun opstelling. Ze hebben een SHT31, een DS3231-moduletje en een INA226 aangesloten.
  1. a
    Leerling A ziet: 0x40, 0x44, 0x57, 0x68. Welke chip is welk adres? Waarom vier adressen voor drie moduletjes?
  2. b
    Leerling B ziet: 0 apparaten gevonden. Noem drie mogelijke oorzaken.
  3. c
    Leerling C wil een tweede SHT31 toevoegen (in de meetkas). Kan dat op dezelfde bus? Hoe?
30.4

BCD lezen

Oefenen4Rekenen15 min
De registers 0x00 tot 0x06 van een DS3231 geven, in hexadecimaal: 07 59 23 07 18 10 26. Register 0x03 is de dag van de week (RTClib: maandag = 1).
  1. a
    Welke datum en tijd staan er? Welke dag van de week?
  2. b
    Schrijf 0x59 binair. Waarom is BCD handig voor een klok, en waarom wat verspillend?
  3. c
    Welke bytes schrijf je naar de registers 0x00 tot 0x02 voor 14:05:00?
30.5

Wat is er mis met deze regels?

Oefenen4Begrijpen15 min
De kop van een logbestand is tijdstip,temperatuur_C,vocht_pct,verbruik_Wh,zon_Wh,licht_lx,batterij_V. Beoordeel deze zes regels.
  1. a
    Welke regel is in orde, en wat is er mis met de andere? Hoe zou je ze voorkomen in de logger?
    regelin orde?probleemvoorkomen
    2026-10-12 08:00,18.0,83.9,1.33,1.31,1742,13.05
    2026-10-12 08:01,18,0,83,8,1.52,1.52,1908,13.05
    12/10/2026 08:02,18.1,83.7,1.73,1.74,2075,13.05
    2026-10-12 08:03,0,0,1.93,1.95,2240,13.04
    2026-10-12 08:04,nan,nan,2.12,2.13,2401,13.04
    2026-10-12 08:05,18.2,83.5,2.3
Toepassen

Toepassen

meerdere stappen, in een context
30.6

Een SHT31 narekenen

Toepassen4Rekenen20 min
De SHT31 stuurt zes bytes. Twee metingen: 64 29 59 9C ED F5 en 64 3C 2B 9C 6A 18. Gebruik de formules en de CRC uit het handboek.
  1. a
    Reken beide metingen om naar °C en % (zonder de CRC te controleren).
  2. b
    Schrijf in Python een functie crc8(data) en test ze met het voorbeeld uit de datasheet (0xBE 0xEF geeft 0x92). Welke meting is beschadigd?
  3. c
    Waarom gooit de logger een beschadigde meting weg in plaats van ze te gebruiken? Het verschil met de eerste meting is maar 0,05 °C.
30.7

Pull-ups voor een langere kabel

Toepassen5Rekenen20 min
De sensorkast moet 5 m van de Mega komen. De kabel heeft 100 pF per meter; de chips en de Mega samen 50 pF. Op de bus zitten de 10 kΩ van de Mega, en het SHT31-bordje heeft zelf ook 10 kΩ. Grenzen: stijgtijd 0,85 · R · C hoogstens 1 µs, R minstens 1,53 kΩ.
  1. a
    Bereken C en de stijgtijd met de twee pull-ups die er al zijn.
  2. b
    Tussen welke grenzen moet de totale pull-up liggen? Kies een extra weerstand uit de E12-reeks (1,0 - 1,2 - 1,5 - 1,8 - 2,2 - 2,7 - 3,3 - 3,9 - 4,7 kΩ).
  3. c
    En bij 10 m kabel?
30.8

Seriële regels die niet kloppen

Toepassen5Programmeren25 min
Over de seriële poort komen soms rare regels binnen: een half bericht na het openen van de poort, een melding, 'nan', een regel met een decimale komma. lees_serieel.py mag daar niet van crashen.
  1. a
    Schrijf een functie verwerk(regel, kop) die een woordenboek met getallen teruggeeft (None voor een lege cel of nan), of None als de regel onbruikbaar is.
  2. b
    Test ze met deze regels: 2,23.50,64.0,477 · 4,23,61,63.8,478 · # SD-kaart klaar · 6,nan,63.6,479 · 8,,,480 · 10,23.9 · 12,24.01,63.0,482x · een lege regel.
30.9

Vind de fouten in de eerste logger

Toepassen5Programmeren25 min
Een leerling schrijft een eerste logger. Hij compileert zonder klagen en de seriële monitor toont iets, maar na een dag staat er niets op de kaart.
// logger_fout.ino - een eerste poging tot datalogger (er zitten vier fouten in)
#include <Wire.h>
#include <SD.h>

File bestand;

void setup() {
  Serial.begin(115200);
  Wire.begin();
  SD.begin(53);
  bestand = SD.open("LOG/2026-10-12.CSV", FILE_WRITE);
  bestand.println("tijd_ms,temperatuur_C");
}

void loop() {
  Wire.beginTransmission(0x44);
  Wire.write(0x24);
  Wire.write(0x00);
  Wire.endTransmission();
  delay(20);
  Wire.requestFrom(0x44, 6);
  unsigned int ruw = (Wire.read() << 8) | Wire.read();
  float t = -45 + 175.0 * ruw / 65535;
  char regel[40];
  sprintf(regel, "%lu,%.1f", millis(), t);
  bestand.println(regel);
  Serial.println(regel);
  delay(60000);
}
  1. a
    Waarom staat er niets op de kaart? Er zijn twee redenen in setup().
  2. b
    Wat is er mis met (Wire.read() << 8) | Wire.read()?
  3. c
    De seriële monitor toont bij de temperatuur een vraagteken. Waarom?
  4. d
    Noem nog twee zwakke punten van dit programma.
30.10

Van minuten naar blokken van drie uur

Toepassen6Programmeren30 min
De programma's van hoofdstuk 28 werken met blokken van drie uur. Maak uit de testweek (logboek.py) een bestand in dat formaat: tijdstip,temperatuur_C,vocht_pct,verbruik_Wh,zon_Wh, het tijdstip het begin van het blok, temperatuur met één decimaal, vocht als geheel getal, energie in hele Wh. Een blok krijgt alleen een temperatuur als minstens de helft van de 180 minuten geldig is.
  1. a
    Schrijf het programma.
  2. b
    Bekijk de blokken van woensdag. Waarom is het blok van 21 uur maar 22 Wh, terwijl het op heldere dagen rond de 200 Wh ligt?
  3. c
    Waarom de regel 'minstens de helft geldig'? Wat had je gekregen zonder die regel als de sensor een heel blok los had gezeten?
30.11

Uurgemiddelden van één dag

Toepassen5Programmeren20 min
Gebruik logboek.py. Je wil voor woensdag 14 oktober de gemiddelde temperatuur per uur, met het aantal geldige minuten erbij.
  1. a
    Schrijf het programma. Toon de uren 10 tot 14.
  2. b
    Het uur van 11 heeft minder geldige minuten. Is het gemiddelde van dat uur daardoor fout?
30.12

Wat zie je in de grafiek?

Toepassen5Analyseren20 min
Twee grafieken uit de testweek: het vermogen op woensdagavond en de zonnestroom met het verbruik op maandagvoormiddag (zie het handboek). En de dagtabel van per_dag.py:
datum       T gem  T min  T max  geldig  verbruik   zon  saldo (kWh)
2026-10-12   20.0   17.7   24.7    1438      1.50  1.74  +0.23
2026-10-13   19.4   17.6   22.4    1438      1.67  1.71  +0.03
2026-10-14   19.1   17.6   21.0    1428      2.15  1.27  -0.88
2026-10-15   19.2   17.7   21.4    1440      1.46  2.43  +0.98
2026-10-16   19.7   17.7   23.7    1440      1.54  1.69  +0.14
2026-10-17   19.6   17.8   22.9    1440      1.61  1.66  +0.05
2026-10-18   19.2   17.7   21.2    1440      2.02  1.89  -0.13
8910111213140100200300400500600700800900uur (maandag 12 oktober)vermogen (W)batterij volzonverbruik
Maandag 12 oktober, van 8 tot 14 uur.
  1. a
    Waarom daalt de zonnestroom op maandag om 10:55 plots tot het verbruik, terwijl het de helderste dag van de week is?
  2. b
    Op welke dag denk je dat de laadtoestand het laagst was? Onderbouw met de tabel.
  3. c
    Een klasgenoot besluit: 'Op maandag leverde de zon maar 1,74 kWh, dus de panelen zijn te klein.' Wat is er mis met die redenering?
Uitdagen

Uitdagen

transfer, open problemen, leerlijnen combineren
30.13

Habitat: het logboek van de klimaatmodule

Uitdagen6Habitat50 min
Je ontwerpt het logboek voor een teeltseizoen van maart tot oktober (245 dagen). De module heeft een Mega met klimaat.ino versie 2, een microSD-kaart van 8 GB, en een 5 V-omvormer met een rendement van 83 %. Gebruik de getallen uit het handboek.
  1. a
    De beheerder wil elke 10 s een regel in plaats van elke minuut. Hoeveel ruimte kost een seizoen dan, en hoeveel bestanden? Is dat een probleem?
  2. b
    Schat het eigen verbruik van de logger over een seizoen in Wh, en vergelijk met het basisverbruik van de module (230 Wh per dag).
  3. c
    Welke drie extra kolommen zou jij toevoegen voor de teelt (hoofdstuk 13, 15, 16)? Waar komen ze in de regel, en waarom daar?
  4. d
    Stel een plan op: hoe controleer je elke week of de logger nog werkt, en hoe bewaar je de gegevens veilig?
Zo wordt dit beoordeeld
RekenwerkRegellengte, regels per dag, bytes per seizoen en aantal bestanden juist; eenheden.
EnergieStroom per onderdeel, rendement van de omvormer, Wh per seizoen, vergelijking in procent.
KolommenRelevante grootheden met eenheid in de naam, achteraan toegevoegd, met motivatie.
PlanConcreet en haalbaar: wat, wanneer, door wie; back-up en controle op gaten en lege cellen.
30.14

Ontwerp: de klok zetten vanaf de computer

Uitdagen6Ontwerpen40 min
logger.ino aanvaardt de opdracht T2026-10-11 20:00:00. Je wil een Python-programma dat de klok zet op de tijd van de computer, in wintertijd, en controleert of het gelukt is.
  1. a
    Waarom de tijd van de computer in wintertijd omzetten, en niet gewoon de tijd tonen die op je scherm staat?
  2. b
    Schrijf klok_zetten.py met pyserial en datetime. Denk aan de herstart van de Mega bij het openen van de poort.
  3. c
    Wat gebeurt er in logger.ino met de minuut die bezig was toen de klok verzet werd? Waarom is dat een goede keuze?
  4. d
    Stel twee uitbreidingen van het protocol voor (bv. om de tijd op te vragen) en zeg hoe de Mega moet antwoorden.
Zo wordt dit beoordeeld
TijdTijdzone expliciet (UTC+1), onafhankelijk van zomertijd op de computer.
ProgrammaPoort openen, 2 s wachten, opdracht met regelovergang als bytes, antwoord lezen en tonen, poort sluiten.
RobuustheidHet antwoord van de Mega wordt gecontroleerd; andere regels (logregels) storen niet.
ProtocolUitbreidingen met een vaste vorm, een antwoord dat met # begint, en wat er bij een fout gebeurt.
30.15

Labo: log het klaslokaal

Uitdagen6Labo90 min
Bouw de datalogger uit de proef van het handboek en laat hem een schooldag loggen. Analyseer daarna met Python.
  1. a
    Teken het aansluitschema (I²C met pull-ups, SPI, voeding) en noteer de adressen die de scanner vond.
  2. b
    Noteer tijdens de dag de gebeurtenissen (lesbegin, pauzes, ramen open en dicht).
    tijdgebeurtenis
  3. c
    Maak een grafiek van temperatuur en vochtigheid en zet de gebeurtenissen erbij. Wat zie je?
  4. d
    Controleer je gegevens: hoeveel regels, lege cellen, gaten? Hoe groot is het bestand, en klopt dat met je verwachting?
Zo wordt dit beoordeeld
OpstellingCorrect schema; scanner vindt alle chips; klok gezet in wintertijd.
MetingenEen volledige dag, een logboek van gebeurtenissen met tijden.
AnalyseGrafiek met assen en eenheden, gebeurtenissen aangeduid, verbanden beschreven.
KwaliteitAantal regels, lege cellen en gaten gecontroleerd en verklaard; bestandsgrootte berekend.
30.16

Het meetbereik van de stroommeting

Uitdagen7Analyseren35 min
In hoofdstuk 16 telt de Mega de laadtoestand met een ACS712-20A op A4: 2,50 V bij 0 A en 0,100 V per ampère; de uitgang kan niet boven ±5 V gaan. De logger gebruikt twee INA226 met een shunt van 100 A / 75 mV. Op een heldere middag leveren de panelen tot 1000 W; de rail staat dan op 13,3 V en de module verbruikt 20 W.
  1. a
    Hoe groot is de laadstroom van de batterij dan? Wat geeft de ACS712 bij die stroom, en wat doet de ADC ermee?
  2. b
    De coulombteller telt elke 2 s de gemeten stroom op. Een helder uur lang laadt de batterij met de stroom uit (a). Hoeveel procent laadtoestand mist de teller dan (240 Ah)?
  3. c
    Hoeveel stappen van de INA226 is die stroom, en hoeveel warmte ontwikkelt de shunt?
  4. d
    Stel een verbetering voor de laadtoestand voor, met de chips die de module nu heeft.
ZelfevaluatieKleur per doel: lukt al / bijna / nog niet