Analyse von Umweltdaten: Unterschied zwischen den Versionen

Aus Unterrichtsmaterial
Wechseln zu:Navigation, Suche
(Phase 3 - Verlauf erstellt)
K
 
(56 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
 +
{{Infobox|image=|thema=Analyse von Umweltdaten, Data Science, Data Analysis, epistemisches Programmieren|Material=|Material_Name=|Autor=Sven Hüsing|subpages=True|Material1=|Material1_Name=|Material2=|Material2_Name=}}
 +
{| class="wikitable"
 +
|+
 +
|'''Titel'''
 +
|'''Analyse von Umweltdaten: Datenanalyse mit der Sensebox, Jupyter Notebooks und Python'''
 +
|-
 +
|'''Modul'''
 +
|Datenprojekte und Datenexploration:
 +
Umweltdaten mit Sensoren sammeln und analysieren
 +
|-
 +
|'''Stichworte'''
 +
|Erkenntnisse aus Daten gewinnen, Erheben von Umweltdaten,
 +
 +
Auswerten von Umweltdaten, Epistemisches Programmieren, Data Science
 +
|-
 +
|'''Zielgruppe'''
 +
|Klasse 8-10
 +
|-
 +
|'''Inhaltsfelder'''
 +
|Information und Daten
 +
Informatik, Mensch und Gesellschaft
 +
 +
Informatiksysteme
 +
|}
 +
Das übergeordnete Thema dieser Unterrichtsreihe lautet "Data Science mit Python". In dieser konkreten Unterrichtsreihe beziehen sich die Daten auf umweltbezogene Aspekte wie Temperatur, Luftfeuchtigkeit oder Feinstaubbelastung, sodass die SuS eine Umweltanalyse auf Grundlage einer eigenen Fragestellung durchführen sollen.
 +
 +
Es gibt jedoch auch andere Daten, die untersucht werden können. Ein Beispiel hierfür sind Parkplatzdaten, welche in der Unterrichtsreihe "Datenauswertung mit Python (Parkplatzdaten)" analysiert werden sollen. Man erkennt also, dass Data Science mit Python anhand verschiedenster Daten durchgeführt werden kann.
 +
 +
In dieser Unterrichtsreihe sollen umweltbezogene Daten im Vordergrund stehen. Dabei sammeln die SuS mithilfe einer (ggf. selbst programmierten) Sensebox umweltspezifische Daten wie Temperatur, Luftfeuchtigkeit oder Feinstaub. Zum Ende der Unterrichtsreihe erstellen die Gruppen, in die die SuS aufgeteilt werden, eine eigene Präsentation, die sie vor den anderen SuS des Kurses oder auch im Rahmen eines Projekttages halten können.
 +
 +
Die groben Aufgaben/Meilensteine der Unterrichtsreihe gliedern sich dabei in folgende 6 Schritte:
 +
 +
#Problemstellung/Fragestellung erarbeiten
 +
#Plan/Messinstrument zur Datenerhebung erstellen
 +
#Daten erheben (mithilfe der Sensebox)
 +
#Daten analysieren
 +
#(gesellschaftliche) Implikationen aus der Datenanalyse herausarbeiten
 +
#Ergebnisse präsentieren
 +
 
==Beschreibung der Unterrichtsreihe==
 
==Beschreibung der Unterrichtsreihe==
<br />
 
  
==Vorbereitende Schritte zur Programmierunng der Sensebox==
+
===Grobziele der Unterrichtsreihe===
 +
Die Schülerinnen und Schüler führen das Projekt durch und…
 +
 
 +
*lernen ein erstes (exemplarisches) Data Science kennen, wobei die Schnittstellen ''Messinstrument'', ''Daten'' und ''Daten im Kontext'' im Fokus stehen.
 +
*lernen erste Data-Moves kennen.
 +
*erlangen Grundkenntnisse im Umgang mit JupyterNotebook und Python.
 +
*lernen Auswertungsmöglichkeiten und Darstellungsweisen großer Datenmengen kennen.
 +
*können Erfahrungen in der datengetriebenen Analyse unserer Umwelt sammeln.
 +
*reflektieren, wie Datenanalysen den (datengetriebenen) Blick auf die Welt und das eigene Verhalten beeinflussen können.
 +
*lernen, gesammelte Daten und durchgeführte Datenanalysen im Kontext der Realwelt und deren Einflussfaktoren zu reflektieren.
 +
*erfahren, dass Datenanalysen interessengeleitet sind und nicht eine reale Abbildung der Welt darstellen.
 +
 
 +
Falls die Sensebox von den SuS selbst programmiert wird:
 +
 
 +
*lernen Software und Hardware rund um Arduino als Beispiel für einen Platinencomputer kennen.
 +
*machen erste Erfahrungen in der Programmierung von Arduinos.
 +
 
 +
'''<u><big>Wichtiger allgemeiner Hinweis:</big></u>'''
 +
 
 +
Bei dieser Unterrichtsreihe kann ein wesentlicher Erkenntnisgewinn für die SuS darin bestehen, dass sie Fehler bei der Datenauswertung machen. Beispielsweise könnte man feststellen, dass der Feinstaubsensor nicht immer zuverlässig die Feinstaubbelastung misst, wenn die Luftfeuchtigkeit einen gewissen Wert überschritten hat. Die SuS können hierbei lernen, dass man "blanken" Daten nicht immer ohne Einschränkungen vertrauen kann, sondern diese immer auch im Kontext sehen sollte, in dem sie gesammelt wurden.
 +
 
 +
Folglich sollten "Irrwege" an dieser Stelle zugelassen werden und insbesondere keine vorbereitende "Datenbereinigung" durch die Lehrkraft erfolgen, da die SuS den '''gesamten''' Prozess einer Datenanalyse durchlaufen sollen.
 +
 
 +
===Mess- und Auswertungsinstrument===
 +
Die Sammlung der Umweltdaten erfolgt mithilfe der Sensebox, die ein Arduino mit bereits zusammengestellten Sensoren für verschiedene Messwerte (wie Temperatur, Feinstaub,...) ist. Genauere Informationen dazu gibt es [https://sensebox.de hier]. Ein Handbuch zur Sensebox kann man sich [https://sensebox.github.io/books-v2/edu/de/ hier] ansehen. Die gesammelten Daten können bei einer WLan-Verbindung kontinuierlich oder auch nachträglich auf die OpenSenseMap hochgeladen werden ([https://opensensemap.org Link]). Hier werden weltweit alle registrierten Senseboxen inklusive ihrer aktuellen Messwerte auf einer Karte angezeigt.
 +
 
 +
Die Analyse der gesammelten Daten erfolgt in einem vorgefertigten JupyterNotebook. Der Vorteil hierbei liegt darin, dass man in Jupyter Notebooks Textblöcke und Programmierblöcke, die auch eine Ausgabe unter sich selbst erzeugen können, aneinanderreihen kann. Weitere Informationen zu Jupyter Notebooks gibt es auf [[Jupyter Notebooks|dieser Wiki-Seite]].
 +
 
 +
==Geplanter Verlauf der Unterrichtsreihe==
 +
Diese Unterrichtsreihe lässt sich in zwei verschiedenen Varianten durchführen. Abhängig davon sind auch Lernziele und Dauer der Unterrichtsreihe.
 +
 
 +
In '''Variante A''' steht neben der Auswertung der Daten (in Jupyter Notebooks) auch die Programmierung der Messinstrumente (Senseboxen) im Vordergrund. Hierzu wird ca. eine Unterrichtsstunde benötigt, in der sich die SuS mit der Sensebox vertraut machen sowie zwei weitere, in denen sie die Sensebox in Abhängigkeit von ihrer Fragestellung programmieren.
 +
 
 +
===Verlauf Variante A (mit Programmierung der Sensebox)===
 +
 
 +
====Vorbereitende Schritte zur Programmierung der Sensebox (im Fall von Variante A)====
 
Generell ist es wichtig zu wissen, dass man die Sensebox auf zwei verschiedene Arten programmieren kann:
 
Generell ist es wichtig zu wissen, dass man die Sensebox auf zwei verschiedene Arten programmieren kann:
  
Zeile 8: Zeile 81:
 
#über die Arduino-Software (Download unter [https://www.arduino.cc/en/Main/Software diesem Link])
 
#über die Arduino-Software (Download unter [https://www.arduino.cc/en/Main/Software diesem Link])
  
Zu 1.: Der Vorteil bei dieser Variante ist, dass man die Sensebox lediglich anschließen muss und den von der Website exportierten Code lediglich per "Drag and Drop" auf die Sensebox laden muss. Ein Videotutorial gibt es [https://www.youtube.com/watch?v=8ThlZ0DQJ9Y&feature=youtu.be&t=187 hier] (bis 8:43 min).
+
Zu 1.: Der Vorteil bei dieser Variante ist, dass man die Sensebox lediglich anschließen und den von der Website exportierten Code per "Drag and Drop" auf die Sensebox laden muss. Ein Videotutorial gibt es [https://www.youtube.com/watch?v=8ThlZ0DQJ9Y&feature=youtu.be&t=187 hier] (bis 8:43 min).
  
 
Falls man mit den SuS bereits auf den Arduino-Quellcode hinarbeiten möchte, sollte man beachten, dass der zum "Block-Code" gehörende Arduino Quellcode auf der Blockly-Programmierwebsite stets rechts im Fenster angezeigt wird. Dies kann insbesondere auch dann hilfreich sein, wenn die Kompilierung über die Website nicht funktioniert. In diesem Fall kann man den im Fenster angezeigten Code auch in die Arduino-Software kopieren und von dort aus kompilieren.
 
Falls man mit den SuS bereits auf den Arduino-Quellcode hinarbeiten möchte, sollte man beachten, dass der zum "Block-Code" gehörende Arduino Quellcode auf der Blockly-Programmierwebsite stets rechts im Fenster angezeigt wird. Dies kann insbesondere auch dann hilfreich sein, wenn die Kompilierung über die Website nicht funktioniert. In diesem Fall kann man den im Fenster angezeigten Code auch in die Arduino-Software kopieren und von dort aus kompilieren.
  
Zu 2.: Hierbei kann man die Sensebox durch einen Arduino-Code komplett frei programmieren. Der Vorteil hierbei ist, dass man den Code wesentlich individueller schreiben kann und so auf die eigenen Wünsche zuschneiden kann. Allerdings müssen bei dieser Variante einige Programme/Plugins zuvor installiert werden. Eine gute Anleitung hierzu bietet das senseBox:edu Buch in folgenden vier Abschnitten:
+
Zu 2.: Hierbei kann man die Sensebox durch einen Arduino-Code komplett frei programmieren. Der Vorteil hierbei ist, dass man den Code wesentlich individueller schreiben kann und so auf die eigenen Wünsche zuschneiden kann. Allerdings müssen bei dieser Variante zuvor einige Programme/Plugins installiert werden. Eine gute Anleitung hierzu bietet das senseBox:edu Buch in folgenden vier Abschnitten:
  
 
*[https://sensebox.github.io/books-v2/edu/de/erste-schritte/software-installation.html Schritt 1: Software Installation]
 
*[https://sensebox.github.io/books-v2/edu/de/erste-schritte/software-installation.html Schritt 1: Software Installation]
Zeile 21: Zeile 94:
 
Ein Videotutorial, welches auch das Laden eines Programms auf die Sensebox beinhaltet, gibt es [https://www.youtube.com/watch?v=6L4zAuuiAtU hier]. Wichtig dabei: Im Video wird ein bereits fertiger Code von der OpenSenseMap in die Arduino-Software eingefügt. Das Hochladen für selbst geschriebenen Code funktioniert aber genauso.
 
Ein Videotutorial, welches auch das Laden eines Programms auf die Sensebox beinhaltet, gibt es [https://www.youtube.com/watch?v=6L4zAuuiAtU hier]. Wichtig dabei: Im Video wird ein bereits fertiger Code von der OpenSenseMap in die Arduino-Software eingefügt. Das Hochladen für selbst geschriebenen Code funktioniert aber genauso.
  
==Geplanter Verlauf der Unterrichtsreihe==
+
====Geplanter Verlauf der Unterrichtsreihe (Variante A)====
Diese Unterrichtsreihe lässt sich in zwei verschiedenen Varianten durchführen. Abhängig davon sind auch Lernziele und Dauer der Unterrichtsreihe.
 
 
 
In '''Variante A''' steht neben der Auswertung der Daten (in Jupyter Notebooks) auch die Programmierung der Messinstrumente (Senseboxen) im Vordergrund. Hierzu wird ca. eine Unterrichtsstunde benötigt, in der sich die SuS mit der Sensebox vertraut machen sowie zwei weitere, in denen sie die Sensebox in Abhängigkeit von ihrer Fragestellung programmieren.
 
 
{| class="wikitable"
 
{| class="wikitable"
|+Geplanter Verlauf der Unterrichtsreihe (Variante A)
+
|+
 
!Phase
 
!Phase
 
!Inhalt
 
!Inhalt
Zeile 35: Zeile 105:
 
Einführung in das Messinstrument "Sensebox"
 
Einführung in das Messinstrument "Sensebox"
  
Generieren einer Fragestellung für die geplante datengeriebene Analyse
+
Generieren einer Fragestellung für die geplante datengetriebene Analyse
 
|2 Schulstunden
 
|2 Schulstunden
 
|-
 
|-
Zeile 62: Zeile 132:
 
|1 Schulstunde
 
|1 Schulstunde
 
|}
 
|}
Alternativ kann können die SuS auch eine bereits fertig programmierte Sensebox nutzen, die die Werte für Feinstaub (PM2.5), Temperatur und Luftfeuchtigkeit in jeweils separaten .csv-Dateien auf einer SD-Karte speichert. Auf diese Weise fällt in dieser '''Variante B''' im Gegensatz zu Variante A in Phase 1 die ''Einführung in das Messinstrument "Sensebox"'' sowie in Phase 2 die ''Erstellung und Testung des Messinstruments'' weg, sodass sich der Umfang der Reihe um 3 Schulstunden reduziert. Folglich ergibt sich folgender Ablauf:
+
 
 +
===Verlauf Variante B (ohne Programmierung der Sensebox)===
 +
Alternativ können die SuS auch eine bereits fertig programmierte Sensebox nutzen, die die Werte für Feinstaub (PM2.5), Temperatur und Luftfeuchtigkeit in jeweils separaten .csv-Dateien auf einer SD-Karte speichert. Auf diese Weise fällt in dieser '''Variante B''' im Gegensatz zu Variante A in Phase 1 die ''Einführung in das Messinstrument "Sensebox"'' sowie in Phase 2 die ''Erstellung und Testung des Messinstruments'' weg, sodass sich der Umfang der Reihe um 3 Schulstunden reduziert. Folglich ergibt sich folgender Ablauf:
 +
 
 +
====Geplanter Verlauf der Unterrichtsreihe (Variante B)====
 
{| class="wikitable"
 
{| class="wikitable"
|+Geplanter Verlauf der Unterrichtsreihe (Variante B)
+
|+
 
!Phase
 
!Phase
 
!Inhalt
 
!Inhalt
Zeile 71: Zeile 145:
 
|1
 
|1
 
|Einführung in das Projekt
 
|Einführung in das Projekt
Generieren einer Fragestellung für die geplante datengeriebene Analyse
+
Generieren einer Fragestellung für die geplante datengetriebene Analyse
 
|1 Schulstunde
 
|1 Schulstunde
 
|-
 
|-
Zeile 103: Zeile 177:
  
 
====Beschreibung der Phase====
 
====Beschreibung der Phase====
In dieser Phase soll den SuS das Projekt bzw. Vorhaben vorgestellt werden. Sie sollen dabei eine eigene Fragestellung entwickeln, der sie in der nachfolgenden Datenanalyse nachgehen wollen. Beispiele für Fragestellungen wären beispielsweise:
+
In dieser Phase soll den SuS das Projekt bzw. Vorhaben vorgestellt werden. Sie sollen dabei eine eigene Fragestellung entwickeln, der sie in der nachfolgenden Datenanalyse nachgehen wollen. Beispiele für Fragestellungen sind:
  
 
*Zu welcher Uhrzeit ist die Feinstaubbelastung an der Schule am höchsten ?
 
*Zu welcher Uhrzeit ist die Feinstaubbelastung an der Schule am höchsten ?
*Wie viel Feinstaub produzieren verschiedene Autotypen (z.B. Diesel- vs. Benzinauto) ?
+
*Wie viel Feinstaub produzieren verschiedene Autotypen (z.B. Diesel- vs. Benzinauto) ? (Hierbei handelt es sich um "Kurzzeitmessungen", bei denen die Sensebox unter den Auspuff des Autos gehalten wird.)
 
*Wie oft/Wann überschreitet die Feinstaubbelastung an unserer Schule EU-Grenzwerte ?
 
*Wie oft/Wann überschreitet die Feinstaubbelastung an unserer Schule EU-Grenzwerte ?
  
 
Bei der Durchführung von '''Variante A''' (mit Programmierung der Sensebox) sollen die SuS zudem die Sensebox kennenlernen und erste kleinere Programmierprojekte mit Ihr durchführen.
 
Bei der Durchführung von '''Variante A''' (mit Programmierung der Sensebox) sollen die SuS zudem die Sensebox kennenlernen und erste kleinere Programmierprojekte mit Ihr durchführen.
 +
 +
'''<u><big>ACHTUNG:</big></u>''' Von dem im dieser Phase bearbeiteten Notebook ("Phase 0 Fragestellung erarbeiten") sollten die SuS in jedem Fall einen Screenshot machen oder das Notebook herunterladen (s. Tipp in Phase 4), da die Notebooks aktuell noch nicht auf dem Server gespeichert werden können.
  
 
====Verlauf====
 
====Verlauf====
Zeile 127: Zeile 203:
 
**"Wie werden diese Daten erhoben ?"
 
**"Wie werden diese Daten erhoben ?"
 
***Der Kurs sollte auf Wetterstationen o.Ä. kommen, die Temperatur ect. messen.
 
***Der Kurs sollte auf Wetterstationen o.Ä. kommen, die Temperatur ect. messen.
**"So etwas wollen wir auch erstellen und die gesammelten Daten dann analysieren.
+
**"So etwas wollen wir auch erstellen und die gesammelten Daten dann analysieren."
**Hierzu gucken wir uns die Sensebox an."
+
**"Hierzu gucken wir uns die Sensebox an."
 
*Unterrichtsprojekt wird anhand des Projektplakates vorgestellt
 
*Unterrichtsprojekt wird anhand des Projektplakates vorgestellt
 
|Unterrichtsgespräch
 
|Unterrichtsgespräch
Zeile 138: Zeile 214:
  
 
*die Lernkarten SB01-SB07, SB12, GI01, GI02, GI03
 
*die Lernkarten SB01-SB07, SB12, GI01, GI02, GI03
*Die Projektübersicht der Feinstaubmessstation (dabei bei der Programmierung nur Schritt 1 und 2)
+
*die Projektübersicht der Feinstaubmessstation (dabei bei der Programmierung nur Schritt 1 und 2)
  
 
durch und programmieren die Sensebox so, dass die vom Temperatursensor  
 
durch und programmieren die Sensebox so, dass die vom Temperatursensor  
Zeile 165: Zeile 241:
 
(20 min)
 
(20 min)
 
|Die SuS teilen sich in zwei Gruppen auf.
 
|Die SuS teilen sich in zwei Gruppen auf.
Innerhalb des Notebooks "Teil 1: Fragestellung" hält jede Gruppe ihre Fragen fest, der sie mithilfe  
+
Innerhalb des Notebooks "Phase 0 Fragestellung erarbeiten" hält jede Gruppe ihre Fragen fest, der sie mithilfe  
  
 
der Datenerhebung nachgehen wollen.
 
der Datenerhebung nachgehen wollen.
 
|Gruppenarbeit
 
|Gruppenarbeit
|Jupyter Notebook "Teil 1: Fragestellung"
+
|Jupyter Notebook "Phase 0 Fragestellung erarbeiten"
 
|-
 
|-
 
|Sicherung
 
|Sicherung
Zeile 175: Zeile 251:
 
|Beide Gruppen stellen ihre Fragestellungen im Plenum vor.
 
|Beide Gruppen stellen ihre Fragestellungen im Plenum vor.
 
|Plenum
 
|Plenum
|Jupyter Notebook "Teil 1: Fragestellung"
+
|Jupyter Notebook "Phase 0 Fragestellung erarbeiten"
 
|}
 
|}
 
<u>Anmerkung zum Programmieren der Sensebox:</u>
 
<u>Anmerkung zum Programmieren der Sensebox:</u>
  
Es kann zunächst sinnvoll sein, in diesem Unterrichtsabschnitt noch die Blockly-Programmierumgebung zu nutzen. Falls man bereits auf den Arduino-Quellcode mit den SuS hinarbeiten möchte, sollte man beachten, dass der zum "Block-Code" gehörende Arduino Quellcode auf der Blockly-Programmierwebsite stets rechts im Fenster angezeigt wird. Dies kann insbesondere auch dann hilfreich sein, wenn die Kompilierung über die Website nicht funktioniert. In diesem Fall kann man den im Fenster angezeigten Code auch in die Arduino-Software übertragen und von dort aus kompilieren.
+
Es kann zunächst sinnvoll sein, in diesem Unterrichtsabschnitt die Blockly-Programmierumgebung zu nutzen. Falls man bereits auf den Arduino-Quellcode mit den SuS hinarbeiten möchte, sollte man beachten, dass der zum "Block-Code" gehörende Arduino Quellcode auf der Blockly-Programmierwebsite stets rechts im Fenster angezeigt wird. Dies kann insbesondere auch dann hilfreich sein, wenn die Kompilierung über die Website nicht funktioniert. In diesem Fall kann man den im Fenster angezeigten Code auch in die Arduino-Software übertragen und von dort aus kompilieren.
  
 
=====Variante B (Ohne Programmierung der Sensebox)=====
 
=====Variante B (Ohne Programmierung der Sensebox)=====
Zeile 204: Zeile 280:
 
(20 min)
 
(20 min)
 
|Die SuS teilen sich in zwei Gruppen auf.
 
|Die SuS teilen sich in zwei Gruppen auf.
Innerhalb des Notebooks "Teil 1: Fragestellung" hält jede Gruppe ihre Fragen fest, der sie mithilfe  
+
Innerhalb des Notebooks "Phase 0 Fragestellung erarbeiten" hält jede Gruppe ihre Fragen fest, der sie mithilfe  
  
 
der Datenerhebung nachgehen wollen.
 
der Datenerhebung nachgehen wollen.
 
|Gruppenarbeit
 
|Gruppenarbeit
|Jupyter Notebook "Teil 1: Fragestellung"
+
|Jupyter Notebook "Phase 0 Fragestellung erarbeiten"
 
|-
 
|-
 
|Sicherung/
 
|Sicherung/
Zeile 219: Zeile 295:
 
und in welchem Zeitraum - ein Wechsel des Standorts ist auch möglich und meistens sinnvoll.
 
und in welchem Zeitraum - ein Wechsel des Standorts ist auch möglich und meistens sinnvoll.
 
|Plenum
 
|Plenum
|Jupyter Notebook "Teil 1: Fragestellung"
+
|Jupyter Notebook "Phase 0 Fragestellung erarbeiten"
 
Kartenprogramm
 
Kartenprogramm
 
|}
 
|}
  
 
====Benötigte Materialien====
 
====Benötigte Materialien====
 +
 +
*Laptops/PCs
  
 
*[https://unterrichtsmaterial-ddi.cs.upb.de/images/9/9e/Projektplakat.pdf Projektplakat]
 
*[https://unterrichtsmaterial-ddi.cs.upb.de/images/9/9e/Projektplakat.pdf Projektplakat]
Zeile 231: Zeile 309:
 
*[https://blockly.sensebox.de/ardublockly/?lang=de&board=sensebox-mcu Blockly-Programmierwebsite]
 
*[https://blockly.sensebox.de/ardublockly/?lang=de&board=sensebox-mcu Blockly-Programmierwebsite]
 
*[https://www.arduino.cc/en/Main/Software Download der Arduino-Software]
 
*[https://www.arduino.cc/en/Main/Software Download der Arduino-Software]
*Jupyter Notebook "Teil 1: Fragestellung"
+
*[https://unterrichtsmaterial-ddi.cs.upb.de/jhub/hub/user-redirect/git-pull?repo=https%3A%2F%2Fgit.cs.upb.de%2Fwiki%2Fjupyternotebooks&urlpath=tree%2Fjupyternotebooks%2F&branch=sensebox Jupyter Notebook "Phase 0: Fragestellung erarbeiten"]
 
*Kartenprogramm
 
*Kartenprogramm
  
Zeile 252: Zeile 330:
  
 
Beim Sammeln der Daten soll für jede Messgröße eine eigene csv-Datei auf der angeschlossenen SD-Karte angelegt werden. Wichtig ist hier, dass das Format der Daten in der .csv-Datei korrekt ist. Das Format hat dabei folgende Form:<syntaxhighlight lang="python3">
 
Beim Sammeln der Daten soll für jede Messgröße eine eigene csv-Datei auf der angeschlossenen SD-Karte angelegt werden. Wichtig ist hier, dass das Format der Daten in der .csv-Datei korrekt ist. Das Format hat dabei folgende Form:<syntaxhighlight lang="python3">
sensorID,value,timestamp,longitude,latitude,hight
+
value,createdAt,longitude,latitude,hight
5d5d1209953683001a3f93f9,61.23,2019-09-04T21:30:30.000Z,12.00,42.00,0.00
+
61.23,2019-09-04T21:30:30.000Z,12.00,42.00,0.00
 
...
 
...
</syntaxhighlight>Die erste Zeile entspricht immer einer "Tabellenkopfzeile", was im wesentlichen der Übersichtlichkeit dienen soll. Jeder Messeintrag beginnt dann mit der SensorID, die nur bei Registrierung der Sensebox auf der OpenSenseMap vergeben wird (Das ist optional. Falls dies interessant ist, geht es [https://www.youtube.com/watch?v=LtGrribDAho hier] ein Tutorial zur Einrichtung). Ist die SensorID unbekannt, kann man hier einfach 000 eintragen. Nach der SensorID folgt der gemessene Wert (beim Temperatur-/Luftfeuchtigkeitssensor z.B. die aktuelle Temperatur in °C). Anschließend wird der Zeitpunkt, zu dem der Wert gemessen wurde, angegeben - und zwar wie im Beispiel 04.09.2019, 21:30:30.000 → 2019-09-04T21:30:30.000Z. Zuletzt folgen noch Longitude, Latitude und Hight des Standorts, an dem die Box aufgestellt wird. Diese drei letzten Angaben sollten die SuS fest in den Programmcode schreiben, indem sie sie zuvor recherchieren. Wichtig: Falls die Box während der Datensammlung umgestellt werden sollte, muss zunächst ein anderer Code mit den aktualisierten Positionsangaben auf die Sensebox geladen werden.
+
</syntaxhighlight>Die erste Zeile entspricht immer einer "Tabellenkopfzeile", was im wesentlichen der Übersichtlichkeit dienen soll. Jeder Messeintrag beginnt mit dem gemessenen Wert (beim Temperatur-/Luftfeuchtigkeitssensor z.B. die aktuelle Temperatur in °C). Anschließend wird der Zeitpunkt, zu dem der Wert gemessen wurde, angegeben - und zwar wie im Beispiel 04.09.2019, 21:30:30.000 → 2019-09-04T21:30:30.000Z. Zuletzt folgen noch Longitude, Latitude und Hight des Standorts, an dem die Box aufgestellt wird. Diese drei letzten Angaben sollten die SuS fest in den Programmcode schreiben, wobei sie sie zuvor recherchieren. Wichtig: Falls die Box während der Datensammlung umgestellt werden sollte, muss zunächst ein anderer Code mit den aktualisierten Positionsangaben auf die Sensebox geladen werden.
 +
 
 +
Anmerkung: Man kann jeden Messeintrag zusätzlich mit der SensorID beginnen lassen, die nur bei Registrierung der Sensebox auf der OpenSenseMap ([https://opensensemap.org Link]) vergeben wird (Das ist optional. Falls dies interessant ist, gibt es [https://www.youtube.com/watch?v=LtGrribDAho hier] ein Tutorial zur Einrichtung). Ist die SensorID unbekannt, kann man diesen Eintrag auch weglassen.
 +
 
 +
In '''Variante B''' sollten abhängig von der Boxnummer (befindet sich als Sticker auf der Sensebox) die nachfolgenden Codes auf die Sensebox geladen sein, bevor die SuS die Senseboxen aufstellen. Die Senseboxen messen dann die Temperatur, die Luftfeuchtigkeit und den aktuellen PM2.5-Feinstaubwert.
 +
 
 +
'''<u>Hinweise zum Aufstellen der Sensebox</u>'''
 +
 
 +
Damit die Sensebox die Daten sammeln kann, müssen
 +
 
 +
#der SD-Kartenanschluss samt SD-Karte,
 +
#die Clock,
 +
#der Temperatur-/Luftfeuchtigkeitssensor,
 +
#der Feinstaubsensor
 +
 
 +
richtig an die Sensebox angeschlossen werden. Hierzu muss man
 +
 
 +
#den SD-Kartenanschluss samt der SD-Karte mit dem XBee Steckplatz 2,
 +
#die Clock mithilfe des Clock-Kabels (schwarz, rot, weiß, gelb) mit einem I2C/Wire Steckplatz (hierbei ist darauf zu achten, dass man die richtige Seite des Kabels in die Clock/in den Steckplatz steckt - die Seite mit den zwei abstehenden Plastik-Schienen gehört in die Clock),
 +
#den Temperatur-/Luftfeuchtigkeitssensor mithilfe eines JST-Kabels (schwarz, rot, grün, gelb) mit einem I2C/Wire Steckplatz,
 +
#den Feinstaubsensor mithilfe des entsprechenden Kabels (schwarz, rot, blau, weiß) mit einem UART/Serial Anschluss
 +
 
 +
verbinden. Auf den nachfolgenden Bildern ist diese Verbindung der Sensoren, der Clock und der SD-Karte genauer zu sehen:
 +
 
 +
<gallery mode="packed" heights="480" caption="Verkabelung und Aufbau der Sensebox bei Variante B">
 +
Datei:Steckung.png
 +
Datei:Aufbau 1.png
 +
</gallery>Damit die Sensebox "wetterfest" ist, wird sie mit der Clock und dem Temperatur-/Luftfeuchtigkeitssensor und ggf. zusammen mit einem Akku, falls dieser den Strom liefern soll, in die dafür vorgesehene Box gelegt. Falls Kabel aus dieser Box hinausgehen, sollten diese möglichst mit Folie, Schläuchen o.Ä. geschützt werden, um sicherzustellen, dass diese nicht nass werden. Zugleich sollten aber auch ein paar der Löcher in der Box offen bleiben, um Luft hineinzulassen, sodass korrekte Daten gesammelt werden. Weiterhin sollte der Feinstaubsensor in die dafür vorgesehene Box gelegt werden und das Kabel, welches diesen Sensor mit der Sensebox verbindet, sollte ebenfalls durch Folie oder einen Schlauch geschützt werden. Anschließend werden die beiden Boxen mit ihren Deckeln verschlossen. Auf den unten stehenden Bildern kann man diese "Verpackung" genauer erkennen und nachvollziehen.<gallery mode="packed" heights="480" caption="&amp;amp;quot;Verpackung&amp;amp;quot; der Sensebox">
 +
Datei:AufbauSensebox-Teil1.png
 +
Datei:AufbauSensebox-Teil2.png
 +
</gallery>
 +
 
 +
'''Box 1:'''<syntaxhighlight lang="arduino" line="1">
 +
#include <SPI.h>
 +
#include <SD.h>
 +
#include "SenseBoxMCU.h"
 +
#include <Wire.h>
 +
#include <Adafruit_GFX.h>
 +
#include <Adafruit_SSD1306.h>
 +
#include "DS1307.h"
 +
 
 +
#define OLED_RESET 4
 +
Adafruit_SSD1306 display(OLED_RESET);
 +
DS1307 clock;
 +
float temp, hum, pM;
 +
String ausgTemp, ausgHum, ausgPartMat;
 +
File dataFileDat_temp, dataFileDat_hum, dataFileDat_pM;
 +
float latitude, longitude, hight;
 +
String sensorID_temp, sensorID_hum, sensorID_pM, timestamp;
 +
String y, mo, d, h, mi, s;
 +
 
 +
SDS011 my_sds(Serial1);
 +
HDC1080 hdc;
 +
 
 +
 
 +
void setup() {
 +
    senseBoxIO.powerI2C(true);
 +
delay(2000);
 +
//display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
 +
//display.display();
 +
//delay(100);
 +
//display.clearDisplay();
 +
  String ausg = String("sensorID") + "," + "value" + "," + "createdAt" + "," + "longitude" + "," + "latitude" + "," + "hight";
 +
  SD.begin(28);
 +
  Serial1.begin(9600);
 +
  dataFileDat_temp = SD.open("Dat_temp.csv", FILE_WRITE);
 +
  dataFileDat_temp.println(ausg);
 +
  dataFileDat_temp.close();
 +
 
 +
  dataFileDat_hum = SD.open("Dat_hum.csv", FILE_WRITE);
 +
  dataFileDat_hum.println(ausg);
 +
  dataFileDat_hum.close();
 +
 
 +
  dataFileDat_pM = SD.open("Dat_pM.csv", FILE_WRITE);
 +
  dataFileDat_pM.println(ausg);
 +
  dataFileDat_pM.close();
 +
 
 +
 
 +
  sensorID_temp = "5d5d00e9953683001a3ac4cf";
 +
  sensorID_hum = "5d5d09cc953683001a3d4432";
 +
  sensorID_pM = "5d5d00e9953683001a3ac4ce";
 +
  latitude = 42;//latitude des Aufstellortes angeben
 +
  longitude = 12;//longitude des Aufstellortes angeben
 +
  hight = 0;//hight des Aufstellortes angeben
 +
 
 +
  hdc.begin();
 +
}
 +
 
 +
void loop() {
 +
  delay(30000);//delay wie gewünscht setzen -> Messintervall
 +
  clock.getTime();
 +
  y = String(clock.year + 2000);
 +
  if (clock.month < 10){
 +
    mo = "0" + String(clock.month);
 +
  }
 +
  else{
 +
    mo = String(clock.month);
 +
  }
 +
  if (clock.dayOfMonth < 10){
 +
    d = "0" + String(clock.dayOfMonth);
 +
  }
 +
  else{
 +
    d = String(clock.dayOfMonth);
 +
  }
 +
  if (clock.hour < 10){
 +
    h = "0" + String(clock.hour);
 +
  }
 +
  else{
 +
    h = String(clock.hour);
 +
  }
 +
  if (clock.minute < 10){
 +
    mi = "0" + String(clock.minute);
 +
  }
 +
  else{
 +
    mi = String(clock.minute);
 +
  }
 +
  if (clock.second < 10){
 +
    s = "0" + String(clock.second);
 +
  }
 +
  else{
 +
    s = String(clock.second);
 +
  }
 +
  //2019-08-22T09:34:55.525Z
 +
  timestamp = y + "-" + mo + "-" + d + "T"+ h + ":" + mi + ":" + s + "." + "000" + "Z";
 +
  pM = my_sds.getPm25();
 +
  temp = hdc.getTemperature();
 +
  hum = hdc.getHumidity();
 +
  ausgTemp = String(sensorID_temp) + "," + String(temp);
 +
  ausgTemp += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
 +
  dataFileDat_temp = SD.open("Dat_temp.csv", FILE_WRITE);
 +
  dataFileDat_temp.println(ausgTemp);
 +
  dataFileDat_temp.close();
 +
 
 +
  ausgHum = String(sensorID_hum) + "," + String(hum);
 +
  ausgHum += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
 +
  dataFileDat_hum = SD.open("Dat_hum.csv", FILE_WRITE);
 +
  dataFileDat_hum.println(ausgHum);
 +
  dataFileDat_hum.close();
 +
 
 +
  ausgPartMat = String(sensorID_pM) + "," + String(pM);
 +
  ausgPartMat += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
 +
  dataFileDat_pM = SD.open("Dat_pM.csv", FILE_WRITE);
 +
  dataFileDat_pM.println(ausgPartMat);
 +
  dataFileDat_pM.close();
 +
 
 +
    //display.setCursor(0,0);
 +
    //display.setTextSize(1);
 +
    //display.setTextColor(WHITE,BLACK);
 +
    //display.println(timestamp + "\n" + "Temp.:" + String(temp) + "°C" + "\n" + "Luftf.:" + String(hum) + "%" + "\n" + "Fstaub.:" + String(pM)); ;
 +
  //display.display();
 +
 
 +
}
 +
</syntaxhighlight>
 +
 
 +
'''Box 2:'''<syntaxhighlight lang="arduino" line="1">
 +
#include <SPI.h>
 +
#include <SD.h>
 +
#include "SenseBoxMCU.h"
 +
#include <Wire.h>
 +
#include <Adafruit_GFX.h>
 +
#include <Adafruit_SSD1306.h>
 +
#include "DS1307.h"
 +
 
 +
#define OLED_RESET 4
 +
Adafruit_SSD1306 display(OLED_RESET);
 +
DS1307 clock;
 +
float temp, hum, pM;
 +
String ausgTemp, ausgHum, ausgPartMat;
 +
File dataFileDat_temp, dataFileDat_hum, dataFileDat_pM;
 +
float latitude, longitude, hight;
 +
String sensorID_temp, sensorID_hum, sensorID_pM, timestamp;
 +
String y, mo, d, h, mi, s;
 +
 
 +
SDS011 my_sds(Serial1);
 +
HDC1080 hdc;
 +
 
 +
 
 +
void setup() {
 +
    senseBoxIO.powerI2C(true);
 +
delay(2000);
 +
//display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
 +
//display.display();
 +
//delay(100);
 +
//display.clearDisplay();
 +
  String ausg = String("sensorID") + "," + "value" + "," + "createdAt" + "," + "longitude" + "," + "latitude" + "," + "hight";
 +
  SD.begin(28);
 +
  Serial1.begin(9600);
 +
  dataFileDat_temp = SD.open("Dat_temp.csv", FILE_WRITE);
 +
  dataFileDat_temp.println(ausg);
 +
  dataFileDat_temp.close();
 +
 
 +
  dataFileDat_hum = SD.open("Dat_hum.csv", FILE_WRITE);
 +
  dataFileDat_hum.println(ausg);
 +
  dataFileDat_hum.close();
 +
 
 +
  dataFileDat_pM = SD.open("Dat_pM.csv", FILE_WRITE);
 +
  dataFileDat_pM.println(ausg);
 +
  dataFileDat_pM.close();
 +
 
 +
 
 +
  sensorID_temp = "5d5d1209953683001a3f93fb";
 +
  sensorID_hum = "5d5d1209953683001a3f93f9";
 +
  sensorID_pM = "5d5d1209953683001a3f93fa";
 +
  latitude = 42;//latitude des Aufstellortes angeben
 +
  longitude = 12;//longitude des Aufstellortes angeben
 +
  hight = 0;//hight des Aufstellortes angeben
 +
 
 +
  hdc.begin();
 +
}
 +
 
 +
void loop() {
 +
  delay(30000);//delay wie gewünscht setzen -> Messintervall
 +
  clock.getTime();
 +
  y = String(clock.year + 2000);
 +
  if (clock.month < 10){
 +
    mo = "0" + String(clock.month);
 +
  }
 +
  else{
 +
    mo = String(clock.month);
 +
  }
 +
  if (clock.dayOfMonth < 10){
 +
    d = "0" + String(clock.dayOfMonth);
 +
  }
 +
  else{
 +
    d = String(clock.dayOfMonth);
 +
  }
 +
  if (clock.hour < 10){
 +
    h = "0" + String(clock.hour);
 +
  }
 +
  else{
 +
    h = String(clock.hour);
 +
  }
 +
  if (clock.minute < 10){
 +
    mi = "0" + String(clock.minute);
 +
  }
 +
  else{
 +
    mi = String(clock.minute);
 +
  }
 +
  if (clock.second < 10){
 +
    s = "0" + String(clock.second);
 +
  }
 +
  else{
 +
    s = String(clock.second);
 +
  }
 +
  //2019-08-22T09:34:55.525Z
 +
  timestamp = y + "-" + mo + "-" + d + "T"+ h + ":" + mi + ":" + s + "." + "000" + "Z";
 +
  pM = my_sds.getPm25();
 +
  temp = hdc.getTemperature();
 +
  hum = hdc.getHumidity();
 +
  ausgTemp = String(sensorID_temp) + "," + String(temp);
 +
  ausgTemp += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
 +
  dataFileDat_temp = SD.open("Dat_temp.csv", FILE_WRITE);
 +
  dataFileDat_temp.println(ausgTemp);
 +
  dataFileDat_temp.close();
 +
 
 +
  ausgHum = String(sensorID_hum) + "," + String(hum);
 +
  ausgHum += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
 +
  dataFileDat_hum = SD.open("Dat_hum.csv", FILE_WRITE);
 +
  dataFileDat_hum.println(ausgHum);
 +
  dataFileDat_hum.close();
 +
 
 +
  ausgPartMat = String(sensorID_pM) + "," + String(pM);
 +
  ausgPartMat += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
 +
  dataFileDat_pM = SD.open("Dat_pM.csv", FILE_WRITE);
 +
  dataFileDat_pM.println(ausgPartMat);
 +
  dataFileDat_pM.close();
 +
 
 +
    //display.setCursor(0,0);
 +
    //display.setTextSize(1);
 +
    //display.setTextColor(WHITE,BLACK);
 +
    //display.println(timestamp + "\n" + "Temp.:" + String(temp) + "°C" + "\n" + "Luftf.:" + String(hum) + "%" + "\n" + "Fstaub.:" + String(pM) + "µg/m³");
 +
  //display.display();
 +
 
 +
}
 +
</syntaxhighlight>'''Box 3:'''<syntaxhighlight lang="arduino" line="1">
 +
#include <SPI.h>
 +
#include <SD.h>
 +
#include "SenseBoxMCU.h"
 +
#include <Wire.h>
 +
#include <Adafruit_GFX.h>
 +
#include <Adafruit_SSD1306.h>
 +
#include "DS1307.h"
 +
 
 +
#define OLED_RESET 4
 +
Adafruit_SSD1306 display(OLED_RESET);
 +
DS1307 clock;
 +
float temp, hum, pM;
 +
String ausgTemp, ausgHum, ausgPartMat;
 +
File dataFileDat_temp, dataFileDat_hum, dataFileDat_pM;
 +
float latitude, longitude, hight;
 +
String sensorID_temp, sensorID_hum, sensorID_pM, timestamp;
 +
String y, mo, d, h, mi, s;
 +
 
 +
SDS011 my_sds(Serial1);
 +
HDC1080 hdc;
 +
 
 +
 
 +
void setup() {
 +
    senseBoxIO.powerI2C(true);
 +
delay(2000);
 +
//display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
 +
//display.display();
 +
//delay(100);
 +
//display.clearDisplay();
 +
  String ausg = String("sensorID") + "," + "value" + "," + "createdAt" + "," + "longitude" + "," + "latitude" + "," + "hight";
 +
  SD.begin(28);
 +
  Serial1.begin(9600);
 +
  dataFileDat_temp = SD.open("Dat_temp.csv", FILE_WRITE);
 +
  dataFileDat_temp.println(ausg);
 +
  dataFileDat_temp.close();
 +
 
 +
  dataFileDat_hum = SD.open("Dat_hum.csv", FILE_WRITE);
 +
  dataFileDat_hum.println(ausg);
 +
  dataFileDat_hum.close();
 +
 
 +
  dataFileDat_pM = SD.open("Dat_pM.csv", FILE_WRITE);
 +
  dataFileDat_pM.println(ausg);
 +
  dataFileDat_pM.close();
 +
 
 +
 
 +
  sensorID_temp = "5d5d13fd953683001a401cd8";
 +
  sensorID_hum = "5d5d13fd953683001a401cd7";
 +
  sensorID_pM = "5d5d13fd953683001a401cd6";
 +
  latitude = 42;//latitude des Aufstellortes angeben
 +
  longitude = 12;//longitude des Aufstellortes angeben
 +
  hight = 0;//hight des Aufstellortes angeben
 +
 
 +
  hdc.begin();
 +
}
 +
 
 +
void loop() {
 +
  delay(30000);//delay wie gewünscht setzen -> Messintervall
 +
  clock.getTime();
 +
  y = String(clock.year + 2000);
 +
  if (clock.month < 10){
 +
    mo = "0" + String(clock.month);
 +
  }
 +
  else{
 +
    mo = String(clock.month);
 +
  }
 +
  if (clock.dayOfMonth < 10){
 +
    d = "0" + String(clock.dayOfMonth);
 +
  }
 +
  else{
 +
    d = String(clock.dayOfMonth);
 +
  }
 +
  if (clock.hour < 10){
 +
    h = "0" + String(clock.hour);
 +
  }
 +
  else{
 +
    h = String(clock.hour);
 +
  }
 +
  if (clock.minute < 10){
 +
    mi = "0" + String(clock.minute);
 +
  }
 +
  else{
 +
    mi = String(clock.minute);
 +
  }
 +
  if (clock.second < 10){
 +
    s = "0" + String(clock.second);
 +
  }
 +
  else{
 +
    s = String(clock.second);
 +
  }
 +
  //2019-08-22T09:34:55.525Z
 +
  timestamp = y + "-" + mo + "-" + d + "T"+ h + ":" + mi + ":" + s + "." + "000" + "Z";
 +
  pM = my_sds.getPm25();
 +
  temp = hdc.getTemperature();
 +
  hum = hdc.getHumidity();
 +
  ausgTemp = String(sensorID_temp) + "," + String(temp);
 +
  ausgTemp += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
 +
  dataFileDat_temp = SD.open("Dat_temp.csv", FILE_WRITE);
 +
  dataFileDat_temp.println(ausgTemp);
 +
  dataFileDat_temp.close();
 +
 
 +
  ausgHum = String(sensorID_hum) + "," + String(hum);
 +
  ausgHum += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
 +
  dataFileDat_hum = SD.open("Dat_hum.csv", FILE_WRITE);
 +
  dataFileDat_hum.println(ausgHum);
 +
  dataFileDat_hum.close();
 +
 
 +
  ausgPartMat = String(sensorID_pM) + "," + String(pM);
 +
  ausgPartMat += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
 +
  dataFileDat_pM = SD.open("Dat_pM.csv", FILE_WRITE);
 +
  dataFileDat_pM.println(ausgPartMat);
 +
  dataFileDat_pM.close();
 +
 
 +
    //display.setCursor(0,0);
 +
    //display.setTextSize(1);
 +
    //display.setTextColor(WHITE,BLACK);
 +
    //display.println(timestamp + "\n" + "Temp.:" + String(temp) + "°C" + "\n" + "Luftf.:" + String(hum) + "%" + "\n" + "Fstaub.:" + String(pM) + "µg/m³");
 +
  //display.display();
 +
 
 +
}
 +
</syntaxhighlight>
 +
 
 +
 
 +
Anmerkungen zu den Programmcodes:
 +
 
 +
In den vorliegenden Programmcodes misst die Sensebox in einem Intervall von etwa 30 Sekunden. Dies lässt sich über eine Abänderung der Konstante in delay(30000); direkt am Anfang der loop-Methode verändern. Die übergebene Konstante entspricht (in etwa) den Millisekunden zwischen den Messintervallen.
 +
 
 +
In den Zeilen 49-51 sind zudem noch die Werte für Latitude, Longitude und Hight zu aktualisieren.
 +
 
 +
Die auskommentierten Zeilen 26-29 sowie 113-117 lassen sich durch Entfernen der doppelten Schrägstriche wieder aktivieren und bewirken, dass bei verbundenem Display der aktuelle Timestamp, die aktuelle Temperatur, Luftfeuchtigkeit und der aktuelle PM2.5-Feinstaubwert auf diesem angezeigt werden.
 +
 
 +
Falls die Uhrzeit oder das Datum, die oder das von der Clock vorgegeben wird, nicht stimmt, lässt sich dies ändern, indem man den folgenden Code auf die Sensebox lädt. Dabei sind in Zeile 23-25 die Parameter für das Datum und die Uhrzeit so einzugeben, wie es im jeweils zugehörigen Kommentar steht.
 +
 
 +
'''Setup zum Einstellen des Datums und der Uhrzeit für die Clock:'''<syntaxhighlight lang="arduino" line="1">
 +
#include <SPI.h>
 +
#include <Wire.h>
 +
#include <Adafruit_GFX.h>
 +
#include <Adafruit_SSD1306.h>
 +
#include "SenseBoxMCU.h"
 +
#include <Wire.h>
 +
#include "DS1307.h"
 +
 
 +
#define OLED_RESET 4
 +
Adafruit_SSD1306 display(OLED_RESET);
 +
DS1307 clock;
 +
 
  
In '''Variante B''' sollten abhängig von der Boxnummer (befindet sich als Sticker auf der Sensebox) folgende Codes auf die Sensebox geladen seinn, bevor die SuS die Senseboxen aufstellen:
+
void setup() {
{| class="wikitable"
+
  senseBoxIO.powerI2C(true);
|+Programmcodes für die einzelnen Senseboxen
+
delay(2000);
|Box 1
+
display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
|Code folgt noch
+
display.display();
|-
+
delay(100);
|Box 2
+
display.clearDisplay();
|Code folgt noch
+
    Serial.begin(9600);
|-
+
    clock.begin();
|Box 3
+
    clock.fillByYMD(2020,3,26);//hier das richtige Datum im Format yyyy,(m)m,(d)d eintragen - dabei führende Nullen weglassen
|Code folgt noch
+
    clock.fillByHMS(16,31,10);//hier die richtige Uhrzeit im Format (h)h,(m)m,(s)s eintragen - dabei führende Nullen weglassen
|-
+
    clock.fillDayOfWeek(THU);//hier den richtigen Wochentag in der Form (MON, TUE, WED, THU, FRI, SAT, SUN) eintragen.
|Box 4
+
    clock.setTime();//write time to the RTC chip
|Code folgt noch
+
}
|}
+
 
Aber auch für '''Variante A''' könnten diese Codes hilfreich sein, falls die SuS an einer Stelle beim Programmieren nicht weiterkommen und in den fertigen Dateien schauen wollen, wie man ein bestimmtes Problem lösen könnte.
+
void loop() {
 +
    clock.getTime();
 +
    display.setCursor(0,0);
 +
    display.setTextSize(1);
 +
    display.setTextColor(WHITE,BLACK);
 +
    display.println(String(clock.second) + ":" + String(clock.month) + ":" + String(clock.dayOfMonth));
 +
  display.display();
 +
 
 +
}
 +
</syntaxhighlight>Auch für '''Variante A''' könnten diese Codes hilfreich sein, falls die SuS an einer Stelle beim Programmieren nicht weiterkommen und in den fertigen Dateien schauen wollen, wie man ein bestimmtes Problem lösen könnte.
 +
 
 +
Nachdem das jeweilige Programm auf die Sensebox geladen wurde, können die Senseboxen wie oben beschrieben aufgestellt werden.
  
 
====Verlauf====
 
====Verlauf====
  
===== Variante A (mit Programmierung der Sensebox) =====
+
=====Variante A (mit Programmierung der Sensebox)=====
 
{| class="wikitable"
 
{| class="wikitable"
 
!Abschnitt
 
!Abschnitt
Zeile 287: Zeile 795:
 
|
 
|
 
*Im Plenum wird beispielhaft eine .csv-Datei gezeigt, in der bereits Werte enthalten sind.
 
*Im Plenum wird beispielhaft eine .csv-Datei gezeigt, in der bereits Werte enthalten sind.
*Die SuS sollen basierend daraufhin in ihren Gruppen (erste) Ideen sammeln, wie sie die Sensebox programmieren müssen, um ihre Messwerte ebenso abzuspeichern.
+
*Die SuS sollen basierend darauf in ihren Gruppen (erste) Ideen sammeln, wie sie die Sensebox programmieren müssen, um ihre Messwerte ebenso abzuspeichern.
 
|Unterrichtsgespräch
 
|Unterrichtsgespräch
 
|Beispielhafte .csv-Datei
 
|Beispielhafte .csv-Datei
Zeile 302: Zeile 810:
 
Falls die SuS nicht fertig werden, kann auch der fertige Sensebox-Programmcode auf die Sensebox geladen werden. In diesem Fall wird die Sensebox
 
Falls die SuS nicht fertig werden, kann auch der fertige Sensebox-Programmcode auf die Sensebox geladen werden. In diesem Fall wird die Sensebox
  
* Feinstaub (PM2,5)
+
*Feinstaub (PM2,5)
* Luftfeuchtigkeit
+
*Luftfeuchtigkeit
* Temperatur
+
*Temperatur
  
 
messen.
 
messen.
 
|Gruppenarbeit
 
|Gruppenarbeit
|Fertiges Sensebox-Programm;
+
|Sensebox, Fertiges Sensebox-Programm;
 
Arduino-Software bzw.
 
Arduino-Software bzw.
  
Blockly
+
Blockly-Programmierwebsite, Sensebox
 
<br />
 
<br />
 
|-
 
|-
Zeile 338: Zeile 846:
 
|}
 
|}
  
===== Variante B (ohne Programmierung der Sensebox) =====
+
=====Variante B (ohne Programmierung der Sensebox)=====
 
{| class="wikitable"
 
{| class="wikitable"
 
!Abschnitt
 
!Abschnitt
Zeile 370: Zeile 878:
 
====Benötigte Materialien====
 
====Benötigte Materialien====
  
* Beispielhafte .csv-Datei (folgt noch)
+
*Laptops/PCs
* fertiges Sensebox-Programm (folgt noch)
+
 
* [https://www.arduino.cc/en/Main/Software Download der Arduino-Software]
+
*Beispielhafte .csv-Datei:
* [https://blockly.sensebox.de/ardublockly/?lang=de&board=sensebox-mcu Blockly-Programmierwebsite]
+
**gemessene Luftfeuchtigkeit am Münsteraner Ludgerikreisel (am 11.09.2019 zwischen 10:36 Uhr und 11:20)
* Senseboxen
+
<syntaxhighlight lang="text" line="1">
* mobile Akkus/Stromversorgung
+
sensorID_hum, hum, timestamp, longitude, latitude, hight
 +
5d5d1209953683001a3f93f9,43.31,2019-09-11T10:36:05.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,45.23,2019-09-11T10:37:05.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,44.55,2019-09-11T10:38:05.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,44.17,2019-09-11T10:39:05.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,46.17,2019-09-11T10:40:05.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,47.52,2019-09-11T10:41:05.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,47.86,2019-09-11T10:42:05.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,47.56,2019-09-11T10:43:05.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,48.26,2019-09-11T10:44:06.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,45.79,2019-09-11T10:45:06.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,47.92,2019-09-11T10:46:06.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,42.77,2019-09-11T10:47:06.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,42.85,2019-09-11T10:48:06.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,41.79,2019-09-11T10:49:06.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,40.68,2019-09-11T10:50:06.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,40.03,2019-09-11T10:51:06.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,39.79,2019-09-11T10:52:06.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,38.76,2019-09-11T10:53:06.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,38.44,2019-09-11T10:54:06.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,36.92,2019-09-11T10:55:06.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,38.39,2019-09-11T10:56:07.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,35.82,2019-09-11T10:57:07.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,36.29,2019-09-11T10:58:07.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,36.37,2019-09-11T10:59:07.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,36.29,2019-09-11T11:00:07.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,36.29,2019-09-11T11:01:07.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,34.61,2019-09-11T11:02:07.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,34.41,2019-09-11T11:03:07.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,34.99,2019-09-11T11:04:07.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,35.76,2019-09-11T11:05:07.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,36.97,2019-09-11T11:06:07.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,34.69,2019-09-11T11:07:08.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,36.24,2019-09-11T11:08:08.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,35.76,2019-09-11T11:09:08.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,35.09,2019-09-11T11:10:08.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,35.57,2019-09-11T11:11:08.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,35.27,2019-09-11T11:12:08.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,34.05,2019-09-11T11:13:08.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,32.87,2019-09-11T11:14:08.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,33.15,2019-09-11T11:15:08.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,33.03,2019-09-11T11:16:08.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,32.72,2019-09-11T11:17:08.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,34.59,2019-09-11T11:18:08.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,33.04,2019-09-11T11:19:09.000Z,7.63,51.96,60.00
 +
5d5d1209953683001a3f93f9,33.47,2019-09-11T11:20:09.000Z,7.63,51.96,60.00
 +
</syntaxhighlight>
 +
 
 +
*fertiges Sensebox-Programm (siehe oben)
 +
*Setup zum Einstellen des Datums und der Uhrzeit für die Clock (siehe oben)
 +
*[https://www.arduino.cc/en/Main/Software Download der Arduino-Software]
 +
*[https://blockly.sensebox.de/ardublockly/?lang=de&board=sensebox-mcu Blockly-Programmierwebsite]
 +
*Senseboxen
 +
*mobile Akkus/Stromversorgung
 +
*Kartenprogramm
  
 
===Phase 3: Einführungskurs in Python===
 
===Phase 3: Einführungskurs in Python===
Zeile 382: Zeile 944:
 
Diese Phase sollte durchgeführt werden, während die Daten mithilfe der aufgestellten Senseboxen gesammelt werden. So wird ein genügend großer Zeitraum für die Datensammlung gewährt.
 
Diese Phase sollte durchgeführt werden, während die Daten mithilfe der aufgestellten Senseboxen gesammelt werden. So wird ein genügend großer Zeitraum für die Datensammlung gewährt.
  
In dieser Phase sollen die SuS die Grundlagen von Python erlernen. Dazu durchlaufen die SuS den Python-Online-Kurs der University of Waterloo ([https://cscircles.cemc.uwaterloo.ca/de/ Link]). Hier werden grundlegende Aspekte der Programmiersprache schrittweise erarbeitet, indem für jedes "Programmierkonstrukt" zunächst ein erläuternder Text gegeben wird und die SuS dann das neu erworbene Wissen selbst anwenden müssen und eigenständig in "Code-Blöcken" bestimmte Programmieraufgaben lösen müssen.
+
In dieser Phase sollen die SuS die Grundlagen von Python erlernen. Dazu durchlaufen die SuS den Python-Online-Kurs der University of Waterloo ([https://cscircles.cemc.uwaterloo.ca/de/ Link]). Hier werden grundlegende Aspekte der Programmiersprache schrittweise erarbeitet, indem für jedes "Programmierkonstrukt" zunächst ein erläuternder Text gegeben wird und die SuS dann das neu erworbene Wissen selbst anwenden und eigenständig in "Code-Blöcken" bestimmte Programmieraufgaben lösen müssen.
  
Da im weiteren Verlauf der Unterrichtsreihe innerhalb von Juptyer Notebooks programmiert werden soll und zudem die Datentypen aus der pandas-Bibliothek genutzt werden, gibt es hierzu zwei Notebooks ([https://unterrichtsmaterial-ddi.cs.upb.de/jhub/hub/user-redirect/git-pull?repo=https%3A%2F%2Fgit.cs.upb.de%2Fwiki%2Fjupyternotebooks&urlpath=tree%2Fjupyternotebooks%2F&branch=datenauswertung Einführung Jupyter Notebooks] und [https://unterrichtsmaterial-ddi.cs.upb.de/jhub/hub/user-redirect/git-pull?repo=https%3A%2F%2Fgit.cs.upb.de%2Fwiki%2Fjupyternotebooks&urlpath=tree%2Fjupyternotebooks%2F&branch=datenauswertung Nützliche Datentypen in Python] NOCH NICHT AKTUELL), die einem ähnlichen Prinzip folgen, wie der Python-Online-Kurs der University of Waterloo: Auch hier gibt es zunächst erklärende Texte, bevor die SuS "Code-Blöcke" eigenständig erstellen bzw. ergänzen müssen, um gestellte Aufgaben zu lösen.
+
Da im weiteren Verlauf der Unterrichtsreihe innerhalb von Juptyer Notebooks programmiert werden soll und zudem die Datentypen aus der pandas-Bibliothek genutzt werden, gibt es hierzu zwei Notebooks ([https://unterrichtsmaterial-ddi.cs.upb.de/jhub/hub/user-redirect/git-pull?repo=https%3A%2F%2Fgit.cs.upb.de%2Fwiki%2Fjupyternotebooks&urlpath=tree%2Fjupyternotebooks%2F&branch=sensebox Einführung Jupyter Notebooks] und [https://unterrichtsmaterial-ddi.cs.upb.de/jhub/hub/user-redirect/git-pull?repo=https%3A%2F%2Fgit.cs.upb.de%2Fwiki%2Fjupyternotebooks&urlpath=tree%2Fjupyternotebooks%2F&branch=sensebox Nützliche Datentypen in Python]), die einem ähnlichen Prinzip folgen, wie der Python-Online-Kurs der University of Waterloo: Auch hier gibt es zunächst erklärende Texte, bevor die SuS "Code-Blöcke" eigenständig erstellen bzw. ergänzen müssen, um gestellte Aufgaben zu lösen.
  
 
Die SuS sollen sowohl den Python-Online-Kurs als auch die beiden Jupyter Notebooks selbstständig bearbeiten. Der Python-Online-Kurs sollte nach etwa 4 Unterrichtsstunden abgeschlossen werden, und die beiden Notebooks in - zusammengenommen - 2 Unterrichtsstunden. Es bietet sich an, zum Beginn und zum Ende jeder Unterrichtseinheit etwa 5-10 Minuten für allgemeine Fragen der SuS einzuplanen, die im Plenum diskutiert und beantwortet werden können.
 
Die SuS sollen sowohl den Python-Online-Kurs als auch die beiden Jupyter Notebooks selbstständig bearbeiten. Der Python-Online-Kurs sollte nach etwa 4 Unterrichtsstunden abgeschlossen werden, und die beiden Notebooks in - zusammengenommen - 2 Unterrichtsstunden. Es bietet sich an, zum Beginn und zum Ende jeder Unterrichtseinheit etwa 5-10 Minuten für allgemeine Fragen der SuS einzuplanen, die im Plenum diskutiert und beantwortet werden können.
  
 
====Verlauf====
 
====Verlauf====
Eine grobe Skizze des Unterrichtsverlaufs: Die SuS arbeiten dauerhaft in Einzel-/Partnerarbeit am Online-Kurs bzw. an den Jupyter-Notebooks. Am Anfang/Ende jeder Einheit sollten etwa 10 min für Fragen eingeplant werden, die im Plenum diskutiert und beantwortet werden sollen. Ebenfalls können die SuS in dieser Zeit ihre Senseboxen an einem anderen Ort neu aufbauen (z.B. wenn sie verschiedene Standorte - wie Hauptstraße vs. Schulgarten - miteinander vergleichen wollen). Dabei sollten sie jedoch zuvor den Inhalt der SD-Karte der Sensebox auf einem Laptop/PC sichern.  
+
Eine grobe Skizze des Unterrichtsverlaufs: Die SuS arbeiten dauerhaft in Einzel-/Partnerarbeit am Online-Kurs bzw. an den Jupyter-Notebooks. Am Anfang/Ende jeder Einheit sollten etwa 10 min für Fragen eingeplant werden, die im Plenum diskutiert und beantwortet werden sollen. Ebenfalls können die SuS in dieser Zeit ihre Senseboxen an einem anderen Ort neu aufbauen (z.B. wenn sie verschiedene Standorte - wie Hauptstraße vs. Schulgarten - miteinander vergleichen wollen). Dabei sollten sie folgenden Ablaufplan beachten:
 +
 
 +
#Stromzufuhr der Sensebox abstellen
 +
#SD-Karte aus der Sensebox entfernen
 +
#Inhalt der SD-Karte auf einem Laptop/PC sichern
 +
#Ggf. neuen Code auf die Sensebox spielen
 +
#SD-Karte wieder in die Sensebox stecken
 +
#Sensebox an neuem Ort aufstellen
 +
#Strom anschließen
  
 
Hausaufgabe sollte es stets sein, zu Hause 30 min am Online-Kurs/an den Jupyter-Notebooks zu arbeiten.
 
Hausaufgabe sollte es stets sein, zu Hause 30 min am Online-Kurs/an den Jupyter-Notebooks zu arbeiten.
Zeile 426: Zeile 996:
  
 
====Benötigte Materialien====
 
====Benötigte Materialien====
[https://cscircles.cemc.uwaterloo.ca/de/ Python-Online-Kurs der University of Waterloo]
 
  
[https://unterrichtsmaterial-ddi.cs.upb.de/jhub/hub/user-redirect/git-pull?repo=https%3A%2F%2Fgit.cs.upb.de%2Fwiki%2Fjupyternotebooks&urlpath=tree%2Fjupyternotebooks%2F&branch=datenauswertung Jupyter Notebook: Einführung in Jupyer Notebooks] (NOCH NICHT AKTUELL)
+
*Laptops/PCs
 +
 
 +
*[https://cscircles.cemc.uwaterloo.ca/de/ Python-Online-Kurs der University of Waterloo]
 +
 
 +
*[https://unterrichtsmaterial-ddi.cs.upb.de/jhub/hub/user-redirect/git-pull?repo=https%3A%2F%2Fgit.cs.upb.de%2Fwiki%2Fjupyternotebooks&urlpath=tree%2Fjupyternotebooks%2F&branch=sensebox Jupyter Notebook: Einführung in Jupyer Notebooks]
 +
*[https://unterrichtsmaterial-ddi.cs.upb.de/jhub/hub/user-redirect/git-pull?repo=https%3A%2F%2Fgit.cs.upb.de%2Fwiki%2Fjupyternotebooks&urlpath=tree%2Fjupyternotebooks%2F&branch=sensebox Jupyter Notebook: Nützliche Datentypen in Python]
 +
 
 +
===Phase 4: Datenauswertung mit Jupyter Notebooks===
 +
 
 +
====Beschreibung der Phase====
 +
In dieser Phase sollen die SuS die von der Sensebox gesammelten Daten über die SD-Karte auf die PCs/Laptops übertragen und dann mithilfe der Jupyter-Notebooks analysieren und darstellen. Dabei sollen sie die Jupyter-Notebooks auch adaptieren, um eine Datenanalyse im Sinne ihres "Forschungsinteresses" durchzuführen. Beispielsweise lässt sich mithilfe einer eigens erstellten .csv-Datei, die nur zwei Messwerte enthält (, die beide einem gewissen Grenzwert entsprechen), eine Gerade für Grenzwerte in eine Grafik an Messwerten einzeichnen.
 +
 
 +
Generell ist es in dieser Phase sinnvoll, dass die Gruppen die Aufgaben zur Präsentationserstellung unter den Gruppenmitgliedern aufteilen.
 +
 
 +
Die einzelnen Gruppen sollen Grafiken und erhaltene Ergebnisse benutzen, um eine Präsentation zu ihrer Forschungsfrage zu erstellen (z.B. PowerPoint-Präsentation/Poster/...). Dort sollen auch gesellschaftliche Implikationen festgehalten werden.
 +
 
 +
====Verlauf====
 +
{| class="wikitable"
 +
!Abschnitt
 +
!Inhalt
 +
!Methode
 +
!Material
 +
|-
 +
|Einstieg
 +
(10 min)
 +
|Die Kleingruppen berichten kurz, wo sie ihre Senseboxen aufgestellt haben und ob es dabei Probleme gab.
 +
|Plenum
 +
|ggf. Kartenprogramm
 +
|-
 +
|Erarbeitung
 +
(5 min)
 +
|Die Gruppen teilen die Aufgaben auf, die sie bei der Erstellung der Präsentation erledigen müssen. Beispielhafte Aufgaben sind:
 +
 
 +
*Auswerten einzelner Messgrößen in den Jupyter Notebooks
 +
*Erstellen der Präsentation (als PowerPoint oder Poster) und Zusammenführen der Analyseergebnisse
 +
*...
 +
|Gruppenarbeit
 +
|
 +
|-
 +
|Erarbeitung
 +
 
 +
(120 min)
 +
|Die SuS verwenden die Jupyter Notebooks "Phase 1 und 2 Daten einlesen" und "Phase 3 Datenvisualisierung", um die gesammelten Daten der Senseboxen einzulesen, zu bereinigen und zu analysieren. Dabei erstellen sie Screenshots bzw. notieren sich Analyseergebnisse. Sie sollen die Jupyter Notebooks auch adaptieren, müssen dabei jedoch darauf achten, dass sie nach jeder Unterrichtseinheit alle adaptierten JupyterNotebooks und bereinigten .csv-Dateien herunterladen, da die Notebooks aktuell noch nicht auf dem Server gespeichert werden können.  Zu Beginn jeder neuen Unterrichtseinheit müssen die SuS die .csv-Dateien und Jupyter Notebooks dann wieder hochladen, um mit ihnen weiterarbeiten zu können. Wie das funktioniert, ist weiter unten erläutert.
 +
 
 +
 
 +
Unter Verwendung der Analyseergebnisse und besonders der damit einhergehenden Visualisierungen erstellen die einzelnen Gruppen ein Poster/eine Präsentation, basierend auf der eingangs formulierten Forschungsfrage. Diese soll auf dem Poster/innerhalb der Präsentation beantwortet werden, worauf aufbauend gesellschaftliche Implikationen festgehalten werden sollen.
 +
|Gruppenarbeit -
 +
dabei unterteilt in
 +
 
 +
Einzel/Partnerarbeit
 +
|Jupyter Notebooks
 +
"Phase 1 und 2 Daten einlesen"
 +
 
 +
"Phase 3 Datenvisualisierung"
 +
|}
 +
'''<big>Zum Jupyter Notebook "Phase 1 und 2 Daten einlesen":</big>'''
 +
 
 +
Die SuS sollen bei diesem Notebook die .csv-Dateien, welche von der Sensebox erstellt wurden, einlesen lassen und so bereinigen, dass der erstellte Timestamp als eigener Datentyp erkannt wird. Zudem soll der Timestamp als Index für die Daten festgelegt werden, sodass die Daten über diesen eindeutig adressiert werden können. Ggf. gibt es ebenfalls Komplikationen, sodass die Daten nicht derartig eingelesen werden können. Ein "typisches" Problem könnte hierbei sein, dass bei einem Neustart der Sensebox - also immer wenn der Strom kurzzeitig unterbrochen ist - eine neue "Überschriftszeile" erstellt wird, die erst aus der ursprünglichen .csv-Datei gelöscht werden muss, bevor der Timestamp der Daten als Index festgelegt werden kann.
 +
 
 +
Die SuS sollen sich bei diesem Notebook an dem bereits eingegebenen Code und den erläuternden Texten orientieren und den Code adaptieren, um alle bei der Datenanalyse benötigten .csv-Dateien einzulesen und bereinigt abzuspeichern.
 +
 
 +
Anhand dieses Notebooks lernen die SuS also den Prozess des '''Dateneinlesens''' und '''Datenbereinigens''' als wichtige Teilschritte der Datenanalyse kennen. Sie erkennen dabei insbesondere, dass die gesammelten Daten oftmals noch nicht ohne diesen Bereinigungsschritt eingelesen werden können, sodass auch deutlich wird, dass es nicht "per se" fehlerfreie Daten gibt. Um die SuS dies erkennen zu lassen, ist das Zulassen von "Irrwegen" also sehr wichtig.
 +
 
 +
<big>'''Zum Jupyter Notebook "Phase 3 Datenvisualisierung":'''</big>
 +
 
 +
In diesem Notebook sollen die SuS die zuvor bereinigten und in einer neuen .csv-Datei abgespeicherten Daten nach spezifischem Interesse filtern und visualisieren. Dabei lernen sie auch verschiedene Visualisierungsmöglichkeiten kennen und sollen mit diesem neu erlangten Wissen den bereits eingegebenen Code adaptieren, um die Daten nach ihren (Forschungs-)Interessen möglichst aussagekräftig darzustellen. Dabei werden sie auch feststellen, dass es an manchen Stellen Messfehler gab, sodass die zugehörigen Daten angepasst oder gelöscht werden müssen. Ein "typisches" Problem ist beispielsweise, dass der Feinstaubsensor bei einer hohen Luftfeuchtigkeit zu hohe Feinstaubwerte angibt. Diesen Zusammenhang gilt es beispielsweise für die SuS zu erkennen (z.B. auch durch eine Internetrecherche) und dementsprechend die betrachteten Daten anzupassen.
 +
 
 +
Die SuS lernen also die Aspekte der '''Datenfilterung''' und '''Datenvisualisierung''' als wichtige Schritte der Datenanalyse kennen. Auch hierbei werden sie die Erfahrung machen, dass die gesammelten Daten teilweise noch bereinigt werden müssen, indem ggf. einige Datenpunkte gelöscht oder angepasst werden. Es wird deutlich, dass auch in der Datenanalyse "Bereinigungsschritte" benötigt werden, um eine korrekte Auswertung zu erstellen. Um die SuS diese zuletzt genannte Erkenntnis gewinnen zu lassen, ist es also wieder wichtig, "Irrwege" zuzulassen.
 +
 
 +
 
 +
 
 +
'''<u><big>ACHTUNG:</big></u>''' Nach jeder Unterrichtsstunde/-einheit sollten die SuS alle adaptierten Jupyter Notebooks und bereinigten .csv-Dateien herunterladen, da die Notebooks aktuell noch nicht auf dem Server gespeichert werden können. Zu Beginn jeder neuen Unterrichtseinheit müssen die SuS die .csv-Dateien und Jupyter Notebooks dann wieder hochladen, um mit ihnen weiterarbeiten zu können. Wie das funktioniert, ist im Folgenden nachzulesen.
 +
 
 +
====Tipps zu Jupyter Notebooks:====
 +
<gallery mode="slideshow" caption="Zum Durchklicken: Download der bereinigten Daten und der adaptierten Jupyter Notebooks">
 +
Datei:Daten Download 1.png|1. Es ist möglich, bereinigte und (als .csv-Datei) abgespeicherte Daten sowie adaptierte Jupyter Notebooks herunterzuladen und lokal auf dem Rechner zu speichern, sodass man sie in der nächsten Unterrichtseinheit nicht erneut bereinigen muss. Hierzu wählt man im entsprechenden Ordner in Jupyter Notebooks zunächst die entsprechende .csv-Datei oder das entsprechende Notebook aus...
 +
Datei:Daten Download 2.png|2. ... und klickt dann im Falle einer '''.csv-Datei''' auf "Download".
 +
Datei:Daten Download 2 JNB.png|3. Bei einem '''Jupyter Notebook''' muss man ggf. zunächst noch auf Shutdown klicken, wenn dieses noch aktiv ist. (Das Bücher-Symbol wir dann grau statt grün)...
 +
Datei:Daten Download 3 JNB.png|4. ...Danach kann man nach erneutem Auswählen des Jupyter Notebooks auch bei diesem auf Download klicken.
 +
</gallery><gallery mode="slideshow" caption="'''<u&amp;amp;gt;<big&amp;amp;gt;Zum Durchklicken: Schritte zum Einlesen der gesammelten Daten in Jupyter-Notebook</big&amp;amp;gt;</u&amp;amp;gt;'''">
 +
Datei:Daten hochladen 1.png|1. Die gesammelten Daten sollen in dem Unterordner "Daten" gespeichert werden. Dazu klickt man zunächst auf diesen.
 +
Datei:Daten hochladen 2.png|2. Dann kann man durch einen Klick auf "Upload" neue Daten hinzufügen und im Ordner "Daten" abspeichern.
 +
Datei:Daten hochladen 3.png|3. Im Jupyter Notebook "Phase 1 und 2 Daten einlesen" (Unterpunkt "DataFrame aus CSV-Datei einlesen") kann dann das DataFrame aus der hochgeladenen Datei eingelesen werden. Der richtige Dateiname ist dazu im entsprechenden Befehl einzugeben.
 +
Datei:Daten hochladen 4.png|4. Im Jupyter Notebook "Phase 1 und 2 Daten einlesen" (Unterpunkt "Daten für die Auswertung speichern") können die zuvor bereinigten Daten in einer neuen CSV-Datei gespeichert werden. Hier soll dann der neue Dateiname eingegeben werden.
 +
Datei:Daten hochladen 5.png|5. Die neue CSV-Datei kann dann im Jupyter-Notebook "Phase 3 Datenvisualisierung" (direkt zu Beginn) eingelesen werden. Auch hier ist der richtige Dateiname im entsprechenden Befehl einzugeben.
 +
</gallery><gallery mode="slideshow" caption="Upload eines bereits adaptierten Jupyter Notebooks">
 +
Datei:JN hochladen.png|Um ein bereits adaptiertes Jupyter Notebook aus einer vorherigen Unterrichtseinheit hochzuladen, klickt man auf "Upload" und wählt dann das entsprechende Jupyter Notebook aus. Anschließend kann man es weiter bearbeiten.
 +
</gallery>
 +
 
 +
====Benötigte Materialien====
 +
 
 +
*ggf. Kartenprogramm
 +
*ggf. Poster
 +
*Laptops/PCs
 +
*ggf. PowerPoint/LibreOffice,...
 +
*[https://unterrichtsmaterial-ddi.cs.upb.de/jhub/hub/user-redirect/git-pull?repo=https%3A%2F%2Fgit.cs.upb.de%2Fwiki%2Fjupyternotebooks&urlpath=tree%2Fjupyternotebooks%2F&branch=sensebox Jupyter Notebooks "Phase 1 und 2 Daten einlesen", "Phase 3 Datenvisualisierung"]
 +
 
 +
<br />
 +
 
 +
===Phase 5: Abschluss des Projektes===
 +
 
 +
====Beschreibung der Phase====
 +
In dieser Phase stellen die Gruppen ihre in Phase 4 vorbereiteten Präsentationen vor. Dabei sollten nach jeder Präsentation die Ergebnisse und gesellschaftlichen Implikationen diskutiert werden. Am Ende erfolgt eine Evaluation der Unterrichtsreihe.
 +
 
 +
====Verlauf====
 +
{| class="wikitable"
 +
!Abschnitt
 +
!Inhalt
 +
!Methode
 +
!Material
 +
|-
 +
|Sicherung
 +
(30 min)
 +
|Die Kleingruppen präsentieren ihre Ergebnisse und herausgearbeiteten gesellschaftlichen Implikationen.
 +
Nach jeder Präsentation: Zeit für Diskussion der Ergebnisse/gesellschaftlichen Implikationen
 +
|Plenum
 +
|PowerPoint/Poster,...
 +
ggf. Jupyter Notebooks
 +
 
 +
zum Zeigen der Ergebnisse
 +
|-
 +
|Evaluation
 +
(15 min)
 +
|Die Unterrichtsreihe wird evaluiert. Dabei können entweder Fragebögen ausgefüllt werden oder im Plenum
 +
 
 +
Vor- und Nachteile der Reihe diskutiert werden. Eventuell sollten separate Termine für Interviews vereinbart werden.
 +
 
 +
 
 +
In dieser Phase sollen die SuS auch reflektieren, inwiefern sie die Programmierung in Form der Datensammlung bzw. der Datenauswertung dabei unterstützt hat, Erkenntnisse und darauf aufbauende gesellschaftliche Implikationen in Bezug auf ihre Umwelt zu gewinnen.
 +
|Plenum oder
 +
Einzelarbeit
 +
|
 +
|}
 +
 
 +
====Benötigte Materialien====
 +
 
 +
*Laptops/PCs
 +
*Poster/PowerPoint/LibreOffice/...
 +
*[https://unterrichtsmaterial-ddi.cs.upb.de/jhub/hub/user-redirect/git-pull?repo=https%3A%2F%2Fgit.cs.upb.de%2Fwiki%2Fjupyternotebooks&urlpath=tree%2Fjupyternotebooks%2F&branch=sensebox Jupyter Notebooks zum Zeigen der Ergebnisse]
  
[https://unterrichtsmaterial-ddi.cs.upb.de/jhub/hub/user-redirect/git-pull?repo=https%3A%2F%2Fgit.cs.upb.de%2Fwiki%2Fjupyternotebooks&urlpath=tree%2Fjupyternotebooks%2F&branch=datenauswertung Jupyter Notebook: Nützliche Datentypen in Python] (NOCH NICHT AKTUELL)
+
<br />
 +
[[Kategorie:Sekundarstufe I]]

Aktuelle Version vom 19. Juli 2021, 10:13 Uhr


Titel Analyse von Umweltdaten: Datenanalyse mit der Sensebox, Jupyter Notebooks und Python
Modul Datenprojekte und Datenexploration:

Umweltdaten mit Sensoren sammeln und analysieren

Stichworte Erkenntnisse aus Daten gewinnen, Erheben von Umweltdaten,

Auswerten von Umweltdaten, Epistemisches Programmieren, Data Science

Zielgruppe Klasse 8-10
Inhaltsfelder Information und Daten

Informatik, Mensch und Gesellschaft

Informatiksysteme

Das übergeordnete Thema dieser Unterrichtsreihe lautet "Data Science mit Python". In dieser konkreten Unterrichtsreihe beziehen sich die Daten auf umweltbezogene Aspekte wie Temperatur, Luftfeuchtigkeit oder Feinstaubbelastung, sodass die SuS eine Umweltanalyse auf Grundlage einer eigenen Fragestellung durchführen sollen.

Es gibt jedoch auch andere Daten, die untersucht werden können. Ein Beispiel hierfür sind Parkplatzdaten, welche in der Unterrichtsreihe "Datenauswertung mit Python (Parkplatzdaten)" analysiert werden sollen. Man erkennt also, dass Data Science mit Python anhand verschiedenster Daten durchgeführt werden kann.

In dieser Unterrichtsreihe sollen umweltbezogene Daten im Vordergrund stehen. Dabei sammeln die SuS mithilfe einer (ggf. selbst programmierten) Sensebox umweltspezifische Daten wie Temperatur, Luftfeuchtigkeit oder Feinstaub. Zum Ende der Unterrichtsreihe erstellen die Gruppen, in die die SuS aufgeteilt werden, eine eigene Präsentation, die sie vor den anderen SuS des Kurses oder auch im Rahmen eines Projekttages halten können.

Die groben Aufgaben/Meilensteine der Unterrichtsreihe gliedern sich dabei in folgende 6 Schritte:

  1. Problemstellung/Fragestellung erarbeiten
  2. Plan/Messinstrument zur Datenerhebung erstellen
  3. Daten erheben (mithilfe der Sensebox)
  4. Daten analysieren
  5. (gesellschaftliche) Implikationen aus der Datenanalyse herausarbeiten
  6. Ergebnisse präsentieren

Beschreibung der Unterrichtsreihe

Grobziele der Unterrichtsreihe

Die Schülerinnen und Schüler führen das Projekt durch und…

  • lernen ein erstes (exemplarisches) Data Science kennen, wobei die Schnittstellen Messinstrument, Daten und Daten im Kontext im Fokus stehen.
  • lernen erste Data-Moves kennen.
  • erlangen Grundkenntnisse im Umgang mit JupyterNotebook und Python.
  • lernen Auswertungsmöglichkeiten und Darstellungsweisen großer Datenmengen kennen.
  • können Erfahrungen in der datengetriebenen Analyse unserer Umwelt sammeln.
  • reflektieren, wie Datenanalysen den (datengetriebenen) Blick auf die Welt und das eigene Verhalten beeinflussen können.
  • lernen, gesammelte Daten und durchgeführte Datenanalysen im Kontext der Realwelt und deren Einflussfaktoren zu reflektieren.
  • erfahren, dass Datenanalysen interessengeleitet sind und nicht eine reale Abbildung der Welt darstellen.

Falls die Sensebox von den SuS selbst programmiert wird:

  • lernen Software und Hardware rund um Arduino als Beispiel für einen Platinencomputer kennen.
  • machen erste Erfahrungen in der Programmierung von Arduinos.

Wichtiger allgemeiner Hinweis:

Bei dieser Unterrichtsreihe kann ein wesentlicher Erkenntnisgewinn für die SuS darin bestehen, dass sie Fehler bei der Datenauswertung machen. Beispielsweise könnte man feststellen, dass der Feinstaubsensor nicht immer zuverlässig die Feinstaubbelastung misst, wenn die Luftfeuchtigkeit einen gewissen Wert überschritten hat. Die SuS können hierbei lernen, dass man "blanken" Daten nicht immer ohne Einschränkungen vertrauen kann, sondern diese immer auch im Kontext sehen sollte, in dem sie gesammelt wurden.

Folglich sollten "Irrwege" an dieser Stelle zugelassen werden und insbesondere keine vorbereitende "Datenbereinigung" durch die Lehrkraft erfolgen, da die SuS den gesamten Prozess einer Datenanalyse durchlaufen sollen.

Mess- und Auswertungsinstrument

Die Sammlung der Umweltdaten erfolgt mithilfe der Sensebox, die ein Arduino mit bereits zusammengestellten Sensoren für verschiedene Messwerte (wie Temperatur, Feinstaub,...) ist. Genauere Informationen dazu gibt es hier. Ein Handbuch zur Sensebox kann man sich hier ansehen. Die gesammelten Daten können bei einer WLan-Verbindung kontinuierlich oder auch nachträglich auf die OpenSenseMap hochgeladen werden (Link). Hier werden weltweit alle registrierten Senseboxen inklusive ihrer aktuellen Messwerte auf einer Karte angezeigt.

Die Analyse der gesammelten Daten erfolgt in einem vorgefertigten JupyterNotebook. Der Vorteil hierbei liegt darin, dass man in Jupyter Notebooks Textblöcke und Programmierblöcke, die auch eine Ausgabe unter sich selbst erzeugen können, aneinanderreihen kann. Weitere Informationen zu Jupyter Notebooks gibt es auf dieser Wiki-Seite.

Geplanter Verlauf der Unterrichtsreihe

Diese Unterrichtsreihe lässt sich in zwei verschiedenen Varianten durchführen. Abhängig davon sind auch Lernziele und Dauer der Unterrichtsreihe.

In Variante A steht neben der Auswertung der Daten (in Jupyter Notebooks) auch die Programmierung der Messinstrumente (Senseboxen) im Vordergrund. Hierzu wird ca. eine Unterrichtsstunde benötigt, in der sich die SuS mit der Sensebox vertraut machen sowie zwei weitere, in denen sie die Sensebox in Abhängigkeit von ihrer Fragestellung programmieren.

Verlauf Variante A (mit Programmierung der Sensebox)

Vorbereitende Schritte zur Programmierung der Sensebox (im Fall von Variante A)

Generell ist es wichtig zu wissen, dass man die Sensebox auf zwei verschiedene Arten programmieren kann:

  1. über eine "Block-Sprache" auf der Blockly-Programmierwebsite
  2. über die Arduino-Software (Download unter diesem Link)

Zu 1.: Der Vorteil bei dieser Variante ist, dass man die Sensebox lediglich anschließen und den von der Website exportierten Code per "Drag and Drop" auf die Sensebox laden muss. Ein Videotutorial gibt es hier (bis 8:43 min).

Falls man mit den SuS bereits auf den Arduino-Quellcode hinarbeiten möchte, sollte man beachten, dass der zum "Block-Code" gehörende Arduino Quellcode auf der Blockly-Programmierwebsite stets rechts im Fenster angezeigt wird. Dies kann insbesondere auch dann hilfreich sein, wenn die Kompilierung über die Website nicht funktioniert. In diesem Fall kann man den im Fenster angezeigten Code auch in die Arduino-Software kopieren und von dort aus kompilieren.

Zu 2.: Hierbei kann man die Sensebox durch einen Arduino-Code komplett frei programmieren. Der Vorteil hierbei ist, dass man den Code wesentlich individueller schreiben kann und so auf die eigenen Wünsche zuschneiden kann. Allerdings müssen bei dieser Variante zuvor einige Programme/Plugins installiert werden. Eine gute Anleitung hierzu bietet das senseBox:edu Buch in folgenden vier Abschnitten:

Ein Videotutorial, welches auch das Laden eines Programms auf die Sensebox beinhaltet, gibt es hier. Wichtig dabei: Im Video wird ein bereits fertiger Code von der OpenSenseMap in die Arduino-Software eingefügt. Das Hochladen für selbst geschriebenen Code funktioniert aber genauso.

Geplanter Verlauf der Unterrichtsreihe (Variante A)

Phase Inhalt Umfang
1 Einführung in das Projekt

Einführung in das Messinstrument "Sensebox"

Generieren einer Fragestellung für die geplante datengetriebene Analyse

2 Schulstunden
2 Erstellung und Testung des Messinstruments

Aufstellen der Messstation an ausgewählten Standorten

3 Schulstunden
3 Einführungskurs in Python 6 Schulstunden
4 Einsammeln der Senseboxen

Verteilen der gesammelten Daten

Datenauswertung mithilfe der Jupyter Notebooks

3 Schulstunden
5 Abschluss des Projektes:
  • Ergebnisvorstellung
  • Interpretation: Was bedeuten die Ergebnisse für uns ?
    • Diskussion von gesellschaftlichen Implikationen
1 Schulstunde

Verlauf Variante B (ohne Programmierung der Sensebox)

Alternativ können die SuS auch eine bereits fertig programmierte Sensebox nutzen, die die Werte für Feinstaub (PM2.5), Temperatur und Luftfeuchtigkeit in jeweils separaten .csv-Dateien auf einer SD-Karte speichert. Auf diese Weise fällt in dieser Variante B im Gegensatz zu Variante A in Phase 1 die Einführung in das Messinstrument "Sensebox" sowie in Phase 2 die Erstellung und Testung des Messinstruments weg, sodass sich der Umfang der Reihe um 3 Schulstunden reduziert. Folglich ergibt sich folgender Ablauf:

Geplanter Verlauf der Unterrichtsreihe (Variante B)

Phase Inhalt Umfang
1 Einführung in das Projekt

Generieren einer Fragestellung für die geplante datengetriebene Analyse

1 Schulstunde
2 Aufstellen der Messstation an ausgewählten Standorten 1 Schulstunde
3 Einführungskurs in Python 6 Schulstunden
4 Einsammeln der Senseboxen

Verteilen der gesammelten Daten

Datenauswertung mithilfe der Jupyter Notebooks

3 Schulstunden
5 Abschluss des Projektes:
  • Ergebnisvorstellung
  • Interpretation: Was bedeuten die Ergebnisse für uns ?
    • Diskussion von gesellschaftlichen Implikationen
1 Schulstunde

Einzelne Phasen der Unterrichtsreihe

Phase 1: Einführung in das Projekt und Generieren einer Fragestellung für die geplante datengetriebene Analyse

Beschreibung der Phase

In dieser Phase soll den SuS das Projekt bzw. Vorhaben vorgestellt werden. Sie sollen dabei eine eigene Fragestellung entwickeln, der sie in der nachfolgenden Datenanalyse nachgehen wollen. Beispiele für Fragestellungen sind:

  • Zu welcher Uhrzeit ist die Feinstaubbelastung an der Schule am höchsten ?
  • Wie viel Feinstaub produzieren verschiedene Autotypen (z.B. Diesel- vs. Benzinauto) ? (Hierbei handelt es sich um "Kurzzeitmessungen", bei denen die Sensebox unter den Auspuff des Autos gehalten wird.)
  • Wie oft/Wann überschreitet die Feinstaubbelastung an unserer Schule EU-Grenzwerte ?

Bei der Durchführung von Variante A (mit Programmierung der Sensebox) sollen die SuS zudem die Sensebox kennenlernen und erste kleinere Programmierprojekte mit Ihr durchführen.

ACHTUNG: Von dem im dieser Phase bearbeiteten Notebook ("Phase 0 Fragestellung erarbeiten") sollten die SuS in jedem Fall einen Screenshot machen oder das Notebook herunterladen (s. Tipp in Phase 4), da die Notebooks aktuell noch nicht auf dem Server gespeichert werden können.

Verlauf

Variante A (Mit Programmierung der Sensebox)
Abschnitt Inhalt Methode Material
Einstieg

(10 min)

  • Diskussion:
    • "In Fernsehberichten werden oftmals Temperaturen/Werte für Luftfeuchtigkeit/Feinstaub erwähnt."
    • "Wie werden diese Daten erhoben ?"
      • Der Kurs sollte auf Wetterstationen o.Ä. kommen, die Temperatur ect. messen.
    • "So etwas wollen wir auch erstellen und die gesammelten Daten dann analysieren."
    • "Hierzu gucken wir uns die Sensebox an."
  • Unterrichtsprojekt wird anhand des Projektplakates vorgestellt
Unterrichtsgespräch Projektplakat
Erarbeitung

(45 min)

Die SuS arbeiten
  • die Lernkarten SB01-SB07, SB12, GI01, GI02, GI03
  • die Projektübersicht der Feinstaubmessstation (dabei bei der Programmierung nur Schritt 1 und 2)

durch und programmieren die Sensebox so, dass die vom Temperatursensor

aktuell gemessene Temperatur angezeigt wird (wie auf der Lernkarte SB07).

Einzel-/Partnerarbeit Lernkarten zur Sensebox;

Projektübersicht der Feinstaubmessstation

Blockly-Programmierwebsite

bzw. Arduino-Software

Sensebox

Sicherung

(10 min)

Offene Fragen der SuS werden diskutiert und beantwortet Plenum Blockly-Programmierwebsite

Sensebox

Erarbeitung

(20 min)

Die SuS teilen sich in zwei Gruppen auf.

Innerhalb des Notebooks "Phase 0 Fragestellung erarbeiten" hält jede Gruppe ihre Fragen fest, der sie mithilfe

der Datenerhebung nachgehen wollen.

Gruppenarbeit Jupyter Notebook "Phase 0 Fragestellung erarbeiten"
Sicherung

(5 min)

Beide Gruppen stellen ihre Fragestellungen im Plenum vor. Plenum Jupyter Notebook "Phase 0 Fragestellung erarbeiten"

Anmerkung zum Programmieren der Sensebox:

Es kann zunächst sinnvoll sein, in diesem Unterrichtsabschnitt die Blockly-Programmierumgebung zu nutzen. Falls man bereits auf den Arduino-Quellcode mit den SuS hinarbeiten möchte, sollte man beachten, dass der zum "Block-Code" gehörende Arduino Quellcode auf der Blockly-Programmierwebsite stets rechts im Fenster angezeigt wird. Dies kann insbesondere auch dann hilfreich sein, wenn die Kompilierung über die Website nicht funktioniert. In diesem Fall kann man den im Fenster angezeigten Code auch in die Arduino-Software übertragen und von dort aus kompilieren.

Variante B (Ohne Programmierung der Sensebox)
Abschnitt Inhalt Methode Material
Einstieg

(10 min)

  • Diskussion:
    • "In Fernsehberichten werden oftmals Temperaturen/Werte für Luftfeuchtigkeit/Feinstaub erwähnt."
    • "Wie werden diese Daten erhoben ?"
      • Der Kurs sollte auf Wetterstationen o.Ä. kommen, die Temperatur ect. messen.
    • "So etwas wollen wir auch erstellen und die gesammelten Daten dann analysieren.
    • Hierzu gucken wir uns die Sensebox an."
  • Unterrichtsprojekt wird anhand des Projektplakates vorgestellt
Unterrichtsgespräch Projektplakat
Erarbeitung

(20 min)

Die SuS teilen sich in zwei Gruppen auf.

Innerhalb des Notebooks "Phase 0 Fragestellung erarbeiten" hält jede Gruppe ihre Fragen fest, der sie mithilfe

der Datenerhebung nachgehen wollen.

Gruppenarbeit Jupyter Notebook "Phase 0 Fragestellung erarbeiten"
Sicherung/

Diskussion

(15 min)

Beide Gruppen stellen ihre Fragestellungen im Plenum vor.

Gemeinsam wird zudem überlegt, an welchen Stellen die Senseboxen aufgestellt werden sollen

und in welchem Zeitraum - ein Wechsel des Standorts ist auch möglich und meistens sinnvoll.

Plenum Jupyter Notebook "Phase 0 Fragestellung erarbeiten"

Kartenprogramm

Benötigte Materialien

  • Laptops/PCs

Phase 2: Erstellung und Testung des Instruments

Beschreibung der Phase

Das Ziel dieser Phase ist es, dass die SuS die Senseboxen an ausgewählten Standorten aufstellen, sodass die Datensammlung beginnen kann. Hierzu empfiehlt es sich, zusammen mit den SuS loszugehen und darauf zu achten, dass die Senseboxen korrekt aufgestellt werden. Dabei sollte darauf geachtet werden, dass...

  • eine SD-Karte eingesteckt ist
  • alle Sensoren und die Clock angeschlossen sind
  • die Sensebox über eine Stromversorgung (externer Akku, "direkt aus der Steckdose",...) verfügt
  • die Sensebox eingeschaltet ist (erkennbar an einer grün leuchtenden Lampe)
  • alle Komponenten so gelagert sind, dass sie möglichst nicht von anderen Personen berührt werden können und nicht herunterfallen können etc. Hierbei können Hinweisschilder für Außenstehende sehr hilfreich sein damit man sich nicht wundert, worum es sich bei den aufgestellten "Kästen" handelt.

In Variante A sollen die SuS zudem die Sensebox eigenständig programmieren, sodass die Daten gesammelt werden können. Angeschlossen werden sollten dabei

  • die benötigten Sensoren
  • die Clock
  • eine SD-Karte

Beim Sammeln der Daten soll für jede Messgröße eine eigene csv-Datei auf der angeschlossenen SD-Karte angelegt werden. Wichtig ist hier, dass das Format der Daten in der .csv-Datei korrekt ist. Das Format hat dabei folgende Form:

value,createdAt,longitude,latitude,hight
61.23,2019-09-04T21:30:30.000Z,12.00,42.00,0.00
...

Die erste Zeile entspricht immer einer "Tabellenkopfzeile", was im wesentlichen der Übersichtlichkeit dienen soll. Jeder Messeintrag beginnt mit dem gemessenen Wert (beim Temperatur-/Luftfeuchtigkeitssensor z.B. die aktuelle Temperatur in °C). Anschließend wird der Zeitpunkt, zu dem der Wert gemessen wurde, angegeben - und zwar wie im Beispiel 04.09.2019, 21:30:30.000 → 2019-09-04T21:30:30.000Z. Zuletzt folgen noch Longitude, Latitude und Hight des Standorts, an dem die Box aufgestellt wird. Diese drei letzten Angaben sollten die SuS fest in den Programmcode schreiben, wobei sie sie zuvor recherchieren. Wichtig: Falls die Box während der Datensammlung umgestellt werden sollte, muss zunächst ein anderer Code mit den aktualisierten Positionsangaben auf die Sensebox geladen werden.

Anmerkung: Man kann jeden Messeintrag zusätzlich mit der SensorID beginnen lassen, die nur bei Registrierung der Sensebox auf der OpenSenseMap (Link) vergeben wird (Das ist optional. Falls dies interessant ist, gibt es hier ein Tutorial zur Einrichtung). Ist die SensorID unbekannt, kann man diesen Eintrag auch weglassen.

In Variante B sollten abhängig von der Boxnummer (befindet sich als Sticker auf der Sensebox) die nachfolgenden Codes auf die Sensebox geladen sein, bevor die SuS die Senseboxen aufstellen. Die Senseboxen messen dann die Temperatur, die Luftfeuchtigkeit und den aktuellen PM2.5-Feinstaubwert.

Hinweise zum Aufstellen der Sensebox

Damit die Sensebox die Daten sammeln kann, müssen

  1. der SD-Kartenanschluss samt SD-Karte,
  2. die Clock,
  3. der Temperatur-/Luftfeuchtigkeitssensor,
  4. der Feinstaubsensor

richtig an die Sensebox angeschlossen werden. Hierzu muss man

  1. den SD-Kartenanschluss samt der SD-Karte mit dem XBee Steckplatz 2,
  2. die Clock mithilfe des Clock-Kabels (schwarz, rot, weiß, gelb) mit einem I2C/Wire Steckplatz (hierbei ist darauf zu achten, dass man die richtige Seite des Kabels in die Clock/in den Steckplatz steckt - die Seite mit den zwei abstehenden Plastik-Schienen gehört in die Clock),
  3. den Temperatur-/Luftfeuchtigkeitssensor mithilfe eines JST-Kabels (schwarz, rot, grün, gelb) mit einem I2C/Wire Steckplatz,
  4. den Feinstaubsensor mithilfe des entsprechenden Kabels (schwarz, rot, blau, weiß) mit einem UART/Serial Anschluss

verbinden. Auf den nachfolgenden Bildern ist diese Verbindung der Sensoren, der Clock und der SD-Karte genauer zu sehen:

Damit die Sensebox "wetterfest" ist, wird sie mit der Clock und dem Temperatur-/Luftfeuchtigkeitssensor und ggf. zusammen mit einem Akku, falls dieser den Strom liefern soll, in die dafür vorgesehene Box gelegt. Falls Kabel aus dieser Box hinausgehen, sollten diese möglichst mit Folie, Schläuchen o.Ä. geschützt werden, um sicherzustellen, dass diese nicht nass werden. Zugleich sollten aber auch ein paar der Löcher in der Box offen bleiben, um Luft hineinzulassen, sodass korrekte Daten gesammelt werden. Weiterhin sollte der Feinstaubsensor in die dafür vorgesehene Box gelegt werden und das Kabel, welches diesen Sensor mit der Sensebox verbindet, sollte ebenfalls durch Folie oder einen Schlauch geschützt werden. Anschließend werden die beiden Boxen mit ihren Deckeln verschlossen. Auf den unten stehenden Bildern kann man diese "Verpackung" genauer erkennen und nachvollziehen.

Box 1:

  1 #include <SPI.h>
  2 #include <SD.h>
  3 #include "SenseBoxMCU.h"
  4 #include <Wire.h>
  5 #include <Adafruit_GFX.h>
  6 #include <Adafruit_SSD1306.h>
  7 #include "DS1307.h"
  8 
  9 #define OLED_RESET 4
 10 Adafruit_SSD1306 display(OLED_RESET);
 11 DS1307 clock;
 12 float temp, hum, pM;
 13 String ausgTemp, ausgHum, ausgPartMat;
 14 File dataFileDat_temp, dataFileDat_hum, dataFileDat_pM;
 15 float latitude, longitude, hight;
 16 String sensorID_temp, sensorID_hum, sensorID_pM, timestamp;
 17 String y, mo, d, h, mi, s;
 18 
 19 SDS011 my_sds(Serial1);
 20 HDC1080 hdc;
 21 
 22 
 23 void setup() {
 24     senseBoxIO.powerI2C(true);
 25 delay(2000);
 26 //display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
 27 //display.display();
 28 //delay(100);
 29 //display.clearDisplay();
 30   String ausg = String("sensorID") + "," + "value" + "," + "createdAt" + "," + "longitude" + "," + "latitude" + "," + "hight";
 31   SD.begin(28);
 32   Serial1.begin(9600);
 33   dataFileDat_temp = SD.open("Dat_temp.csv", FILE_WRITE);
 34   dataFileDat_temp.println(ausg);
 35   dataFileDat_temp.close();
 36 
 37   dataFileDat_hum = SD.open("Dat_hum.csv", FILE_WRITE);
 38   dataFileDat_hum.println(ausg);
 39   dataFileDat_hum.close();
 40   
 41   dataFileDat_pM = SD.open("Dat_pM.csv", FILE_WRITE);
 42   dataFileDat_pM.println(ausg);
 43   dataFileDat_pM.close();
 44 
 45 
 46   sensorID_temp = "5d5d00e9953683001a3ac4cf";
 47   sensorID_hum = "5d5d09cc953683001a3d4432";
 48   sensorID_pM = "5d5d00e9953683001a3ac4ce";
 49   latitude = 42;//latitude des Aufstellortes angeben
 50   longitude = 12;//longitude des Aufstellortes angeben
 51   hight = 0;//hight des Aufstellortes angeben
 52   
 53   hdc.begin();
 54 }
 55 
 56 void loop() {
 57   delay(30000);//delay wie gewünscht setzen -> Messintervall
 58   clock.getTime();
 59   y = String(clock.year + 2000);
 60   if (clock.month < 10){
 61     mo = "0" + String(clock.month);
 62   }
 63   else{
 64     mo = String(clock.month);
 65   }
 66   if (clock.dayOfMonth < 10){
 67     d = "0" + String(clock.dayOfMonth);
 68   }
 69   else{
 70     d = String(clock.dayOfMonth);
 71   }
 72   if (clock.hour < 10){
 73     h = "0" + String(clock.hour);
 74   }
 75   else{
 76     h = String(clock.hour);
 77   }
 78   if (clock.minute < 10){
 79     mi = "0" + String(clock.minute);
 80   }
 81   else{
 82     mi = String(clock.minute);
 83   }
 84   if (clock.second < 10){
 85     s = "0" + String(clock.second);
 86   }
 87   else{
 88     s = String(clock.second);
 89   }
 90   //2019-08-22T09:34:55.525Z
 91   timestamp = y + "-" + mo + "-" + d + "T"+ h + ":" + mi + ":" + s + "." + "000" + "Z";
 92   pM = my_sds.getPm25();
 93   temp = hdc.getTemperature();
 94   hum = hdc.getHumidity();
 95   ausgTemp = String(sensorID_temp) + "," + String(temp);
 96   ausgTemp += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
 97   dataFileDat_temp = SD.open("Dat_temp.csv", FILE_WRITE);
 98   dataFileDat_temp.println(ausgTemp);
 99   dataFileDat_temp.close();
100   
101   ausgHum = String(sensorID_hum) + "," + String(hum);
102   ausgHum += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
103   dataFileDat_hum = SD.open("Dat_hum.csv", FILE_WRITE);
104   dataFileDat_hum.println(ausgHum);
105   dataFileDat_hum.close();
106   
107   ausgPartMat = String(sensorID_pM) + "," + String(pM);
108   ausgPartMat += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
109   dataFileDat_pM = SD.open("Dat_pM.csv", FILE_WRITE);
110   dataFileDat_pM.println(ausgPartMat);
111   dataFileDat_pM.close();
112 
113     //display.setCursor(0,0);
114     //display.setTextSize(1);
115     //display.setTextColor(WHITE,BLACK);
116     //display.println(timestamp + "\n" + "Temp.:" + String(temp) + "°C" + "\n" + "Luftf.:" + String(hum) + "%" + "\n" + "Fstaub.:" + String(pM)); ;
117   //display.display();
118 
119 }

Box 2:

  1 #include <SPI.h>
  2 #include <SD.h>
  3 #include "SenseBoxMCU.h"
  4 #include <Wire.h>
  5 #include <Adafruit_GFX.h>
  6 #include <Adafruit_SSD1306.h>
  7 #include "DS1307.h"
  8 
  9 #define OLED_RESET 4
 10 Adafruit_SSD1306 display(OLED_RESET);
 11 DS1307 clock;
 12 float temp, hum, pM;
 13 String ausgTemp, ausgHum, ausgPartMat;
 14 File dataFileDat_temp, dataFileDat_hum, dataFileDat_pM;
 15 float latitude, longitude, hight;
 16 String sensorID_temp, sensorID_hum, sensorID_pM, timestamp;
 17 String y, mo, d, h, mi, s;
 18 
 19 SDS011 my_sds(Serial1);
 20 HDC1080 hdc;
 21 
 22 
 23 void setup() {
 24     senseBoxIO.powerI2C(true);
 25 delay(2000);
 26 //display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
 27 //display.display();
 28 //delay(100);
 29 //display.clearDisplay();
 30   String ausg = String("sensorID") + "," + "value" + "," + "createdAt" + "," + "longitude" + "," + "latitude" + "," + "hight";
 31   SD.begin(28);
 32   Serial1.begin(9600);
 33   dataFileDat_temp = SD.open("Dat_temp.csv", FILE_WRITE);
 34   dataFileDat_temp.println(ausg);
 35   dataFileDat_temp.close();
 36 
 37   dataFileDat_hum = SD.open("Dat_hum.csv", FILE_WRITE);
 38   dataFileDat_hum.println(ausg);
 39   dataFileDat_hum.close();
 40   
 41   dataFileDat_pM = SD.open("Dat_pM.csv", FILE_WRITE);
 42   dataFileDat_pM.println(ausg);
 43   dataFileDat_pM.close();
 44 
 45 
 46   sensorID_temp = "5d5d1209953683001a3f93fb";
 47   sensorID_hum = "5d5d1209953683001a3f93f9";
 48   sensorID_pM = "5d5d1209953683001a3f93fa";
 49   latitude = 42;//latitude des Aufstellortes angeben
 50   longitude = 12;//longitude des Aufstellortes angeben
 51   hight = 0;//hight des Aufstellortes angeben
 52   
 53   hdc.begin();
 54 }
 55 
 56 void loop() {
 57   delay(30000);//delay wie gewünscht setzen -> Messintervall
 58   clock.getTime();
 59   y = String(clock.year + 2000);
 60   if (clock.month < 10){
 61     mo = "0" + String(clock.month);
 62   }
 63   else{
 64     mo = String(clock.month);
 65   }
 66   if (clock.dayOfMonth < 10){
 67     d = "0" + String(clock.dayOfMonth);
 68   }
 69   else{
 70     d = String(clock.dayOfMonth);
 71   }
 72   if (clock.hour < 10){
 73     h = "0" + String(clock.hour);
 74   }
 75   else{
 76     h = String(clock.hour);
 77   }
 78   if (clock.minute < 10){
 79     mi = "0" + String(clock.minute);
 80   }
 81   else{
 82     mi = String(clock.minute);
 83   }
 84   if (clock.second < 10){
 85     s = "0" + String(clock.second);
 86   }
 87   else{
 88     s = String(clock.second);
 89   }
 90   //2019-08-22T09:34:55.525Z
 91   timestamp = y + "-" + mo + "-" + d + "T"+ h + ":" + mi + ":" + s + "." + "000" + "Z";
 92   pM = my_sds.getPm25();
 93   temp = hdc.getTemperature();
 94   hum = hdc.getHumidity();
 95   ausgTemp = String(sensorID_temp) + "," + String(temp);
 96   ausgTemp += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
 97   dataFileDat_temp = SD.open("Dat_temp.csv", FILE_WRITE);
 98   dataFileDat_temp.println(ausgTemp);
 99   dataFileDat_temp.close();
100   
101   ausgHum = String(sensorID_hum) + "," + String(hum);
102   ausgHum += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
103   dataFileDat_hum = SD.open("Dat_hum.csv", FILE_WRITE);
104   dataFileDat_hum.println(ausgHum);
105   dataFileDat_hum.close();
106   
107   ausgPartMat = String(sensorID_pM) + "," + String(pM);
108   ausgPartMat += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
109   dataFileDat_pM = SD.open("Dat_pM.csv", FILE_WRITE);
110   dataFileDat_pM.println(ausgPartMat);
111   dataFileDat_pM.close();
112 
113     //display.setCursor(0,0);
114     //display.setTextSize(1);
115     //display.setTextColor(WHITE,BLACK);
116     //display.println(timestamp + "\n" + "Temp.:" + String(temp) + "°C" + "\n" + "Luftf.:" + String(hum) + "%" + "\n" + "Fstaub.:" + String(pM) + "µg/m³");
117   //display.display();
118 
119 }

Box 3:

  1 #include <SPI.h>
  2 #include <SD.h>
  3 #include "SenseBoxMCU.h"
  4 #include <Wire.h>
  5 #include <Adafruit_GFX.h>
  6 #include <Adafruit_SSD1306.h>
  7 #include "DS1307.h"
  8 
  9 #define OLED_RESET 4
 10 Adafruit_SSD1306 display(OLED_RESET);
 11 DS1307 clock;
 12 float temp, hum, pM;
 13 String ausgTemp, ausgHum, ausgPartMat;
 14 File dataFileDat_temp, dataFileDat_hum, dataFileDat_pM;
 15 float latitude, longitude, hight;
 16 String sensorID_temp, sensorID_hum, sensorID_pM, timestamp;
 17 String y, mo, d, h, mi, s;
 18 
 19 SDS011 my_sds(Serial1);
 20 HDC1080 hdc;
 21 
 22 
 23 void setup() {
 24     senseBoxIO.powerI2C(true);
 25 delay(2000);
 26 //display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
 27 //display.display();
 28 //delay(100);
 29 //display.clearDisplay();
 30   String ausg = String("sensorID") + "," + "value" + "," + "createdAt" + "," + "longitude" + "," + "latitude" + "," + "hight";
 31   SD.begin(28);
 32   Serial1.begin(9600);
 33   dataFileDat_temp = SD.open("Dat_temp.csv", FILE_WRITE);
 34   dataFileDat_temp.println(ausg);
 35   dataFileDat_temp.close();
 36 
 37   dataFileDat_hum = SD.open("Dat_hum.csv", FILE_WRITE);
 38   dataFileDat_hum.println(ausg);
 39   dataFileDat_hum.close();
 40   
 41   dataFileDat_pM = SD.open("Dat_pM.csv", FILE_WRITE);
 42   dataFileDat_pM.println(ausg);
 43   dataFileDat_pM.close();
 44 
 45 
 46   sensorID_temp = "5d5d13fd953683001a401cd8";
 47   sensorID_hum = "5d5d13fd953683001a401cd7";
 48   sensorID_pM = "5d5d13fd953683001a401cd6";
 49   latitude = 42;//latitude des Aufstellortes angeben
 50   longitude = 12;//longitude des Aufstellortes angeben
 51   hight = 0;//hight des Aufstellortes angeben
 52   
 53   hdc.begin();
 54 }
 55 
 56 void loop() {
 57   delay(30000);//delay wie gewünscht setzen -> Messintervall
 58   clock.getTime();
 59   y = String(clock.year + 2000);
 60   if (clock.month < 10){
 61     mo = "0" + String(clock.month);
 62   }
 63   else{
 64     mo = String(clock.month);
 65   }
 66   if (clock.dayOfMonth < 10){
 67     d = "0" + String(clock.dayOfMonth);
 68   }
 69   else{
 70     d = String(clock.dayOfMonth);
 71   }
 72   if (clock.hour < 10){
 73     h = "0" + String(clock.hour);
 74   }
 75   else{
 76     h = String(clock.hour);
 77   }
 78   if (clock.minute < 10){
 79     mi = "0" + String(clock.minute);
 80   }
 81   else{
 82     mi = String(clock.minute);
 83   }
 84   if (clock.second < 10){
 85     s = "0" + String(clock.second);
 86   }
 87   else{
 88     s = String(clock.second);
 89   }
 90   //2019-08-22T09:34:55.525Z
 91   timestamp = y + "-" + mo + "-" + d + "T"+ h + ":" + mi + ":" + s + "." + "000" + "Z";
 92   pM = my_sds.getPm25();
 93   temp = hdc.getTemperature();
 94   hum = hdc.getHumidity();
 95   ausgTemp = String(sensorID_temp) + "," + String(temp);
 96   ausgTemp += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
 97   dataFileDat_temp = SD.open("Dat_temp.csv", FILE_WRITE);
 98   dataFileDat_temp.println(ausgTemp);
 99   dataFileDat_temp.close();
100   
101   ausgHum = String(sensorID_hum) + "," + String(hum);
102   ausgHum += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
103   dataFileDat_hum = SD.open("Dat_hum.csv", FILE_WRITE);
104   dataFileDat_hum.println(ausgHum);
105   dataFileDat_hum.close();
106   
107   ausgPartMat = String(sensorID_pM) + "," + String(pM);
108   ausgPartMat += "," + String(timestamp) + "," + String(longitude) + "," + String(latitude) + "," + String(hight);
109   dataFileDat_pM = SD.open("Dat_pM.csv", FILE_WRITE);
110   dataFileDat_pM.println(ausgPartMat);
111   dataFileDat_pM.close();
112 
113     //display.setCursor(0,0);
114     //display.setTextSize(1);
115     //display.setTextColor(WHITE,BLACK);
116     //display.println(timestamp + "\n" + "Temp.:" + String(temp) + "°C" + "\n" + "Luftf.:" + String(hum) + "%" + "\n" + "Fstaub.:" + String(pM) + "µg/m³");
117   //display.display();
118 
119 }


Anmerkungen zu den Programmcodes:

In den vorliegenden Programmcodes misst die Sensebox in einem Intervall von etwa 30 Sekunden. Dies lässt sich über eine Abänderung der Konstante in delay(30000); direkt am Anfang der loop-Methode verändern. Die übergebene Konstante entspricht (in etwa) den Millisekunden zwischen den Messintervallen.

In den Zeilen 49-51 sind zudem noch die Werte für Latitude, Longitude und Hight zu aktualisieren.

Die auskommentierten Zeilen 26-29 sowie 113-117 lassen sich durch Entfernen der doppelten Schrägstriche wieder aktivieren und bewirken, dass bei verbundenem Display der aktuelle Timestamp, die aktuelle Temperatur, Luftfeuchtigkeit und der aktuelle PM2.5-Feinstaubwert auf diesem angezeigt werden.

Falls die Uhrzeit oder das Datum, die oder das von der Clock vorgegeben wird, nicht stimmt, lässt sich dies ändern, indem man den folgenden Code auf die Sensebox lädt. Dabei sind in Zeile 23-25 die Parameter für das Datum und die Uhrzeit so einzugeben, wie es im jeweils zugehörigen Kommentar steht.

Setup zum Einstellen des Datums und der Uhrzeit für die Clock:

 1 #include <SPI.h>
 2 #include <Wire.h>
 3 #include <Adafruit_GFX.h>
 4 #include <Adafruit_SSD1306.h>
 5 #include "SenseBoxMCU.h"
 6 #include <Wire.h>
 7 #include "DS1307.h"
 8 
 9 #define OLED_RESET 4
10 Adafruit_SSD1306 display(OLED_RESET);
11 DS1307 clock;
12 
13 
14 void setup() {
15   senseBoxIO.powerI2C(true);
16 delay(2000);
17 display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
18 display.display();
19 delay(100);
20 display.clearDisplay();
21     Serial.begin(9600);
22     clock.begin();
23     clock.fillByYMD(2020,3,26);//hier das richtige Datum im Format yyyy,(m)m,(d)d eintragen - dabei führende Nullen weglassen
24     clock.fillByHMS(16,31,10);//hier die richtige Uhrzeit im Format (h)h,(m)m,(s)s eintragen - dabei führende Nullen weglassen
25     clock.fillDayOfWeek(THU);//hier den richtigen Wochentag in der Form (MON, TUE, WED, THU, FRI, SAT, SUN) eintragen.
26     clock.setTime();//write time to the RTC chip
27 }
28 
29 void loop() {
30     clock.getTime();
31     display.setCursor(0,0);
32     display.setTextSize(1);
33     display.setTextColor(WHITE,BLACK);
34     display.println(String(clock.second) + ":" + String(clock.month) + ":" + String(clock.dayOfMonth));
35   display.display();
36 
37 }

Auch für Variante A könnten diese Codes hilfreich sein, falls die SuS an einer Stelle beim Programmieren nicht weiterkommen und in den fertigen Dateien schauen wollen, wie man ein bestimmtes Problem lösen könnte.

Nachdem das jeweilige Programm auf die Sensebox geladen wurde, können die Senseboxen wie oben beschrieben aufgestellt werden.

Verlauf

Variante A (mit Programmierung der Sensebox)
Abschnitt Inhalt Methode Material
Einstieg

(10 min)

  • Im Plenum wird beispielhaft eine .csv-Datei gezeigt, in der bereits Werte enthalten sind.
  • Die SuS sollen basierend darauf in ihren Gruppen (erste) Ideen sammeln, wie sie die Sensebox programmieren müssen, um ihre Messwerte ebenso abzuspeichern.
Unterrichtsgespräch Beispielhafte .csv-Datei
Erarbeitung

(90 min)

Die SuS programmieren die Sensebox für die Datensammlung. Dabei ist es empfehlenswert,

dass kleinere Teams den Code für je eine Messgröße schreiben. Gemeinsam wird der Code dann zusammengeführt.

Die SuS können sich - insbesondere falls sie mit der Arduino-Software programmieren - an einer bereits fertigen Programmierung einer Sensebox orientieren.

Zum Schluss laden die SuS den fertigen Code auf die Sensebox.

Falls die SuS nicht fertig werden, kann auch der fertige Sensebox-Programmcode auf die Sensebox geladen werden. In diesem Fall wird die Sensebox

  • Feinstaub (PM2,5)
  • Luftfeuchtigkeit
  • Temperatur

messen.

Gruppenarbeit Sensebox, Fertiges Sensebox-Programm;

Arduino-Software bzw.

Blockly-Programmierwebsite, Sensebox

Erarbeitung

(5 min)

Gemeinsam wird überlegt, an welchen Stellen die Senseboxen aufgestellt werden sollen

und in welchem Zeitraum - ein Wechsel des Standorts ist auch möglich und meistens sinnvoll.

Gruppenarbeit Kartenprogramm
Erarbeitung

(30 min)

Die SuS stellen die fertig programmierten Senseboxen am gewählten Standort auf. Hinweis: Dieser Schritt kann abhängig vom Standort etwas länger dauern. Die SuS sollen darauf achten, dass
  • eine SD-Karte eingesteckt ist
  • alle Sensoren und die Clock angeschlossen sind
  • die Sensebox über eine Stromversorgung (externer Akku, "direkt aus der Steckdose",...) verfügt
  • die Sensebox eingeschaltet ist (erkennbar an einer grün leuchtenden Lampe)
  • alle Komponenten so gelagert sind, dass sie möglichst nicht von anderen Personen berührt werden können und nicht herunterfallen können etc. Hierbei können Hinweisschilder für Außenstehende sehr hilfreich sein damit man sich nicht wundert, worum es sich bei den aufgestellten "Kästen" handelt.
Gruppenarbeit programmierte Senseboxen

mobile Akkus/

Stromversorgung

Variante B (ohne Programmierung der Sensebox)
Abschnitt Inhalt Methode Material
Einstieg

(15 min)

  • Die gewählten Standorte werden noch einmal besprochen.
  • Die einzelnen Gruppen teilen sich Aufgaben zu, wer beim Aufstellen der Sensebox auf die u.g. Aspekte achten soll.
Unterrichtsgespräch Kartenprogramm
Erarbeitung

(30 min)

Die SuS stellen die fertig programmierten Senseboxen am gewählten Standort auf. Hinweis: Dieser Schritt kann abhängig vom Standort etwas länger dauern. Die SuS sollen darauf achten, dass
  • eine SD-Karte eingesteckt ist
  • alle Sensoren und die Clock angeschlossen sind
  • die Sensebox über eine Stromversorgung (externer Akku, "direkt aus der Steckdose",...) verfügt
  • die Sensebox eingeschaltet ist (erkennbar an einer grün leuchtenden Lampe)
  • alle Komponenten so gelagert sind, dass sie möglichst nicht von anderen Personen berührt werden können und nicht herunterfallen können etc. Hierbei können Hinweisschilder für Außenstehende sehr hilfreich sein damit man sich nicht wundert, worum es sich bei den aufgestellten "Kästen" handelt.
Gruppenarbeit programmierte Senseboxen

mobile Akkus/

Stromversorgung

Benötigte Materialien

  • Laptops/PCs
  • Beispielhafte .csv-Datei:
    • gemessene Luftfeuchtigkeit am Münsteraner Ludgerikreisel (am 11.09.2019 zwischen 10:36 Uhr und 11:20)
 1 sensorID_hum, hum, timestamp, longitude, latitude, hight
 2 5d5d1209953683001a3f93f9,43.31,2019-09-11T10:36:05.000Z,7.63,51.96,60.00
 3 5d5d1209953683001a3f93f9,45.23,2019-09-11T10:37:05.000Z,7.63,51.96,60.00
 4 5d5d1209953683001a3f93f9,44.55,2019-09-11T10:38:05.000Z,7.63,51.96,60.00
 5 5d5d1209953683001a3f93f9,44.17,2019-09-11T10:39:05.000Z,7.63,51.96,60.00
 6 5d5d1209953683001a3f93f9,46.17,2019-09-11T10:40:05.000Z,7.63,51.96,60.00
 7 5d5d1209953683001a3f93f9,47.52,2019-09-11T10:41:05.000Z,7.63,51.96,60.00
 8 5d5d1209953683001a3f93f9,47.86,2019-09-11T10:42:05.000Z,7.63,51.96,60.00
 9 5d5d1209953683001a3f93f9,47.56,2019-09-11T10:43:05.000Z,7.63,51.96,60.00
10 5d5d1209953683001a3f93f9,48.26,2019-09-11T10:44:06.000Z,7.63,51.96,60.00
11 5d5d1209953683001a3f93f9,45.79,2019-09-11T10:45:06.000Z,7.63,51.96,60.00
12 5d5d1209953683001a3f93f9,47.92,2019-09-11T10:46:06.000Z,7.63,51.96,60.00
13 5d5d1209953683001a3f93f9,42.77,2019-09-11T10:47:06.000Z,7.63,51.96,60.00
14 5d5d1209953683001a3f93f9,42.85,2019-09-11T10:48:06.000Z,7.63,51.96,60.00
15 5d5d1209953683001a3f93f9,41.79,2019-09-11T10:49:06.000Z,7.63,51.96,60.00
16 5d5d1209953683001a3f93f9,40.68,2019-09-11T10:50:06.000Z,7.63,51.96,60.00
17 5d5d1209953683001a3f93f9,40.03,2019-09-11T10:51:06.000Z,7.63,51.96,60.00
18 5d5d1209953683001a3f93f9,39.79,2019-09-11T10:52:06.000Z,7.63,51.96,60.00
19 5d5d1209953683001a3f93f9,38.76,2019-09-11T10:53:06.000Z,7.63,51.96,60.00
20 5d5d1209953683001a3f93f9,38.44,2019-09-11T10:54:06.000Z,7.63,51.96,60.00
21 5d5d1209953683001a3f93f9,36.92,2019-09-11T10:55:06.000Z,7.63,51.96,60.00
22 5d5d1209953683001a3f93f9,38.39,2019-09-11T10:56:07.000Z,7.63,51.96,60.00
23 5d5d1209953683001a3f93f9,35.82,2019-09-11T10:57:07.000Z,7.63,51.96,60.00
24 5d5d1209953683001a3f93f9,36.29,2019-09-11T10:58:07.000Z,7.63,51.96,60.00
25 5d5d1209953683001a3f93f9,36.37,2019-09-11T10:59:07.000Z,7.63,51.96,60.00
26 5d5d1209953683001a3f93f9,36.29,2019-09-11T11:00:07.000Z,7.63,51.96,60.00
27 5d5d1209953683001a3f93f9,36.29,2019-09-11T11:01:07.000Z,7.63,51.96,60.00
28 5d5d1209953683001a3f93f9,34.61,2019-09-11T11:02:07.000Z,7.63,51.96,60.00
29 5d5d1209953683001a3f93f9,34.41,2019-09-11T11:03:07.000Z,7.63,51.96,60.00
30 5d5d1209953683001a3f93f9,34.99,2019-09-11T11:04:07.000Z,7.63,51.96,60.00
31 5d5d1209953683001a3f93f9,35.76,2019-09-11T11:05:07.000Z,7.63,51.96,60.00
32 5d5d1209953683001a3f93f9,36.97,2019-09-11T11:06:07.000Z,7.63,51.96,60.00
33 5d5d1209953683001a3f93f9,34.69,2019-09-11T11:07:08.000Z,7.63,51.96,60.00
34 5d5d1209953683001a3f93f9,36.24,2019-09-11T11:08:08.000Z,7.63,51.96,60.00
35 5d5d1209953683001a3f93f9,35.76,2019-09-11T11:09:08.000Z,7.63,51.96,60.00
36 5d5d1209953683001a3f93f9,35.09,2019-09-11T11:10:08.000Z,7.63,51.96,60.00
37 5d5d1209953683001a3f93f9,35.57,2019-09-11T11:11:08.000Z,7.63,51.96,60.00
38 5d5d1209953683001a3f93f9,35.27,2019-09-11T11:12:08.000Z,7.63,51.96,60.00
39 5d5d1209953683001a3f93f9,34.05,2019-09-11T11:13:08.000Z,7.63,51.96,60.00
40 5d5d1209953683001a3f93f9,32.87,2019-09-11T11:14:08.000Z,7.63,51.96,60.00
41 5d5d1209953683001a3f93f9,33.15,2019-09-11T11:15:08.000Z,7.63,51.96,60.00
42 5d5d1209953683001a3f93f9,33.03,2019-09-11T11:16:08.000Z,7.63,51.96,60.00
43 5d5d1209953683001a3f93f9,32.72,2019-09-11T11:17:08.000Z,7.63,51.96,60.00
44 5d5d1209953683001a3f93f9,34.59,2019-09-11T11:18:08.000Z,7.63,51.96,60.00
45 5d5d1209953683001a3f93f9,33.04,2019-09-11T11:19:09.000Z,7.63,51.96,60.00
46 5d5d1209953683001a3f93f9,33.47,2019-09-11T11:20:09.000Z,7.63,51.96,60.00

Phase 3: Einführungskurs in Python

Beschreibung der Phase

Diese Phase sollte durchgeführt werden, während die Daten mithilfe der aufgestellten Senseboxen gesammelt werden. So wird ein genügend großer Zeitraum für die Datensammlung gewährt.

In dieser Phase sollen die SuS die Grundlagen von Python erlernen. Dazu durchlaufen die SuS den Python-Online-Kurs der University of Waterloo (Link). Hier werden grundlegende Aspekte der Programmiersprache schrittweise erarbeitet, indem für jedes "Programmierkonstrukt" zunächst ein erläuternder Text gegeben wird und die SuS dann das neu erworbene Wissen selbst anwenden und eigenständig in "Code-Blöcken" bestimmte Programmieraufgaben lösen müssen.

Da im weiteren Verlauf der Unterrichtsreihe innerhalb von Juptyer Notebooks programmiert werden soll und zudem die Datentypen aus der pandas-Bibliothek genutzt werden, gibt es hierzu zwei Notebooks (Einführung Jupyter Notebooks und Nützliche Datentypen in Python), die einem ähnlichen Prinzip folgen, wie der Python-Online-Kurs der University of Waterloo: Auch hier gibt es zunächst erklärende Texte, bevor die SuS "Code-Blöcke" eigenständig erstellen bzw. ergänzen müssen, um gestellte Aufgaben zu lösen.

Die SuS sollen sowohl den Python-Online-Kurs als auch die beiden Jupyter Notebooks selbstständig bearbeiten. Der Python-Online-Kurs sollte nach etwa 4 Unterrichtsstunden abgeschlossen werden, und die beiden Notebooks in - zusammengenommen - 2 Unterrichtsstunden. Es bietet sich an, zum Beginn und zum Ende jeder Unterrichtseinheit etwa 5-10 Minuten für allgemeine Fragen der SuS einzuplanen, die im Plenum diskutiert und beantwortet werden können.

Verlauf

Eine grobe Skizze des Unterrichtsverlaufs: Die SuS arbeiten dauerhaft in Einzel-/Partnerarbeit am Online-Kurs bzw. an den Jupyter-Notebooks. Am Anfang/Ende jeder Einheit sollten etwa 10 min für Fragen eingeplant werden, die im Plenum diskutiert und beantwortet werden sollen. Ebenfalls können die SuS in dieser Zeit ihre Senseboxen an einem anderen Ort neu aufbauen (z.B. wenn sie verschiedene Standorte - wie Hauptstraße vs. Schulgarten - miteinander vergleichen wollen). Dabei sollten sie folgenden Ablaufplan beachten:

  1. Stromzufuhr der Sensebox abstellen
  2. SD-Karte aus der Sensebox entfernen
  3. Inhalt der SD-Karte auf einem Laptop/PC sichern
  4. Ggf. neuen Code auf die Sensebox spielen
  5. SD-Karte wieder in die Sensebox stecken
  6. Sensebox an neuem Ort aufstellen
  7. Strom anschließen

Hausaufgabe sollte es stets sein, zu Hause 30 min am Online-Kurs/an den Jupyter-Notebooks zu arbeiten.

Abschnitt Inhalt Methode Material
Erarbeitung

(4 Unterrichtsstunden)

Die SuS erarbeiten sich eigenständig Grundlagen der Programmiersprache Python,

indem sie den Python-Online-Kurs der University of Waterloo durchlaufen

Einzel-/Partnerarbeit Python-Online-Kurs der University of Waterloo
Erarbeitung

(15 min)

Die SuS erarbeiten sich eigenständig Grundlagen in der Arbeit mit Jupyter Notebooks,

indem sie das Jupyter Notebook "Einführung in Jupyter Notebooks" durchlaufen

Einzel-/Partnerarbeit Jupyter Notebook "Einführung in Jupyter Notebooks"
Erarbeitung

(75 min)

Die SuS erarbeiten sich eigenständig die Datentypen list, Series und DataFrame,

indem sie das Jupyter Notebook "Nützliche Datentypen in Python" durchlaufen

Einzel-/Partnerarbeit Jupyter Notebook "Nützliche Datentypen in Python"

Benötigte Materialien

  • Laptops/PCs

Phase 4: Datenauswertung mit Jupyter Notebooks

Beschreibung der Phase

In dieser Phase sollen die SuS die von der Sensebox gesammelten Daten über die SD-Karte auf die PCs/Laptops übertragen und dann mithilfe der Jupyter-Notebooks analysieren und darstellen. Dabei sollen sie die Jupyter-Notebooks auch adaptieren, um eine Datenanalyse im Sinne ihres "Forschungsinteresses" durchzuführen. Beispielsweise lässt sich mithilfe einer eigens erstellten .csv-Datei, die nur zwei Messwerte enthält (, die beide einem gewissen Grenzwert entsprechen), eine Gerade für Grenzwerte in eine Grafik an Messwerten einzeichnen.

Generell ist es in dieser Phase sinnvoll, dass die Gruppen die Aufgaben zur Präsentationserstellung unter den Gruppenmitgliedern aufteilen.

Die einzelnen Gruppen sollen Grafiken und erhaltene Ergebnisse benutzen, um eine Präsentation zu ihrer Forschungsfrage zu erstellen (z.B. PowerPoint-Präsentation/Poster/...). Dort sollen auch gesellschaftliche Implikationen festgehalten werden.

Verlauf

Abschnitt Inhalt Methode Material
Einstieg

(10 min)

Die Kleingruppen berichten kurz, wo sie ihre Senseboxen aufgestellt haben und ob es dabei Probleme gab. Plenum ggf. Kartenprogramm
Erarbeitung

(5 min)

Die Gruppen teilen die Aufgaben auf, die sie bei der Erstellung der Präsentation erledigen müssen. Beispielhafte Aufgaben sind:
  • Auswerten einzelner Messgrößen in den Jupyter Notebooks
  • Erstellen der Präsentation (als PowerPoint oder Poster) und Zusammenführen der Analyseergebnisse
  • ...
Gruppenarbeit
Erarbeitung

(120 min)

Die SuS verwenden die Jupyter Notebooks "Phase 1 und 2 Daten einlesen" und "Phase 3 Datenvisualisierung", um die gesammelten Daten der Senseboxen einzulesen, zu bereinigen und zu analysieren. Dabei erstellen sie Screenshots bzw. notieren sich Analyseergebnisse. Sie sollen die Jupyter Notebooks auch adaptieren, müssen dabei jedoch darauf achten, dass sie nach jeder Unterrichtseinheit alle adaptierten JupyterNotebooks und bereinigten .csv-Dateien herunterladen, da die Notebooks aktuell noch nicht auf dem Server gespeichert werden können. Zu Beginn jeder neuen Unterrichtseinheit müssen die SuS die .csv-Dateien und Jupyter Notebooks dann wieder hochladen, um mit ihnen weiterarbeiten zu können. Wie das funktioniert, ist weiter unten erläutert.


Unter Verwendung der Analyseergebnisse und besonders der damit einhergehenden Visualisierungen erstellen die einzelnen Gruppen ein Poster/eine Präsentation, basierend auf der eingangs formulierten Forschungsfrage. Diese soll auf dem Poster/innerhalb der Präsentation beantwortet werden, worauf aufbauend gesellschaftliche Implikationen festgehalten werden sollen.

Gruppenarbeit -

dabei unterteilt in

Einzel/Partnerarbeit

Jupyter Notebooks

"Phase 1 und 2 Daten einlesen"

"Phase 3 Datenvisualisierung"

Zum Jupyter Notebook "Phase 1 und 2 Daten einlesen":

Die SuS sollen bei diesem Notebook die .csv-Dateien, welche von der Sensebox erstellt wurden, einlesen lassen und so bereinigen, dass der erstellte Timestamp als eigener Datentyp erkannt wird. Zudem soll der Timestamp als Index für die Daten festgelegt werden, sodass die Daten über diesen eindeutig adressiert werden können. Ggf. gibt es ebenfalls Komplikationen, sodass die Daten nicht derartig eingelesen werden können. Ein "typisches" Problem könnte hierbei sein, dass bei einem Neustart der Sensebox - also immer wenn der Strom kurzzeitig unterbrochen ist - eine neue "Überschriftszeile" erstellt wird, die erst aus der ursprünglichen .csv-Datei gelöscht werden muss, bevor der Timestamp der Daten als Index festgelegt werden kann.

Die SuS sollen sich bei diesem Notebook an dem bereits eingegebenen Code und den erläuternden Texten orientieren und den Code adaptieren, um alle bei der Datenanalyse benötigten .csv-Dateien einzulesen und bereinigt abzuspeichern.

Anhand dieses Notebooks lernen die SuS also den Prozess des Dateneinlesens und Datenbereinigens als wichtige Teilschritte der Datenanalyse kennen. Sie erkennen dabei insbesondere, dass die gesammelten Daten oftmals noch nicht ohne diesen Bereinigungsschritt eingelesen werden können, sodass auch deutlich wird, dass es nicht "per se" fehlerfreie Daten gibt. Um die SuS dies erkennen zu lassen, ist das Zulassen von "Irrwegen" also sehr wichtig.

Zum Jupyter Notebook "Phase 3 Datenvisualisierung":

In diesem Notebook sollen die SuS die zuvor bereinigten und in einer neuen .csv-Datei abgespeicherten Daten nach spezifischem Interesse filtern und visualisieren. Dabei lernen sie auch verschiedene Visualisierungsmöglichkeiten kennen und sollen mit diesem neu erlangten Wissen den bereits eingegebenen Code adaptieren, um die Daten nach ihren (Forschungs-)Interessen möglichst aussagekräftig darzustellen. Dabei werden sie auch feststellen, dass es an manchen Stellen Messfehler gab, sodass die zugehörigen Daten angepasst oder gelöscht werden müssen. Ein "typisches" Problem ist beispielsweise, dass der Feinstaubsensor bei einer hohen Luftfeuchtigkeit zu hohe Feinstaubwerte angibt. Diesen Zusammenhang gilt es beispielsweise für die SuS zu erkennen (z.B. auch durch eine Internetrecherche) und dementsprechend die betrachteten Daten anzupassen.

Die SuS lernen also die Aspekte der Datenfilterung und Datenvisualisierung als wichtige Schritte der Datenanalyse kennen. Auch hierbei werden sie die Erfahrung machen, dass die gesammelten Daten teilweise noch bereinigt werden müssen, indem ggf. einige Datenpunkte gelöscht oder angepasst werden. Es wird deutlich, dass auch in der Datenanalyse "Bereinigungsschritte" benötigt werden, um eine korrekte Auswertung zu erstellen. Um die SuS diese zuletzt genannte Erkenntnis gewinnen zu lassen, ist es also wieder wichtig, "Irrwege" zuzulassen.


ACHTUNG: Nach jeder Unterrichtsstunde/-einheit sollten die SuS alle adaptierten Jupyter Notebooks und bereinigten .csv-Dateien herunterladen, da die Notebooks aktuell noch nicht auf dem Server gespeichert werden können. Zu Beginn jeder neuen Unterrichtseinheit müssen die SuS die .csv-Dateien und Jupyter Notebooks dann wieder hochladen, um mit ihnen weiterarbeiten zu können. Wie das funktioniert, ist im Folgenden nachzulesen.

Tipps zu Jupyter Notebooks:

Benötigte Materialien


Phase 5: Abschluss des Projektes

Beschreibung der Phase

In dieser Phase stellen die Gruppen ihre in Phase 4 vorbereiteten Präsentationen vor. Dabei sollten nach jeder Präsentation die Ergebnisse und gesellschaftlichen Implikationen diskutiert werden. Am Ende erfolgt eine Evaluation der Unterrichtsreihe.

Verlauf

Abschnitt Inhalt Methode Material
Sicherung

(30 min)

Die Kleingruppen präsentieren ihre Ergebnisse und herausgearbeiteten gesellschaftlichen Implikationen.

Nach jeder Präsentation: Zeit für Diskussion der Ergebnisse/gesellschaftlichen Implikationen

Plenum PowerPoint/Poster,...

ggf. Jupyter Notebooks

zum Zeigen der Ergebnisse

Evaluation

(15 min)

Die Unterrichtsreihe wird evaluiert. Dabei können entweder Fragebögen ausgefüllt werden oder im Plenum

Vor- und Nachteile der Reihe diskutiert werden. Eventuell sollten separate Termine für Interviews vereinbart werden.


In dieser Phase sollen die SuS auch reflektieren, inwiefern sie die Programmierung in Form der Datensammlung bzw. der Datenauswertung dabei unterstützt hat, Erkenntnisse und darauf aufbauende gesellschaftliche Implikationen in Bezug auf ihre Umwelt zu gewinnen.

Plenum oder

Einzelarbeit

Benötigte Materialien