Analyse von Umweltdaten: Unterschied zwischen den Versionen
K (→Verlauf) |
|||
Zeile 854: | Zeile 854: | ||
#SD-Karte aus der Sensebox entfernen | #SD-Karte aus der Sensebox entfernen | ||
#Inhalt der SD-Karte auf einem Laptop/PC sichern | #Inhalt der SD-Karte auf einem Laptop/PC sichern | ||
#Ggf. neuen Code auf die Sensebox spielen | |||
#SD-Karte wieder in die Sensebox stecken | #SD-Karte wieder in die Sensebox stecken | ||
#Sensebox an neuem Ort aufstellen | #Sensebox an neuem Ort aufstellen |
Version vom 14. März 2020, 13:49 Uhr
Beschreibung der Unterrichtsreihe
Thematik und grobe Beschreibung der Aufgaben/Schritte der Unterrichtsreihe
In dieser Unterrichtsreihe führen die SuS eine Umweltanalyse auf Grundlage einer eigenen Fragestellung durch. Dabei sammeln sie 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
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 von Datenmengen kennen.
- können Erfahrungen in der datengetriebenen Analyse unserer Umwelt sammeln und wie diese das eigene Leben beeinflussen kann.
- lernen, gesammelte Daten und durchgeführte Datenanalysen im Kontext der Realwelt und deren Umständen zu reflektieren.
Falls die Sensebox von den SuS selbst programmiert wird:
- lernen Software und Hardware rund um Arduino kennen.
- machen erste Erfahrungen in der Programmierung von Arduinos.
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:
- über eine "Block-Sprache" auf der Blockly-Programmierwebsite
- ü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:
- Schritt 1: Software Installation
- Schritt 2: Board-Support-Package installieren
- Schritt 3: Anschluss und Verkabelung
- Schritt 4: Programmierung und Komponententest
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:
|
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:
|
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, 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) |
|
Unterrichtsgespräch | Projektplakat |
Erarbeitung
(45 min) |
Die SuS arbeiten
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) |
|
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
- Lernkarten zur Sensebox
- Projektübersicht der Feinstaubmessstation
- Blockly-Programmierwebsite
- Download der Arduino-Software
- Jupyter Notebook "Phase 0: Fragestellung erarbeiten"
- Kartenprogramm
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:<syntaxhighlight lang="python3"> value,createdAt,longitude,latitude,hight 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 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.
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" + "," + "timestamp" + "," + "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" + "," + "timestamp" + "," + "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" + "," + "timestamp" + "," + "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.
Die auskommentierten Zeilen 26-29 sowie 113-119 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.
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.
Nachdem das jeweilige Programm auf die Sensebox geladen wurde, können die Senseboxen aufgestellt werden.
Verlauf
Variante A (mit Programmierung der Sensebox)
Abschnitt | Inhalt | Methode | Material |
---|---|---|---|
Einstieg
(10 min) |
|
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
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
|
Gruppenarbeit | programmierte Senseboxen
mobile Akkus/ Stromversorgung |
Variante B (ohne Programmierung der Sensebox)
Abschnitt | Inhalt | Methode | Material |
---|---|---|---|
Einstieg
(15 min) |
|
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
|
Gruppenarbeit | programmierte Senseboxen
mobile Akkus/ Stromversorgung |
Benötigte Materialien
- Laptops/PCs
- Beispielhafte .csv-Datei:
- gemessene Temperatur am Münsteraner Ludgerikreisel (am 11.09.2019 zwischen 10:36 Uhr und 11:20)<syntaxhighlight line="1">
sensorID_temp, temp, timestamp, longitude, latitude, hight 5d5d1209953683001a3f93fb,23.02,2019-09-11T10:36:05.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,22.82,2019-09-11T10:37:05.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,22.51,2019-09-11T10:38:05.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,22.40,2019-09-11T10:39:05.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,22.35,2019-09-11T10:40:05.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,21.69,2019-09-11T10:41:05.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,21.35,2019-09-11T10:42:05.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,21.22,2019-09-11T10:43:05.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,21.37,2019-09-11T10:44:06.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,21.92,2019-09-11T10:45:06.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,22.70,2019-09-11T10:46:06.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,23.39,2019-09-11T10:47:06.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,23.69,2019-09-11T10:48:06.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,24.32,2019-09-11T10:49:06.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,24.67,2019-09-11T10:50:06.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,25.25,2019-09-11T10:51:06.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,25.79,2019-09-11T10:52:06.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,26.20,2019-09-11T10:53:06.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,26.63,2019-09-11T10:54:06.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.03,2019-09-11T10:55:06.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.32,2019-09-11T10:56:07.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.22,2019-09-11T10:57:07.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.39,2019-09-11T10:58:07.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.75,2019-09-11T10:59:07.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.55,2019-09-11T11:00:07.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.47,2019-09-11T11:01:07.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.63,2019-09-11T11:02:07.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.60,2019-09-11T11:03:07.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.74,2019-09-11T11:04:07.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.88,2019-09-11T11:05:07.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.65,2019-09-11T11:06:07.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.82,2019-09-11T11:07:08.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,28.14,2019-09-11T11:08:08.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.94,2019-09-11T11:09:08.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.82,2019-09-11T11:10:08.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,27.93,2019-09-11T11:11:08.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,28.11,2019-09-11T11:12:08.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,28.52,2019-09-11T11:13:08.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,28.51,2019-09-11T11:14:08.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,28.81,2019-09-11T11:15:08.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,29.06,2019-09-11T11:16:08.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,29.12,2019-09-11T11:17:08.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,29.11,2019-09-11T11:18:08.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,28.80,2019-09-11T11:19:09.000Z,7.63,51.96,60.00 5d5d1209953683001a3f93fb,28.36,2019-09-11T11:20:09.000Z,7.63,51.96,60.00 </syntaxhighlight>
- fertiges Sensebox-Programm (siehe oben)
- Download der Arduino-Software
- Blockly-Programmierwebsite
- Senseboxen
- mobile Akkus/Stromversorgung
- Kartenprogramm
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:
- 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.
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 dem entsprechenden Grenzwert entsprechen), eine Gerade für Grenzwerte in eine Grafik an Messwerten einzeichnen.
Generell ist es hierbei sinnvoll, dass die Gruppen sich die Aufgaben zur Präsentationserstellung 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.
ACHTUNG: Nach jeder Unterrichtsstunde/-einheit sollten die SuS ihre bereits erhaltenen Grafiken und Analysen sichern, da die Notebooks aktuell noch nicht auf dem Server gespeichert werden können.
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 könnten sein:
|
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 zu analysieren. Dabei erstellen sie Screenshots bzw. notieren sich Analyseergebnisse. Sie können die Jupyter Notebooks auch adaptieren, müssen dabei jedoch darauf achten, dass sie nach jeder Unterrichtseinheit alle Ergebnisse als Screenshots speichern, da die Notebooks aktuell noch nicht auf dem Server gespeichert werden können. |
Gruppenarbeit -
dabei unterteilt in Einzel/Partnerarbeit |
Jupyter Notebooks
"Phase 1 und 2 Daten einlesen" "Phase 3 Datenvisualisierung" |
Benötigte Materialien
- ggf. Kartenprogramm
- ggf. Poster
- Laptops/PCs
- ggf. PowerPoint/LibreOffice,...
- Jupyter Notebooks "Phase 1 und 2 Daten einlesen", "Phase 3 Datenvisualisierung"
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. |
Plenum oder
Einzelarbeit |
Benötigte Materialien
- Laptops/PCs
- Poster/PowerPoint/LibreOffice/...
- Jupyter Notebooks zum Zeigen der Ergebnisse