Prof. Dr. Sebastian Zug, Technische Universität Bergakademie Freiberg
Die interaktive Ansicht dieses Kurses ist unter folgendem Link verfügbar.
https://github.com/liaScript/ArduinoEinstieg/blob/master/3day_workshop.md
Thema Wetterstation - Worum geht es eigentlich?
vgl. Link
<iframe name="ngram_chart" src="https://books.google.com/ngrams/interactive_chart?content=Wetterstation%2C+Wetter&year_start=1800&year_end=2000&corpus=8&smoothing=3&share=&direct_url=t1%3B%2CWetterstation%3B%2Cc0%3B.t1%3B%2CWetter%3B%2Cc0" width=100% height=350 marginwidth=0 marginheight=0 hspace=0 vspace=0 frameborder=0 scrolling=no></iframe> <iframe name="ngram_chart" src="https://books.google.com/ngrams/interactive_chart?content=Wetterstation&year_start=1800&year_end=2000&corpus=8&smoothing=3&share=&direct_url=t1%3B%2CWetterstation%3B%2Cc0" width=100% height=350 marginwidth=0 marginheight=0 hspace=0 vspace=0 frameborder=0 scrolling=no></iframe>Seit wann ist das Thema aktuell?
Was wollen wir (Stöber/Zug) vermitteln?
- Technische Hintergründe
- Methodische Vorgehensweise
- Interaktion im Team
Was erwarten Sie von der Veranstaltung?
- ????
Klima vs. Wetter
Wetter | Klima |
---|---|
... bezeichnet man den spürbaren, kurzfristigen Zustand der Atmosphäre an einem bestimmten Ort der Erdoberfläche, der unter anderem als Sonnenschein, Bewölkung, Regen, Wind, Hitze oder Kälte in Erscheinung tritt. | ...versteht man dagegen das durchschnittliche Wetter einschließlich seiner Extremwerte über einen längeren Zeitraum an einem bestimmten Ort. |
Physikalisch lässt sich ein Wetter durch thermodynamische Zustandsgrößen wie etwa Druck, Temperatur, Dichte beschreiben und messtechnisch erfassen. | Klima" ist also nirgendwo direkt messbar, sondern eine Statistik aus vielen Messungen. Der Zeitraum muss groß genug für die Bildung eines statistischen Mittelwertes sein. |
Falls die Klimavariablen, d.h. Temperatur, Niederschlag, Wind, Verdunstung usw., um einen langjährigen Mittelwert schwanken, bleibt das Klima stabil. Wenn sich der Mittelwert und die Variabilität der Extreme erkennbar verändern, liegt eine Klimaänderung vor.
Was heißt das für Doberlug-Kirchhain konkret:
Quelle: Deutscher Wetterdienst 23. August 2019
Link
Wo kommen die Daten denn her
... Temperatur zum Beispiel mittels:
Messmittel | Gerät |
---|---|
Quecksilberthermometer | ![]() |
Heißleiter | ![]() |
IR-Thermometer | ![]() |
Was heißt das überhaupt "Messen"?
Seid wann gibt es Wetteraufzeichnungen, was ist die längste ununterbrochene Messreihe?
Die professionelle und systematische Erfassung von Wetterdaten begann jedoch erst 1781 durch die Societas Meteorologica Palatina am Observatorium Hohenpeißenberg in Bayern, Deutschland. Die damals verwendeten „Mannheimer Stunden“, 7, 14, 21 Uhr mittlerer Ortszeit, entsprechen den bis heute noch üblichen Klimabeobachtungsterminen. Diese Datenreihe wird bis heute ununterbrochen weitergeführt und ist damit die älteste und längste Wetteraufzeichnung der Welt. Spricht man heute von „seit dem Beginn der Wetteraufzeichnung“ so ist damit maximal der Zeitraum ab 1781 gemeint. In manchen Regionen aber auch viel kürzere Zeiträume von lediglich einigen Jahrzehnten.
Die Wetterdaten werden heute über ein Netz von Messstationen (Messnetz) erfasst, die über die ganze Welt verteilt sind. Im Bundesgebiet registrieren
- der staatlichen Deutschen Wetterdienst (DWD)
- der Geoinfomationsdienst der Bundeswehr (GeoInfoDBw) und
- private Wetterdienste
eigene Daten. Das Messnetz des DWD besteht aus 178 hauptamtlichen Stationen, der GeoInfoDBw unterhält eines mit 34 Stationen.
Beispiel einer automatischen Wetterstation (Quelle: Deutscher Wetterdienst unter Link)
Was kann man damit anstellen?
Demo zur Analyse der Daten der Station Cottbus
Warum also noch selbst messen?
{{0}}
Gruppe I - Der Mikrocontroller gibt die Daten verschiedener Umweltsensoren auf der serielle Schnittstelle aus, wir kopieren diese in eine Tabellenkalkulation und werten sie aus.
Sprint-Ziele - Gruppe I
-
Dienstag Nachmittag: Auslesen des Helligkeitssensors und des Wettersensors mit Ausgabe auf dem Bildschirm
-
Mittwoch Vormittag: Löten und Integration des Displays, Verschönerung der Ausgabe
-
Mittwoch Nachmittag: Testen der Aufzeichnung, Vorverarbeitung der Daten mit Excel, Start der 24 Stunden Messung
-
Donnerstag: Vorbereitung eines Diagramms, dass die Abweichung der Daten illustriert
{{1}}
Gruppe II - Wir realisieren mit redundanten Sensoren einen Cloud-basierten Wetterdienst mit einer zugehörigen App
Sprint-Ziele - Gruppe II
-
Dienstag Nachmittag: Publikation der Helligkeitsdaten in einen Thinkspeak Kanal, Handy App mit Anweisungen zur Installation aktiv
-
Mittwoch Vormittag: Integration des DHT11 und des Bosch 680 Sensors in den Aufbau, Beginn der Lötarbeiten
-
Mittwoch Nachmittag: Fertigstellung der integrierten Lösung, 24-Stunden Messungen
-
Donnerstag: Auswertung der Daten, Visualisierung unter Python/ Matlab
{{2}}
Was heißt das eigentlich "Eingebettetes System"?
{{1-2}}
... ein elektronischer Rechner ..., der in einen technischen Kontext eingebunden ist. Dabei übernimmt der (Kleinst-)Rechner entweder Überwachungs-, Steuerungs- oder Regelfunktionen ... weitestgehend unsichtbar für den Benutzer .. [nach Wikipedia "Eingebettete Systeme"].
Wie programmiere ich einen Mikrocontroller?
{{2-3}}
Compiler wird eine Software genannt, die einen in einer Programmiersprache geschrieben Quellcode so übersetzt, dass sie von Maschinen verstanden werden können.
Was ist das Arduino Projekt?
{{3}}
Arduino ist eine aus Soft- und Hardware bestehende Physical-Computing-Plattform. Beide Komponenten sind im Sinne von Open Source quelloffen. Die Hardware besteht aus einem einfachen E/A-Board mit einem Mikrocontroller und analogen und digitalen Ein- und Ausgängen.
[^3] aus entsprechendem Artikel "Spiegel Online" http://www.spiegel.de/netzwelt/gadgets/arduino-erklaert-das-kann-der-microcontroller-a-1105328.html
Womit haben wir es zu tuen?
Quelle: Webseite des Herstellers
Arduino nutzt eine C/C++ Semantik für die Programmierung, die folgende Grundelemente bedient
- Alle Anweisungen enden mit einem
;
- Variabeln sind typbehaftet (
int
,char
,float
, etc.) - wichtige Schlüsselwörter sind
for
,if
,while
, etc. - Kommentare werden durch
//
eingeleitet
Unter 2.4 folgen einige Beispiele für den Gebrauch der Schleifen und Verzweigungen.
Jedes Arduinoprogramm umfasst 2 grundlegende Funktionen setup()
und loop()
.
const int ledPin = 13;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin ledPin as an output.
pinMode(ledPin, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(ledPin, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(ledPin, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Wichtige Grundeinstellungen:
- Richtigen Port für den Programmiervorgang auswählen (Tools -> Port)
- Richtigen Controller auswählen (Tools -> Board)
- Richtige Baudrate für die Serielle Schnittstellen
Und jetzt sind Sie dran!
Laden Sie das Beispielprogramm "Blink" in Ihren Editor:
Datei -> Beispiele -> Basics -> Blink
Kompilieren und flashen Sie das Programm! Wichtige Tastaturbefehle sind dabei
Tastenkombination | Bedeutung |
---|---|
Strg-R | Kompilieren (VeRify) |
Strg-U | Flashend (Upload) |
Strg-T | Code korrekt einrücken |
Strg-Shift-M | Seriellen Monitor öffnen |
Strg-L | Cursor auf Zeile setzen |
{{0-1}}
Was fehlt? Ich möchte irgendwie in den Rechner schauen können :-)
Die Serielle Schnittstelle (häufig auch als UART) bezeichnet ermöglicht das Versenden und den Empfang von Textnachrichten. Damit können Sie zum Beispiel Messwerte ausgeben oder das Erreichen bestimmter Programmpositionen anzeigen.
Die folgenden Beispiele vermitteln grundlegende Programmierkonstrukte in C++. Anhand des NetSwarm Simulator können diese ausgeführt werden. Achtung, bis auf die Serielle Schnittstelle können keine weiteren Funktionalitäten genutzt werden!
void setup() {
Serial.begin(9600);
Serial.println("Hello World");
}
void loop() {
}
@NetSwarm.single_loop
Arduino kennt zwei Varianten der Ausgabe mit print
- das einfache print
und println
. Welchen Unterschied vermuten Sie?
{{1-2}}
Schleifen
Was müssen wir tuen, um die Zahlen von 1 bis 10 auf dem Terminal anzuzeigen?
void setup() {
Serial.begin(9600);
int counter = 0;
for (int i = 0; i < 10; i++){
Serial.println(counter);
counter = counter + 1;
}
}
void loop() {
}
@NetSwarm.single_loop
Welche "Einsparmöglichkeiten" sehen Sie als erfahrener Programmierer in dem Beispiel? Wie kann der Code, mit der gleichen Ausgabe kürzer gestaltet werden?
{{2-3}}
Verzweigungen
Verzweigungen folgen dem Muster
if (Bedingung) {
// Anweisungen
}
else{
// Anweisungen
}
wobei der else
Abschnitt optional ist.
void setup() {
Serial.begin(9600);
float value = 5.234;
Serial.print(value);
if (value > 10){
Serial.println(" - Der Wert ist größer als 10!");
}else{
Serial.println(" - Der Wert ist kleiner als 10!");
}
}
void loop() {
}
@NetSwarm.single_loop
{{3-4}}
Bedingungen werden dabei wie folgt formuliert:
void setup() {
Serial.begin(9600);
int a = 2;
if (a == 2) {Serial.println("a ist gleich zwei!");}
if (a <= 5) {Serial.println("a ist kleiner oder gleich fünf!");}
if (a != 3) {Serial.println("a ist ungleich drei!");}
char b = 'g';
if (b == 'z') {Serial.println("In b ist ein z gespeichert!");}
else {Serial.println("In b ist kein z gespeichert!");}
}
void loop() {
}
@NetSwarm.single_loop
Für die Ausgabe von komplexeren, vorformatierten Ausdrücken können Sie auf einen
Befehl aus der C++ Standard-Bibliothek zurückgreifen sprintf
Eine anschauliche Dokumentation findet sich unter: link
Aufgabe: Schreiben Sie einen Code, der das SOS Morsesignal über die Led ausgibt!
Welche Anpassungen sind dafür notwendig?
const int ledPin = 13;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin ledPin as an output.
pinMode(ledPin, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(ledPin, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(ledPin, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
-
Webseiten des Wiki des Herstellers https://www.elegoo.com/
-
Referenzübersicht Arduino
-
deutsch (unvollständig) https://www.arduino.cc/reference/de/
-
englisch https://www.arduino.cc/reference/en/
-
{{0-3}}
-> Demo: Hello World Programm
(Serielle Schnittstelle und LED anschalten)
{{1-3}}
Aufgabe: Schreiben Sie einen Code, der die Zahlen von 0 bis 9 über die serielle Schnittstelle ausgibt.
{{2-3}}
// Loesung
void setup() {
Serial.begin(57600);
for (int counter=0; counter < 10; counter++) {
Serial.print(counter);
}
}
void loop() {
}
{{3-6}}
-> Demo: Vorführung Erfassen von Zeichen
{{4-6}}
Aufgabe: Erweitern Sie den Code, so dass wir die LED über 'A' an- und 'B' ausschalten können.
{{5-6}}
// Loesung
void loop() {
if (Serial.available() > 0) {
incomingByte = Serial.read();
Serial.write(incomingByte);
if (incomingByte == 'A'){
Serial.println("An");
digitalWrite(13, HIGH);
}
if (incomingByte == 'B'){
digitalWrite(13, LOW);
Serial.println("Aus");
}
}
}
Langweilig ... ! Das ist doch kein echtes eingebettetes System!
Aufgabe: Der Taster schaltet die LED ein und nach 3 Sekunden geht sie von selbst wieder aus.
Es wird ernst! Wir müssen den Taster elektrisch mit dem Board verbinden. Anweisungen unter ...
Quelle: https://www.arduino.cc/en/tutorial/button
Eine anschauliche deutsche Erklärung findet sich unter https://arduino2016blog.wordpress.com/tutorials/taster/
Verwenden Sie einen 1KOhm Wiederstand bei dieser Aufgabe. Beachten Sie, dass Sie die blaue Leitung auf alle digitalen und analogen Eingänge des Controlers führen können.
{{1}}
// constants won't change. They're used here to set pin numbers:
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void loop() {
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn LED on:
digitalWrite(ledPin, HIGH);
} else {
// turn LED off:
digitalWrite(ledPin, LOW);
}
}
Aufgabe: Geben Sie den Zustand der Led (an oder aus) auf der seriellen Schnittstelle aus.
Langweilig ... ! Wir wollen einen echten Sensor!
Aufgabe: Integrieren Sie eine Fotozelle in Ihren Schaltkreis!
Quelle: Adafruit-Webseite Link
Recherchieren Sie dazu, wie sie aus analoge Werte am Arduino einlesen können. Verwenden Sie einen 1KOhm Wiederstand bei dieser Aufgabe.
Eine gute Einführung bietet das Tutorial von Adi Dax auf youtube:
Aufgabe: Geben Sie den Helligkeitswert auf seriellen Schnittstelle aus.
Immer noch langweilig ... ! Wir wollen mehr Sensoren!
Aufgabe: Lesen Sie in Lektion 12 nach, wie sie den Temperatur- und Luftfeuchtigkeitssensor DHT11 in Betrieb nehmen können. Geben Sie die Werte auf der Seriellen Schnittestelle aus.
Sie werden nicht mit dem 8-bit Controller auf dem Uno-Board arbeiten sondern mit einem MKR1000.
Aufgabe 1: Recherchieren Sie, welche Features dieses Board gegenüber dem einfachen Controller bietet. Nehmen Sie das System mit dem üblichen Arduion Blink-Beispiel in Betrieb.
Damit wir den MKR1000 mit der Arduino-IDE programmieren können, muss zunächst das Board hinzufügt werden. Unter Werkzeuge -> Board -> Boardverwalter nach „Arduino SAMD Boards (32-bits ARM Cortex-M0+) by Arduino suchen und die aktuelle Version installieren.
Hinzu kommen noch weitere Bibliotheken
Name | Bedeutung |
---|---|
WiFi101 |
Netzwerkstack für den Mikrocontroller |
SimpleDHT |
Treiberbiblothek für den Temperatursensor |
Thinkspeak |
Zugriff auf die API von Thinkspeak.com |
Gehen Sie dazu auf Sketch -> Bibliothek einbinden -> Bibliotheken verwalten und installiere jeweils die neueste Version der beiden Libraries.
Wenn Sie später die Fehlermeldung
WiFi101.h: No such file or directory
sehen, wurde dieser Schritt nicht korrekt umgesetzt.
Achtung: Der Controller benötigt einige Zeit um die Serielle Schnittstelle zu initalisieren! Dafür ist ein Warten nach der Konfiguration notwendig!
void setup() {
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Week for Future - Data logger");
}
void loop() {
}
Aufgabe 2: Integrieren Sie eine Fotozelle zur Erfassung der Helligkeit in Ihr System. Geben Sie die Daten über die Serielle Schnittstelle aus.
Quelle: Adafruit-Webseite Link
Recherchieren Sie dazu, wie sie aus analoge Werte am Arduino einlesen können. Verwenden Sie einen 1KOhm Wiederstand bei dieser Aufgabe.
Eine gute Einführung bietet das Tutorial von Adi Dax auf youtube:
Aufgabe 3: Legen Sie sich einen Thinkspeak-Account an, der unterschiedliche Kanäle (Team I, Team II) umfasst. Schreiben Sie die Zugangsdaten (Accountname, Kanal-IDs an die Tafel). Testen Sie den Account mit einem Python-Programm ähnlich dem folgenden:
# Beispielskript für das Senden eines Eintrages an Thinkspeak. Über weitere Angaben in der URL können auch zusätzliche Felder geschrieben werdne.
import sys
import urllib2
value = 100
baseURL = "http://api.thingspeak.com/update?api_key=YOUR_API_KEY&field1="
f = urllib2.urlopen(baseURL +str(100))
f.read()
f.close()
print "Program has ended"
Aufgabe 4: Aktivieren Sie den WLAN Kanal des Arduino Zero!
Achtung: Bauen Sie die Verbindung immer erst auf, wenn Sie Daten senden wollen. Eine permanente Verbindung mit dem Netz kostet Strom! Zudem geht der WLAN Controller irgendwann in einen Stand-By Mode!
Ein Beispielprogramm finden Sie unter:
https://github.com/liaScript/ArduinoEinstieg/tree/master/CodeExamples/WeekForFuture
Aufgabe 2: Informieren Sie sich über den Temperatur- und Luftfeuchtigkeitssensor DHT11. Bauen Sie eine Schaltung mit diesem Sensor auf, geben Sie die Werte auf der seriellen Schnittestelle aus.
Quelle: Arduino Tutorials Link
Verwenden Sie einen 10kOhm Wiederstand, warum ist dieser notwendig?
Ein Beispielcode für das Einlesen und die Ausgabe der Werte finden Sie unter folgendem Link