Kapazitiver Bodenfeuchtesensor: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
 
(195 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 15: Zeile 15:


== Einführung ==
== Einführung ==
In der Lehrveranstaltung ''Angewandte Informatik'' ist als Prüfungsleistung eine semesterbegleitende Arbeit vorgesehen. Dieses Kapitel behandelt den Einsatz des Capacitive Soil Moisture Sensor v1.2 zur Bestimmung der Bodenfeuchtigkeit. Für die Durchführung dieser Arbeit sind Kenntnisse im Bereich von Microcontrollern, Sensoren, Aktuatoren sowie im Umgang mit MATLAB<sup>®</sup>/Simulink erforderlich. Des Weiteren sind Kenntnisse im Bereich der Signalverarbeitung und Filterung notwendig, um dieses Projekt durchzuführen. Die Funktionsweise des Sensors und die Umsetzung der Fragestellung wird im Folgenden Kapitel genauer erläutert.
=== Aufgabenstellung ===
=== Aufgabenstellung ===
Messen Sie die Bodenfeuchte mittels Membransensor.
Messen Sie die Bodenfeuchte mittels Capacitive Soil Moisture Sensor v1.2.
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Anforderungen&thinsp;</strong>
| <strong>Anforderungen&thinsp;</strong>
Zeile 26: Zeile 27:
! Req. !! Beschreibung !! Priorität
! Req. !! Beschreibung !! Priorität
|-
|-
| 1 || Die Bodenfeuchte muss mittels "Capacitive Soil Moisturr Sensor v1.2, Arduino und Simulink gemessen werden.|| 1
| 1 || Die Bodenfeuchte muss mittels "Capacitive Soil Moisture Sensor v1.2", Arduino und Simulink gemessen werden.|| 1
|-
|-
| 2 || Der Messbereich muss bestimmt werden. || 1
| 2 || Der Messbereich muss bestimmt werden. || 1
Zeile 34: Zeile 35:
| 4 || Der Sensor muss kalibriert werden. || 1
| 4 || Der Sensor muss kalibriert werden. || 1
|-
|-
| 5 || Für den Messbereich muss die Kraft referenziert werden. || 1
| 5 || Für den Messbereich muss die Bodenfeuchtigkeit referenziert werden. || 1
|-
|-
| 6 || Die Messwerte müssen über der Zeit gefiltert werden.  || 1
| 6 || Die Messwerte müssen über der Zeit gefiltert werden.  || 1
Zeile 40: Zeile 41:
| 7 || Ein Piepton muss anzeigen, wenn der Messwert stabil/konstant ist. || 1
| 7 || Ein Piepton muss anzeigen, wenn der Messwert stabil/konstant ist. || 1
|-
|-
| 8 || Das Sensorsystem muss die Bodenfeuchte in % auf dem [[LCD_Modul_16x02_I2C|LCD-Display]] anzeigen. || 2
| 8 || Das Sensorsystem muss die Bodenfeuchte in % auf dem [[LCD_Modul_16x02_I2C|LC-Display]] anzeigen. || 2
|}
|}
|}
|}


*'''Thema/Fragestellung:''' Messung der Entfernung mit dem Sensor Sharp GP2-0430K
'''Thema/Fragestellung:''' <br>
*'''Hypothese:''' Die Entfernung lässt sich im Bereich von 4&thinsp;cm bis 50&thinsp;cm fehlerfrei messen.
Messung der Bodenfeuchtigkeit mit dem Sensor Capacitive Soil Moisture Sensor v1.2. <br>
* '''Einordnung in den Lehrplan'''
'''Hypothese:''' <br>
Die Bodenfeuchtigkeit lässt sich mit dem Capacitive Soil Moisture Sensor v1.2 messen.<br>
'''Einordnung in den Lehrplan: ''' <br>
Die Lehrveranstaltung ''Angewandte Informatik'' vermittelt den Studierenden mehrere praktische Methoden, welche im Folgenden aufgelistet sind: <br>
*mit der Versionskontrolle SVN nachhaltig Quelltext entsprechend der Programmierrichtlinien schreiben, sichern, kollaboriert bearbeiten und Konflikte lösen.
*in einer mathematisch orientierten Systax (z.&#8239;B. MATLAB<sup>®</sup>) mit Vektoren und Matrizen rechnen, Programmteile in Funktionen auslagern, Zweige und Scheifen programmieren, Daten importieren und visualisieren.
*die Mikrocontrollerplattform Arduino modellbasiert mit Simulink programmieren, so dass Sensoren eingelesen und Aktoren angesteurt werden können. [[#Literatur|<sup>[1]</sup>]] <br>


== Projektbeschreibung ==
== Projektbeschreibung ==
In der unteren Tabelle 2 sind alle benötigten Materialien für diese Versuchsdurchführung aufgelistet. <br>
{| class="wikitable"
{| class="wikitable"
|+ style = "text-align: left"|Tabelle 2: Materialliste
|+ style = "text-align: left"|Tabelle 2: Materialliste
Zeile 60: Zeile 68:
| 3  || 1 || Arduino Uno R3
| 3  || 1 || Arduino Uno R3
|-
|-
| 4 || 1 || Streckbrett
| 4 || 1 || Steckbrett
|-
|-
| 5 || 5 || Jumper Kabel, männlich/männlich, 20 cm
| 5 || 1 || LCD Modul 16x02 I<sup>2</sup>C
|-
| 6 || 1 || Buzzer
|-
| 7 || 8 || Jumper Kabel, männlich/männlich, 20 cm
|}
|}
Beschreibung Funktionsweise der verwendeten Hard- und Software
===Beschreibung Funktionsweise der verwendeten Hard- und Software===
* Arduino Uno R3
'''Simulink R2023b ''' <br>
* Sensor Kapazitiver Bodenfeuchtesensor
Für die Ausführung von Simulink wird die Software MATLAB<sup>®</sup> benötigt. Beide Softwares sind von The MathWorks. Über Simulink lassen sich mithilfe von Blockschaltbilder technische Systeme simulieren, testen und realisieren. Simulink wird für die Simulation von technischen Regelkreisen oder aber für die Signalverarbeitung verwendet. [[#Literatur|<sup>[2]</sup>]] <br>
* Simulink R2023b
 
'''Sensor Kapazitiver Bodenfeuchtesensor ''' <br>
[[Datei:KapFeuchtesensor.jpg|thumb|right|200px|Abb. 2: Kapazitiver Bodenfeuchtesensor]]
Bei der kapazitiven Messung der Feuchtigkeit wird das Verfahren der indirekten Messung angewendet. Das gemessen Signal wird in eine elektrische Größe umgewandelt und an das Microcontroller-Board ausgegeben.
Der kapazitive Feuchtigkeitssensor arbeitet auf Basis eines Kondensators. Zwischen den Platten des Kondensators ist ein elektrisches Feld aufgebaut, welches je nach Spannung und Abstand variiert. Die Speicherung von elektrischer Energie wird beim Kondensator Kapazität genannt und in Farad angegeben. Diese Kapazität wird durch den Abstand der Platten zueinander, der Fläche dieser Platten und des Dielektrikums bestimmt. Das Dielektrikum beschreibt das Material, welches zwischen den beiden Platten ist. Die Materialien haben unterschiedliche Isolationseigenschaften, wodurch auch unterschiedliche Durchlässigkeiten des elektrischen Feldes vorhanden sind. Diese Durchlässigkeit wird als Permittivität bezeichnet.
Da bei einem kapazitiven Feuchtigkeitssensor der Abstand der beiden Kondensatorplatten unveränderbar ist, wird die Feuchtigkeit lediglich über die Änderung der Permittivität bestimmt. In Abbildung 2 ist der Sensor zu sehen. [[#Literatur|<sup>[3]</sup>]] <br>
<br clear = all>
 
'''Arduino Uno R3 ''' <br>
[[Datei:Arduino Uno R3.jpg|thumb|right|200px|Abb. 3: Arduino Uno R3]]
Der Arduino Uno R3 ist ein Microcontroller-Board, welches aus 14 digitalen I/O Pins und sechs analogen I/O Pins besteht. Von den 14 digitalen I/Os können sechs ein PWM-Signal erzeugen. Verschiedene Arten von Sensoren und Aktuatoren können mit dem Arduino Uno R3 Board verbunden werden, wodurch eine Vielzahl von Einsatzmöglichkeiten entstehen. In Abbildung 3 ist der Arduino Uno R3 zu sehen. [[#Literatur|<sup>[4]</sup>]] <br>
<br clear = all>
 
'''Steckbrett ''' <br>
[[Datei:Steckbrett1.png|thumb|right|200px|Abb. 4: Steckbrett]]
Ein Steckbrett eignet sich zum schnellen Aufbau einer elektrischen Schaltung. Dadurch, dass die Bauteile nur gesteckt werden, können diese einfach umgesteckt werden. Somit lässt sich der Aufbau schnell und einfach überarbeiten und verbessern. Die äußeren Reihen dienen des Anschlusses der Versorgungsspannung und der Verbindung zu Ground. In den mittleren Reihen können die Bauteile gesteckt werden. In Abbildung 4 ist ein Steckbrett zu sehen. [[#Literatur|<sup>[5]</sup>]]<br>
<br clear = all>
 
'''LCD Modul 16x02 I<sup>2</sup>C ''' <br>
[[Datei:LCD HD44780.jpg|thumb|right|200px|Abb. 5: LCD Modul 16x02 I<sup>2</sup>C]]
Das LCD-Modul 16x2 I<sup>2</sup>C zeigt Text in zwei Zeilen mit je 16 Zeichen an und nutzt die I<sup>2</sup>C-Schnittstelle. Dadurch sind nur zwei Datenleitungen nötig: SDA (für Daten) und SCL (für den Takt), sowie VCC (Spannungsversorgung) und GND (Masse). Der Mikrocontroller überträgt die Daten seriell an das Modul, meist mit der I<sup>2</sup>C-Adresse 0x27 oder 0x3F. Die I<sup>2</sup>C-Verbindung vereinfacht die Kommunikation und reduziert den Verkabelungsaufwand. In Abbildung 5 ist das LCD Modul 16x02 I<sup>2</sup>C zu sehen. [[#Literatur|<sup>[6]</sup>]]
<br clear = all>
 
'''Buzzer ''' <br>
[[Datei:R6-B-0-1.jpg|thumb|right|200px|Abb. 6: Piezo-Lautsprecher]]
Ein Piezo-Lautsprecher nutzt Piezoelektrizität zur Schallerzeugung. Piezoelektrische Materialien erzeugen bei mechanischer Verformung eine elektrische Ladung und umgekehrt. Durch Anlegen einer Spannung an ein dünnes Piezoelement dehnt es sich aus und zieht sich zusammen, wodurch Schallwellen erzeugt werden. Ein Piezo-Lautsprecher kann aus 5V Gleichspannung Wechselstrom erzeugen, der das Piezoelement periodisch verformt und so Schall erzeugt. In Abbildung 6 ist der Buzzer zu sehen.[[#Literatur|<sup>[7]</sup>]]
<br clear = all>
 
=== Funktionsweise Capacitive Soil Moisture Sensor v1.2 ===
[[Datei:SchaltplanKapazitiverFeuchtigkeitssensor.jpg|400px|thumb|right|Abb. 7: Schaltplan Capacitive Soil Moisture Sensor (v1.2) [[#Literatur|<sup>[8]</sup>]]]]
Der in Abbildung 7 dargestellte Schaltplan ist der des kapazitiven Bodenfeuchtigkeitssensors. Dieser misst die Änderung der Kapazität des sich zwischen den Kondensatorplatten befindenden Materials. Über eine TLC555-Timer-IC wird ein kontinuierliches Rechtecksignal mit einer Frequenz von etwa 1,5 MHz erzeugt. <br>
 
Der Sensor verändert seine Kapazität basierend auf der Bodenfeuchtigkeit. Je feuchter der Boden ist, desto länger dauert es diesen Kondensator zu laden und entladen. Die dafür benötigte Zeit wird von dem Sensor gemessen. <br>
 
Diese analoge Spannung kann von einem Mikrocontroller ausgelesen werden, um die Bodenfeuchtigkeit zu bestimmen. Die Versorgungsspannung der Schaltung beträgt 3,3 V bis 5 V.[[#Literatur|<sup>[8],[9]</sup>]]
 
==== Technische Daten ====
In dieser Tabelle sind grundlegende technische Daten des Sensors aufgelistet.<br>


=== Technische Daten ===
{| class="wikitable"
{| class="wikitable"
|-
|+ style = "text-align: left"|Tabelle 3: Technische Daten des Capacitive Soil Moisture Sensor v1.2 [[#Literatur|<sup>[10]</sup>]]
|-  
|-  
| Messbereich || 0&thinsp;% .. 100&thinsp;%
| Messbereich || 0&thinsp;V ~ 3&thinsp;V
|-  
|-  
| PWM-Modulation || analog
| Reaktionszeit|| ca. 7000&thinsp;ms
|-
| PWM-Pulszykluszeit || 20&thinsp;ms
|-
| PWM-Pulsweite || 500-2400&thinsp;ms
|-  
|-  
| Versorgungsspannung || 3.3&thinsp;V ~ 5.5&thinsp;V
| Versorgungsspannung || 3.3&thinsp;V ~ 5.5&thinsp;V
|-  
|-  
| Versorgungsstrom || 5&thinsp;mA
| Versorgungsstrom || 5&thinsp;mA
|-
| Schnittstelle || PH2.0-3P Steckkabel
|-  
|-  
| Gewicht || 10&thinsp;g
| Gewicht || 10&thinsp;g
|-  
|-  
| Material|| korrosionsbeständiges Material
| Material|| korrosionsbeständiges Material
|-
| Arbeitstemperatur || 0&thinsp;°C .. +55&thinsp;°C
|-  
|-  
| Abmessungen|| 98&thinsp;mm x 23&thinsp;mm x 9&thinsp;mm
| Abmessungen|| 98&thinsp;mm x 23&thinsp;mm x 9&thinsp;mm
|}
|}


=== Pinbelegung ===
==== Pinbelegung ====
In dieser Tabelle ist die Pinbelegung des Sensors aufgelistet. <br>
{| class="wikitable"
{| class="wikitable"
|-
|+ style = "text-align: left"|Tabelle 4: Pinbelegung des Capacitive Soil Moisture Sensor v1.2 [[#Literatur|<sup>[11]</sup>]]
|-
! style="font-weight: bold;" | Pin
! style="font-weight: bold;" | Pin
! style="font-weight: bold;" | Belegung
! style="font-weight: bold;" | Belegung
! style="font-weight: bold;" | Signal
! style="font-weight: bold;" | Signal
! style="font-weight: bold;" | Arduino Pin
|-
|-
| 1 || Versorgungsspannung (VCC)  || 5&thinsp;V
| 1 || Versorgungsspannung (VCC)  || 5&thinsp;V || 5V
|-
|-
| 2 || Analog Output (AOUT)|| 0~3V  
| 2 || Analog Output (AOUT)|| 0~3V || A0
|-
|-
| 3 || Masse (GND)  || 0&thinsp;V
| 3 || Masse (GND)  || 0&thinsp;V || GND
|}
|}


== Versuchsaufbau und Durchführung ==
== Versuchsaufbau und Durchführung ==
=== Versuchsaufbau ===
=== Versuchsaufbau ===
[[Datei:Schaltplan Sharp.jpg|thumb|rigth|450px|Abb. 2: Schaltplan]]
Der Anschlussplan des Versuchs ist in der unteren Abbildung 8 dargestellt. Zu sehen ist ein Arduino Uno R3 Board, das mit einem kapazitiven Feuchtigkeitssensor und einem Buzzer verbunden ist. Zu beachten gilt, dass der gezeigte Feuchtigkeitssensor nicht identisch mit dem für den Versuch verwendeten Sensor ist, da in Fritzing nur ein kapazitiver Sensor mit drei Anschlüssen verfügbar ist.
[[Datei:Anschlussplan Sharp.png|thumb|rigth|450px|Abb. 3: Anschlussplan]]
 
[[Datei:Foto Sharp.png|thumb|rigth|450px|Abb. 4: Foto des Versuchsaufbaus]]
Auf dem Breadboard wird die Versorgungsspannung (VCC) von <math>5 \, \text{V}</math> über ein rotes Kabel angeschlossen, während das schwarze Kabel die Ground-Verbindung zum Arduino herstellt. Da der Sensor nur drei Anschlüsse hat, von denen zwei für die Spannungsversorgung und Ground verwendet werden, wird der letzte freie Anschluss des Sensors mit dem analogen Eingang A0 des Arduino verbunden. Der GND Pin des Buzzers wird mit GND auf dem Breadboard verbunden und der andere mit dem Digitalen Output 10, sodass über diesen Output der Buzzer ein Signal bekommt, sobald der Wert konstant ist.
Der Versuchsaufbau wird durch einen Schaltplan (Abb. 2), Anschlussplan (Abb. 3) und Foto des Aufbaus (Abb. 4) dokumentiert.
 
Anschließend wird der Arduino über ein USB-A Kabel mit dem Computer verbunden, um das in Simulink erstellte Modell hochladen zu können.
 
Die Schaltplanübersicht und ein Foto des Aufbaus sind in den Abbildungen 9 und 10 zu finden. <br>
<gallery widths="500" heights="250">
Datei:Anschlussplan Capacitive Soil Moisture Sensor v1.2.jpg|thumb|rigth|450px|Abb. 8: Anschlussplan
Datei:Schaltplan Capacitive Soil Moisture Sensor v1.2.jpg|thumb|center|450px|Abb. 9: Schaltplan
Datei:Versuchsaufbau Capacitive Soil Moisture Sensor v1.2..jpg|thumb|450px|Abb. 10: Foto des Versuchsaufbaus
</gallery>
<br>


=== Versuchsdurchführung ===
=== Versuchsdurchführung ===
[[Datei:Simulink Sharp.png|thumb|rigth|450px|Abb. 5: Simulink-Modell]]
==== Simulink Modell ====
Das Modell zur Datenverarbeitung wurde gemäß Abb. 5 in Simulink aufgebaut. Die Messdaten wurden aufgezeichnet. Ein Video der Versuchsdurchführung findet sich hier.
[[Datei:SimulinkModellCapacitive Soil Moisture Sensor v1.2..jpg|thumb|rigth|750px|Abb. 11: Simulink-Modell]]
Dieses Simulink-Modell dient der Ermittlung der Bodenfeuchtigkeit mithilfe eines kapazitiven Bodenfeuchtesensors v1.2 und wurde in Simulink R2023b implementiert. Das Simulink Support Package für Arduino Hardware wird für diesen Versuch benötigt.<br>
 
Zunächst wird das analoge Sensorsignal über den Pin A0 des Arduino aufgenommen und durch einen double Block geführt, um es in einen Gleitkommawert umzuwandeln. Anschließend wird das umgewandelte Signal durch einen Gain-Block (Multiplikation mit 5/1023) geführt, um den digitalen Wert in eine Spannung umzuwandeln. Diese Spannung wird danach durch ein Rekursives Gleitendes Mittelwert (RGM)-Filter gefiltert, um Ausreißer zu reduzieren.<br>
 
Das gefilterte Spannungssignal wird über einen weiteren Gain-Block geführt, um es wieder in einen digitalen Wert umzuwandeln. Ein MATLAB<sup>®</sup> Function Block berechnet dann aus diesem Digitalwert den entsprechenden Prozentwert der Bodenfeuchtigkeit. Die Spannungs- und Digitalwerte werden zudem an den Workspace ausgegeben, um die Unsicherheit im weiteren Verlauf berechnen zu können (über die Variablen out.Voltage und out.Digitalwert).<br>
 
Für die zuverlässige Ansteuerung des Buzzers wird der Mittelwert der letzten acht gefilterten Spannungswerte berechnet. Dieser Mittelwert wird mit einem konstanten Wert von 0,001 verglichen. Wenn der Mittelwert kleiner oder gleich 0,001 ist, wird das Signal über einen Digital Out Block an den Pin 10 des Arduino ausgegeben, um den Buzzer zu aktivieren. <br>


'''Modelleinstellungen:''' Arduino Uno, Solver: Fixed-step, discrete, Abtastrate: 0,001 s
Die '''Modelleinstellungen''' für diese Durchführung lauten wie folgt: <br>
● Hardware board: Arduino Uno <br>
● Type:  Fixed-step <br>
Solver: ode1 (Euler) <br>
Fixed-step Size: 0,001 s<br>
Das Simulink-Modell ist in der rechten Abbildung 11 dargestellt.
<br clear = all>
 
==== Mess- und Vertrauensbereich ====
Bevor die Versuchsdurchführung starten kann, muss der Messbereich des Sensors festgelegt werden.
Die Ermittlung des Messbereichs wurde mittels zweier Tests durchgeführt. Zunächst wurde der Sensor an einen Arduino angeschlossen und die Sensordaten im trockenen Zustand über 20 Sekunden ausgelesen. Anschließend wurde der Sensor vollständig in ein Glas Wasser eingetaucht, um die Messungen im nassen Zustand zu erfassen. Diese Tests ermöglichten es, die beiden Extremwerte der zumessenden Umgebung des Sensors zu ermitteln.
Der Test im trockenen Zustand repräsentiert <math>0 \, \text{%}</math> Feuchtigkeit. Der dabei ermittelte Digitalwert '''789''' wurde als Referenzwert für keine Feuchtigkeit gespeichert. Der Test im Wasserglas simulierte <math>100 \, \text{%}</math> Feuchtigkeit, sodass der entsprechende Digitalwert '''388''' als Referenzwert für maximale Feuchtigkeit hinterlegt werden konnte. Der untere MATLAB<sup>®</sup>-Code dient zur Berechnung der maximalen und minimalen Digitalwerte des Sensors. <br>
 
%% Berechnung des maximalen und minimalen Digitalwertes des Sensors
Max = max(DWert);  %% Den Maximalwert im Daten-Array finden
Min = min(DWert);  %% Den Minimalwert im Daten-Array finden
fprintf('Max Digitalwert: %.15f\n', Max); %% Darstellung Maximalwert
fprintf('Min Digitalwert: %.15f\n', Min); %% Darstellung Minimalwert
 
Um über diese beiden Werte nun den Messbereich des Sensors in Volt angeben zu können, wird folgende Formel benötigt:
 
<math>LSB = \frac{U_{ref}}{2^n - 1}</math> [[#Literatur|<sup>[12]</sup>]]<br>
<math>LSB:</math> Least Significant Bit <math>[\text{V}]</math> <br> 
<math>U_{ref}:</math> Referenzspannung <math>[\text{V}]</math> <br>
<math>n:</math> Quantisierungsstufen <br> 
 
In diesem Fall erhält man den Least Significant Bit, indem für die Referenzspannung <math>U_{ref}</math> <math>5 \, \text{V}</math> eingesetzt und durch <math>{2^n - 1}</math> geteilt wird, wobei für <math>n = 10</math>  eingesetzt wird, da der Arduino einen 10-Bit A/D-Wandler besitzt. Das Ergebnis kann dann anschließend mit dem maximalen und minimalen Digitalwert multipliziert werden, um so die maximale und minimale Ausgangsspannung <math>U_a</math> des Sensors zu erhalten. Die Formel dafür lautet:
<math>U_a = {Digitalwert}\cdot{LSB}</math> [[#Literatur|<sup>[12]</sup>]]<br>
 
In MATLAB<sup>®</sup> wurde diese Berechnung mit folgendem Code durchgeführt.
 
%% Berechnung der maximalen und minimalen Spannung des Sensors
Uamax = lsb * Max; % Berechnung der maximalen Spannung
Uamin = lsb * Min; % Berechnung der minimalen Spannung
format long  % Darstellung des Ergebnisses mit Nachkommastellen
fprintf('Uamax ohne Rundung: %.15f\n', Uamax); %% Darstellung Maximalwert
fprintf('Uamin ohne Rundung: %.15f\n', Uamin); %% Darstellung Minimalwert
 
Für <math>U_{a,max}</math> ergibt sich dann folgender Spannungswert in Höhe von <math>3,86 \, \text{V}</math> und für <math>U_{a,min}</math> ergibt sich ein minimaler Spannungswert in Höhe von <math>1,90 \, \text{V}</math>. <br>
Der Messbereich des Sensors liegt somit zwischen <math>3,86 \, \text{V}</math> und <math>1,90 \, \text{V}</math>, was einem Spannungsbereich von <math>1,96 \, \text{V}</math>  entspricht.
Diese Methode zum Bestimmen des Messbereichs wurde ausgewählt, da beide Tests ein Extremum der Messumgebung des Sensors darstellen. Aus diesen beiden Referenzwerten, kann nun die weitere Ermittlung der Unsicherheiten erfolgen.
 
Nachdem der Messbereich ermittelt wurde, kann nun die Messunsicherheit des Sensors bestimmt werden. Dazu wurde das Verfahren nach GUM (Guide to the Expression of Uncertainty in Measurement) angewendet, welches in der Lehrveranstaltung ''Signalverarbeitende Systeme'' näher betrachtet wurde. <br>
Es werden die Standardunsicherheiten der Typen A, B und C ermittelt.
Die Ermittlung der Unsicherheiten wurde mithilfe des untenstehenden MATLAB-Codes in Anlehnung an die, in MATLAB<sup>®</sup> Grader bearbeiteten Aufgaben, auf die hier vorliegende Problemstellung angepasst. Es wird ein Vertrauensniveau von <math>68,27 \, \text{%}</math> angenommen, da der Sensor in die Kategorie „Vermessungstechnik“ fällt und diese <math>68,27 \, \text{%}</math> für eine Standardabweichung von <math>1 \, \text{σ}</math> steht. Anschließend wird der Erweiterungsfaktor <math>k = 2</math>  angenommen, da es sich um industrielle Messtechnik handelt. <br>
Über den Button '''Ausklappen''', wird der komplette MATLAB Code angezeigt, der zur Berechnung der Unsicherheit verwendet wurde.<br>
<div class="mw-collapsible mw-collapsed">
<div style="width:1200px; height:700px; overflow:scroll; border: hidden">
<syntaxhighlight lang="cpp" style="border: none; background-color: #EFF1C1; font-size:larger">
%**************************************************************************
%                  Hochschule Hamm-Lippstadt                            *
%**************************************************************************
% Modul           : Berechnung.m                                          *
%                                                                        *
% Datum          : 17.07.2024                                            *
%                                                                        *
% Funktion        : Auslesen Sensordaten zur Berechnung der Unsicherheiten*
%                                                                        *
% Implementation  : MATLAB 2023b                                          *
%                                                                        *
% Req. Toolbox    : DSP System Toolbox                                    *
%                                                                        *
% Author          : Ken Hilz                                              *
%                                                                        *
% Bemerkung      :                                                      *
%                                                                        *
% Letzte Änderung : 25-07-2024                                            *
%                                                                        *
%**************************************************************************
 
% Daten werden aus simout (Voltage, Digitalwert) geholt, das ein Array ist
Volt = Voltage;  % Hier Daten extrahieren
DWert = Digitalwert;  % Hier Daten extrahieren
 
% Datenverarbeitung
n = length(Volt);  % Anzahl der Datenpunkte ermitteln
Rm = mean(Volt);  % Durchschnitt berechnen
sE = std(Volt);  % Standardabweichung berechnen
 
% Parameter des Arduino Uno R3
Bit = 10;  % Auflösung 10 bit
Uref = 5;  % Referenzspannung in V
lsb = Uref / (2^Bit - 1);  % Mindestauflösung, Einheit: V (Quantisierungsfehler)
 
% Berechnen der Standardunsicherheit Typ A
alpha = 1 - 0.6827;  % Messunsicherheit mit 68,27% Prozent Aussagesicherheit, da Messtechnnik
p = 1 - (alpha / 2);  % Wahrscheinlichkeit für zweiseitiges t-Verteilungsintervall
t = tinv(p, n - 1);  % t-Wert für Student-t-Verteilung bei n-1 Freiheitsgraden
uA = sE * t / sqrt(n);  % Standardunsicherheit Typ A
 
% Berechnen der Standardunsicherheit Typ B
uB = lsb / sqrt(12);  % gleichverteilte (rechteckige) Verteilung
 
% Berechnen der Standardunsicherheit Typ C
uC = sqrt(uA^2 + uB^2);  % Kombination der Unsicherheiten Typ A und Typ B
 
% Berechnen der absoluten Messunsicherheit
k = 2;  % Vertrauensfaktor (Vertrauensniveau 0.9545)
uAbs = k * uC;  % absolute Messunsicherheit
uRel = 100 * uAbs / Rm;  % relative Messunsicherheit in %
 
% Vollständiges Messergebnis ausgeben
disp(['Vollständige Messergebnis: U = ', num2str(Rm), ' ± ', num2str(uAbs), ' V ']);  % Ergebnis mit Unsicherheit anzeigen
 
% Maximal- und Minimalwerte sowie Bereich erstellen
Max = max(Volt);  % Den Maximalwert im Daten-Array finden
Min = min(Volt);  % Den Minimalwert im Daten-Array finden
x = Min:0.0001:Max;  % Einen Bereich vom Minimalwert bis zum Maximalwert erstellen
 
% Grafik erstellen
h = gcf;  % Aktuelle Figur holen
set(h, 'Name', 'Ergebnisdarstellung', 'NumberTitle', 'off');  % Figur benennen
xlabel('Anzahl der Messwerte')  % x-Achsenbeschriftung
ylabel('Spannung in V')  % y-Achsenbeschriftung
hold on
 
% Daten und Unsicherheiten plotten
p1 = plot(Volt, 'r.-');  % Messwerte plotten
p2 = yline(Rm, 'LineWidth', 2);  % Mittelwert als Linie plotten
p3 = yline(Rm + uC, 'Color', 'blue');  % Obere Grenze der Unsicherheit Typ C plotten
yline(Rm - uC, 'Color', 'blue');  % Untere Grenze der Unsicherheit Typ C plotten
 
% Titel und Legende
title(['Messergebnis: Mittelwert = ', num2str(Rm), ' \pm ', num2str(sE), ' V, Spannung = ', num2str(mean(Volt)), ' \pm ', num2str(uRel), '%'])  % Titel hinzufügen
hLegend = legend([p1, p2, p3], "Messwerte", "Mittelwert", "Unsicherheit Typ C", 'Location', 'northeast');  % Legende hinzufügen
hold off  % Halten des Plots beenden
</syntaxhighlight>
</div>
<br clear=all>
</div>
 
In der unteren Abbildung ist das Messergebnis, der Mittelwert und die mit dem MATLAB<sup>®</sup>-Code ermittelte Unsicherheit dargestellt. <br>
<span id="Messergebnisse der statischen Messung"></span>
[[Datei:Ergebnis Statischer Messung.jpg|thumb|center|1000px|Abb. 12: Messergebnisse der statischen Messung]]
<br>
Es konnten innerhalb von 20 Sekunden '''4001''' Messwerte gesammelt werden, aus denen die Unsicherheit errechnet wird. <br>
Zu sehen ist der Mittelwert der Messung, welcher bei <math>3.8497 \, \text{V}</math> liegt. Um diesen Mittelwert streuen die Messungen im Bereich von <math>0.00056835 \, \text{V}</math>. <br>
Die Messunsicherheit des hier betrachteten kapazitiven Feuchtigkeitssensors beträgt, im statischen Zustand, somit: '''<math>3.8497 \pm 0.00056835 \, \text{V}</math>'''  <br>
 
==== Tonausgabe ====
Sobald der Sensor einen konstanten Wert im Bereich von <math>\leq 0,001</math> ausgibt, wird der Buzzer über den digitalen Pin 10 des Arduinos angesteuert, sodass dieser einen Ton ausgibt. Ändert sich der Sensorwert stark, stoppt der Ton. Sobald der neu gemessene Wert wieder konstant ist, wird der Buzzer erneut aktiviert, um anzuzeigen, dass der gemessene Wert keine großen Abweichungen aufweist. Diese Schaltung wird realisiert, indem über 8 Memory Blöcke der Mittelwert genommen und dieser mit dem originalen Wert verglichen wird. <br>
 
==== Referenzwert ====
Da für diesen Sensor keine Datenblätter vorliegen, wurden die Referenzwerte aus den Tests im Kapitel [[#Mess- und Vertrauensbereich|Mess- und Vertrauensbereich]] entnommen. Für eine <math>100 \, \text{%}</math> Feuchtigkeit wurde der Sensor in Wasser getaucht, um den Maximalwert zu erhalten. Für <math>0 \, \text{%}</math> Feuchtigkeit wurde der Sensor ohne Boden- oder Wasserkontakt ausgelesen, um den Minimalwert zu bestimmen. <br>
 
==== Kalibrierung des Sensors ====
Mit den zuvor ermittelten maximalen und minimalen Digitalwerten für den Messbereich kann nun die Kalibrierung des Sensors erfolgen. Diese Werte bestimmen den Messbereich des Sensors und müssen nun im System hinterlegt werden, um die gemessenen Werte korrekt in Prozent der Bodenfeuchtigkeit umrechnen zu können. Da leider keine Datenblätter zu diesem Sensor zu finden sind, wurde die Kalibrierung des Sensors mit den zuvor ermittelten Werten durchgeführt. <br>
 
Eine MATLAB<sup>®</sup>-Funktion berechnet auf Basis dieser Referenzwerte den Prozentwert der Bodenfeuchtigkeit. Da der Bereich, innerhalb dessen der Sensor die Bodenfeuchtigkeit messen kann, bereits in dem Kapitel [[#Mess- und Vertrauensbereich|Mess- und Vertrauensbereich]] bestimmt wurde, werden die ermittelten Werte als Minimum und Maximum festgelegt, die den Werten von <math>0 \, \text{%}</math> bzw. <math>100 \, \text{%}</math> entsprechen.<br>
 
Nachdem der Sensor kalibriert wurde, können weitere Messungen in verschiedenen Umgebungen, wie zum Beispiel in einem Blumentopf, durchgeführt werden. Auf Grundlage der hinterlegten Referenzwerte liefert der Sensor nun realistische Werte für die Bodenfeuchtigkeit innerhalb des kalibrierten Bereichs.
 
==== Filterung der Messdaten ====
[[Datei:Feuchtigkeitssensor ungefiltert.jpg|thumb|rigth|450px|Abb. 13: Eingangssignal ungefiltert]]
Der Sensor weist Ausreißer auf, die so gut wie möglich eliminiert werden müssen, um zuverlässige Ergebnisse zu liefern. Diese Ausreißer sind in Abbildung 13 dargestellt. Drei Filtertypen wurden angewendet, um den bestmöglichen Filter zu ermitteln: das Rekursiv Gleitende Mittelwert Filter (RGM), das Median-Filter und das Tiefpassfilter. Diese Filter wurden in der Lehrveranstaltung ''Signalverarbeitende System'' behandelt und konnten somit für diese Untersuchung angewendet werden.<br>
 
[[Datei:Feuchtigkeitssensors gefiltert.jpg|thumb|rigth|450px|Abb. 14: Eingangssignal gefiltert]]
Das RGM erzeugt bei einem schwankenden Eingangssignal ein sehr stark geglättetes Ausgangssignal. Bei der Auslegung des Filters gilt es die Fensterbreite zu definieren, die angibt, wie viele Daten das Filter in die Berechnung mit einbezieht. Es ist zu beachten, dass ein Kompromiss zwischen guter Filterung und der Zeitverzögerung des gefilterten Signals zum Ursprungssignal eingegangen werden muss. Je größer die Fensterbreite, desto besser die Filterung. Allerdings steigt mit zunehmender Fensterbreite auch die zeitliche Verzögerung. Da dieser kapazitive Feuchtigkeitssensor jedoch nicht in Echtzeit arbeiten muss, ist eine geringe zeitliche Verzögerung des geglätteten Signals im Vergleich zum Originalsignal unproblematisch. Für diese praktische Anwendung ist die Verzögerung tolerierbar. Eine visuelle Darstellung der Ergebnisse ist in der unteren rechten Abbildung 15 zu sehen. Der verwendete Code für das Filter ist unten dargestellt.<br>
 
%% Rekursiv Gleitender Mittelwert
function RGM = RekGleitenderMittelwert(x)
persistent n aSchieberegister % Festlegung persistenter Variablen
persistent bErsterDurchlauf % Festlegung persistenter Variable
if isempty (bErsterDurchlauf) % Erster Durchlauf nach Start
    n=160; % Größe des Schieberegisters auf 160 festgelegt
    aSchieberegister = x* ones (n,1); % Schieberegister mit aktuellen Wert besetzen
    bErsterDurchlauf = 1; % Bei erstem Durchlauf 1
end
for m=1:n-1 % Verschiebt die´Werte im Schieberegister um eine Position nach oben.
    aSchieberegister (m) = aSchieberegister (m+1); % Verschiebt den Wert an Position m+1 auf Position m
end
aSchieberegister (n) = x; % Fügt den neuen Wert hinzu
RGM = x; % RGM wird auf x gesetzt
RGM = sum(aSchieberegister)/n; % Gleitender Mittelwert wird berechnet, aus der Summe durch die Anzahl n
end
 
Somit wurde für die hier vorlegende Problemstellung eine Fensterbreite für das RGM von 160 festgelegt, wodurch eine sehr gute Filterung, der Ausreißer erzeugt werden konnte.
In der Abbildung 14 ist ein direkter Vergleich des originalen analogen Signals zum gefilterten Ausgangssignals des RGM zu sehen. <br>


=== Versuchsbeobachtung ===
=== Versuchsbeobachtung ===
[[Datei:Sharp Ergebnis 1.png|thumb|rigth|450px|Abb. 6: Darstellung des Rohsignals des IR-Entfernungssensors (rote Kurve)]]
[[Datei:DynamischeMessungCapacitiveSoil MoistureSensorv1.2.jpg|thumb|rigth|450px|Abb. 15: Dynamische Messung]]
[[Datei:Sharp Ergebnis 2.png |thumb|rigth|450px|Abb. 7: Darstellung von dynamischen Messwerten des IR-Entfernungssensors]]
Insgesamt wurden drei Messungen durchgeführt, bei denen das originale Sensorsignal mit dem Signal des Filters verglichen wurde. Die erste Messung diente der Erfassung der Schwankungen des Signals im statischen Zustand des Sensors. Die zweite Messung wurde zur Bestimmung der Schwankungen im dynamischen Zustand des Sensors durchgeführt. Anschließend konnte für die erste Messung im Ergebnis-Scope das originale mit dem gefilterten Signal verglichen werden. Das  Ergebnis der statischen Messung ist bereits in der oberen Abbildungen 14 dargestellt. <br>
Das Signal des Sensors weist alle 40&thinsp;ms systematische Ausreisser auf (vgl. Abb. 6, rote Kurve).
[[Datei:Versuchsumgebung Capacitive Soil Moisture Sensor v1.2.jpg|thumb|rigth|450px|Abb. 16: Messung in der Versuchsumgebung]]  
 
'''Statische Messung''': Während der statischen Messung zeigten sich hohe Schwankungen des originalen analogen Signals. Diese Schwankungen traten kontinuierlich über die gesamte Messdauer auf, lediglich einige wenige Ausreißer waren zusätzlich zu den Schwankungen vorhanden. Mit dem Einsatz des RGM-Filters konnte das originale Signal dennoch zufriedenstellend gefiltert werden. Leichte Schwankungen waren weiterhin vorhanden, hauptsächlich verursacht durch die Ausreißer. Das geglättete Signal zeigte insgesamt immer noch eine dynamische Änderung, die jedoch nicht vollständig vermieden werden konnte.<br>
 
'''Dynamische Messung''': Während der dynamischen Messung konnte eine Verbesserung der Signalstabilität festgestellt werden. Der RGM-Filter glättete das Eingangssignal gut und reagierte trotz kleiner Latenz immer noch schnell auf Änderungen des Signals. Es wurde festgestellt, dass der Sensor im statischen Betrieb, wenn ein Feuchtigkeitswert konstant ist, mehr Schwankungen und Ausreißer aufweist als im dynamischen Zustand, wenn sich die Feuchtigkeit ändert. Die dynamische Messung ist in der rechten Abbildung 15 zu dargestellt. Für diese Messung wurde der Sensor langsam in Wasser eingetaucht und wieder langsam herausgezogen.
<br>
 
'''Messung in der Versuchsumgebung''': Die Versuchsumgebung des Sensors ist ein Blumentopf, der mit Erde gefüllt ist. Die Feuchtigkeit dieser Erde sollte mit dem Sensor gemessen werden. Da sich die Bodenfeuchtigkeit nur bedingt ändert und ansonsten konstant bleibt, wurde in diesem Fall Wasser in den Blumentopf gegossen, sodass der Sensor auf unterschiedliche Feuchtigkeitswerte reagieren musste. Wie aus den beiden vorherigen Messungen hervorgeht, sind Schwankungen im statischen Zustand vorhanden, nachdem ein Wert konstant bleibt. Sobald sich die Bodenfeuchtigkeit ändert und der Sensor darauf reagiert, ist das Signal nahezu ohne Schwankungen. Die Ergebnisse dieser Messung sind in der rechten Abbildung 16 zu sehen. Gut zu sehen ist, dass der maximale Spannungswert in trockener Erde bei <math>3.84 \, \text{V}</math> liegt, was lediglich einen Unterschied von <math>0.02 \, \text{V}</math> zum maximalen Spannungswert ist,  welcher in dem Kapitel [[#Mess- und Vertrauensbereich|Mess- und Vertrauensbereich]] ermittelt wurde. Somit konnte der Messbereich des Sensors über die beiden Tests sehr genau bestimmt werden, ohne das Datenblätter zur Verfügung standen. Des Weiteren ist zu sehen, dass das gefilterte Sensorsignal bei konstanter Feuchtigkeit stark geglättet ist und kaum noch Ausreißer aufweist. Die Ausschläge nach unten, die bei circa 4 Sekunden und 17 Sekunden zu sehen sind, kamen durch einen direkten Kontakt des Wassers mit dem Sensor. Direkt anschließend steigt der Spannungswert wieder, was eine geringere Feuchtigkeit bedeutet, da das Wasser vom Sensor abgeflossen ist und sich in der Erde verteilt hat.
<br clear = all>


== Auswertung==
== Auswertung==
Die Messhypothese wurde verworfen. Der Sensor weist systematische Messwertausreisser auf.
Die Messhypothese: ''"Die Bodenfeuchtigkeit lässt sich mit dem Capacitive Soil Moisture Sensor v1.2 messen."'' konnte bestätigt werden. Mit dem RGM-Filter konnte die hohe Anzahl an Ausreißern effektiv geglättet werden, wodurch der Sensor letztendlich zuverlässige Ergebnisse liefern konnte. <br>
 
Durch die effiziente Filterung des analogen Eingangssignals ist die Messunsicherheit der Werte auf lediglich <math>3.8497 \pm 0.00056835 , \text{V}</math> reduziert worden (siehe Abbildung 12 [[#Messergebnisse der statischen Messung|Messergebnisse der statischen Messung]]). Ohne Filter zeigt der Sensor jedoch eine hohe Ungenauigkeit und ist unter gleichen Versuchsbedingungen nur schwer anzuwenden, da keine zuverlässigen Ergebnisse erzielt werden können. <br>
 
Wie zuvor beschrieben, ist das Einsatzgebiet des Sensors im Wesentlichen nicht auf Echtzeitdatenverarbeitung angewiesen. Eine Verzögerung von 2 Sekunden bei der Änderung der gemessenen Bodenfeuchtigkeit aufgrund des Filters ist daher akzeptabel. In diesem Versuch wurde eine Fensterbreite des RGM-Filters von 160 Werten gewählt. Eine geringere Anzahl an betrachteten Werten führt zu einer relativ guten Filterung des Signals mit geringerer Latenz. Hier wurde jedoch der Kompromiss gemacht, dass eine bessere Filterung für ein genaueres Ergebnis Vorrang vor der zeitlichen Anforderung hat.<br>
 
In der unteren Abbildung 17 ist das Messergebnis aus dem Ergebnisvideo zu sehen. Für diese Endauswertung wurde neben dem analogen Eingangssignal und dem gefilterten Signal auch der Prozentwert in dieses Scope geführt, sodass die Bodenfeuchtigkeit für die Endauswertung auch in Prozent zu sehen ist.
 
[[Datei:Messergebnis Capacitive Soil Moisture Sensor v1.2.jpg|thumb|center|850px|Abb. 17: Messung Ergebnisvideo]]
<br clear = all>
 
Bereits zu Beginn der Messung zeigte der Sensor eine Feuchtigkeit von etwa <math>25 \, \text{%}</math>, was einer Spannung von <math>3,43 \, \text{V}</math> entspricht. Das liegt daran, dass die verwendete Erde aufgrund der Wetterbedingungen nicht ganz trocken war. Sobald Wasser hinzugefügt wurde, konnte beobachtet werden, dass die Spannung abnahm und gleichzeitig der Prozentwert stieg. Abschließend kann gesagt werden, dass der Sensor zuverlässig funktioniert und plausible Ergebnisse liefert. Des Weiteren ist durch den MATLAB<sup>®</sup>-Function Block eine Umrechnung in Prozent möglich, wodurch diese für ein einfacheres Verständnis der Bodenfeuchtigkeit dargestellt werden kann. <br>
 
Das vollständige Ergebnisvideo findet sich hier: [[#Ergebnisvideo|Ergebnisvideo]]


Die Ausreisser lassen sich mit einem Signalfilter eliminieren. Hierzu eignet sich ein Rangordnungsfilter (z.&thinsp;B. Median-Filter). Das Filter wird hierzu auf eine Fensterbreite von 30 Werten
eingestellt. Das zufriedenstellende Filterergebnis für statische Werte zeigt Abb. 6 als blaue Kurve. Es konnte mit dynamische Werten verifiziert werden (vgl. Abb. 7). Das Datenblatt ([2, S. 6]) belegt die Messungen und bezeichnet die Messausreisser als "instabile Ausgabe" für maximal 5&thinsp;ms alle 40&thinsp;ms. Mit 50 Werten erhöht sich die Filterwirkung, es entsteht jedoch ein Delay von 10&thinsp;ms. Mit 10 Werten ist die Filterwirkung zu gering.
== Zusammenfassung und Ausblick ==
== Zusammenfassung und Ausblick ==
* Zusammenfassung der Kapitel 1-4
=== Zusammenfassung ===
* Diskussion der Ergebnisse
Bei diesem Projekt in der Lehrveranstaltung ''Angewandte Informatik'' galt es einen Sensor genauer zu betrachten, wobei der Messbereich und die Unsicherheit ermittelt werden sollten. Bei dieser Versuchsdurchführung wurde der Capacitive Soil Moisture Sensor v1.2 bearbeitet. Dieser liefert analoge Signale, die in eine Spannung umgerechnet werden müssen. Anhand dieser Werte kann der Messbereich und die Unsicherheit bestimmt werden. Es wurden verschiedene Tests zur Erfüllung der Anforderung durchgeführt, die in den Abbildungen dokumentiert worden sind. Des Weiteren wurde ein Ergebnisvideo angefertigt, bei dem der Sensor in einem Blumentopf mit Erde gesteckt und langsam Wasser dazu gegossen wird, damit sich die Bodenfeuchtigkeit ändert. Bei einem stabilen Spannungswert, wenn die Bodenfeuchtigkeit konstant ist, wird über den Buzzer ein Piepton ausgegeben.
* Ausblick
 
* Selbstreflexion/Lessons learned
=== Diskussion der Ergebnisse ===
Da für diesen Sensor keine Datenblätter verfügbar sind, mussten die genauen Maximal- und Minimalwerte selbst ermittelt werden. Auf Basis dieser Daten wurden sowohl der Messbereich als auch die Kalibrierung des Sensors durchgeführt. Mit einem Sensor, für den mehr Datenblätter und Referenzwerte einsehbar sind, wäre eine genauere Ermittlung des Messbereichs und der Messunsicherheit möglich. Dennoch zeigt sich, dass dieser Sensor auch ohne Datenblätter gut kalibriert und festgelegt werden konnte. <br>
 
Nach der Kalibrierung des Sensors konnten in verschiedenen Testumgebungen zuverlässige und reproduzierbare Ergebnisse erzielt werden. Ohne den Einsatz eines Filters zeigte der Sensor jedoch ein Signal mit vielen Ausreißern, was zu hohen Schwankungen in den Ergebnissen führte. Durch den Einsatz des RGM-Filters mit einer Fensterbreite von 160 Werten wurde, wie bereits beschrieben, ein Kompromiss zwischen Genauigkeit und zeitlicher Verzögerung gefunden, wodurch ein geglättetes Signal erzeugt wird.
 
=== Ausblick ===
Für zukünftige Untersuchungen sollten unbedingt Referenzwerte von den Herstellern eingeholt werden. Diese Informationen würden eine genauere Ermittlung des Messbereichs und der Messunsicherheit ermöglichen und die Kalibrierung des Sensors erheblich verbessern. Eine präzisere Filterauslegung könnte ebenfalls in Betracht gezogen werden, um die Schwankungen des ursprünglichen Signals weiter zu minimieren. Hierbei müsste der Filter genauer untersucht und möglicherweise angepasst werden.<br>
 
Ein wichtiger Aspekt dabei ist die begrenzte Kapazität des Arduino Uno zur Speicherung komplexer Modelle. Der Arduino Uno verfügt nur über begrenzten Speicherplatz, der bei größeren Fensterbreiten schnell ausgelastet ist. Diese Einschränkung stellte eine Herausforderung bei der aktuellen Projektdurchführung dar und begrenzte die Größe der verwendeten Fensterbreite des Filters.<br>
 
Für eine präzisere Filterauslegung könnte in zukünftigen Projekten der Einsatz eines Mikrocontrollers mit größerem Speicher in Betracht gezogen werden. Alternativ könnten auch optimierte Algorithmen zur Filterung entwickelt werden, die weniger Speicherplatz benötigen. Diese Ansätze würden es ermöglichen, eine größere Anzahl von Messwerten zu berücksichtigen, ohne die Leistungsfähigkeit des Systems zu beeinträchtigen.<br>
 
Zusammenfassend lässt sich sagen, dass die Einholung von Referenzwerten vom Hersteller und die Untersuchung präziserer Filterauslegungen wesentliche Schritte für zukünftige Untersuchungen sind. Trotz der begrenzten Kapazität des Arduino Uno bieten diese Ansätze vielversprechende Möglichkeiten zur Verbesserung der Messgenauigkeit und Zuverlässigkeit des Capacitive Soil Moisture Sensors v1.2.<br>
 
=== Selbstreflexion/Lessons learned ===
Während der Durchführung des Projekts wurden wesentliche Aspekte der Signalverarbeitung vertieft. Die Grundlagen hierfür wurden bereits in den Lehrveranstaltungen ''Signalverarbeitende Systeme'' und ''Angewandte Informatik'' geschaffen. Die Bearbeitung dieser Aufgabe bot die Gelegenheit, das theoretische Wissen aus diesen Kursen in die Praxis umzusetzen und zu vertiefen.<br>
 
Die Arbeit an diesem Projekt stellte einen guten Abschluss der beiden Lehrveranstaltungen dar und ermöglichte einen genaueren Einblick in die praktische Anwendung der Signalverarbeitung. Dabei konnten die theoretischen Konzepte auf eine reale Problemstellung angewendet werden, was die Lerninhalte noch greifbarer und verständlicher machte.<br>
 
Insbesondere die Herausforderungen bei der Filterung und Kalibrierung des Sensors sowie der Umgang mit der begrenzten Speicherkapazität des Arduino Uno boten wichtige praktische Erfahrungen. Diese Erfahrungen konnten das Verständnis für die Komplexität der Signalverarbeitungstechniken erweitern und einen grundlegenden Einblick in die Problemlösung solcher Versuche geben.<br>
 
Zusammengefasst war das Projekt eine wertvolle praktische Ergänzung zu den theoretischen Inhalten der Lehrveranstaltungen und trug maßgeblich dazu bei, die Kompetenz in der Signalverarbeitung und angewandten Informatik zu stärken.


== Ergebnisvideo ==
== Ergebnisvideo ==
Binden Sie hier Ihr Ergebnisvideo ein.
'''Ergebnisvideo der Versuchsdurchführung''' <br>


Anleitung: [[Videos_einbinden|Videos im Wiki einbinden]]
<span id="Ergebnisvideo"></span>
In diesem Ergebnisvideo ist die Messung der Bodenfeuchtigkeit mit dem Capacitive Soil Moisture Sensor v1.2 zu sehen. Dieses Video wurde aufgenommen, nachdem der Messbereich definiert, der Sensor anhand von Referenzwerten kalibriert wurde und das Eingangssignal durch ein auf diese Problemstellung ausgelegtes Rekursives Gleitendes Mittelwertfilter geglättet wird. Für dieses Video wurde die Dauer der Messung von 20 Sekunden auf 30 Sekunden erhöht.
[[Datei:Capacitive Soil Moisture Sensor v1.2.mp4|thumb|center|850px|Ergebnisvideo des Capacitive Soil Moisture Sensors v1.2]]  
<br clear = all>


== Lernzielkrontrolle ==
== Lernzielkrontrolle ==
Zeile 162: Zeile 450:


== Literatur ==
== Literatur ==
Zitieren Sie nach [[Zitieren_nach_DIN1505|DIN ISO 690:2013-10]].
[1] HSHL W<span style="font-variant:small-caps">iki</span>: BSE Angewandte Informatik - SoSe24. URL: https://wiki.hshl.de/wiki/index.php/BSE_Angewandte_Informatik_-_SoSe24, 14. Juli 2024 <br>
[2] BIGDATA-I<span style="font-variant:small-caps">nsider</span>: Was ist Simulink?. URL: https://www.bigdata-insider.de/was-ist-simulink-a-790857/, 14. Juli 2024 <br>
[3] A<span style="font-variant:small-caps">coweb</span>: Wie funktioniert eine kapazitive Feuchtemessung. URL: https://www.acoweb.de/wie-funktioniert-eine-kapazitive-feuchtemessung, 14. Juli 2024 <br>
[4] S<span style="font-variant:small-caps">tarthardware</span>: Arduino Uno. URL: https://starthardware.org/arduino-uno/, 14. Juli 2024 <br>
[5] HSHL W<span style="font-variant:small-caps">iki</span>: Steckbrett. URL: https://wiki.hshl.de/wiki/index.php/Steckbrett, 14. Juli 2024 <br>
[6] HSHL W<span style="font-variant:small-caps">iki</span>: LCD Modul 16x02 I2C. URL: https://wiki.hshl.de/wiki/index.php/LCD_Modul_16x02_I2C, 14. Juli 2024 <br>
[7] F<span style="font-variant:small-caps">undunio</span>: Piezo Speaker 5V. URL: https://funduinoshop.com/bauelemente/passive-bauelemente/buzzer-und-lautsprecher/piezo-speaker-5v/lautsprecher-kompatibel-mit-arduino, 17. Juli 2024 <br>
[8] T<span style="font-variant:small-caps">hecavepearlproject</span>: Hacking a Capacitive Soil Moisture Sensor for Frequency Output. URL: https://thecavepearlproject.org/2020/10/27/hacking-a-capacitive-soil-moisture-sensor-for-frequency-output/, 22. Juli 2024 <br>
[9] Y<span style="font-variant:small-caps">ouTube</span>: Kapazitiver Bodenfeuchtesensor, einfach erklärt!. URL: https://www.youtube.com/watch?v=ckKN4gV62tk, 14. Juli 2024 <br>
[10] F<span style="font-variant:small-caps">undunio</span>: Kapazitiver Feuchtigkeitssensor. URL: https://funduinoshop.com/elektronische-module/sensoren/feuchtigkeit/kapazitiver-feuchtigkeitssensor, 14. Juli 2024 <br>
[11] S<span style="font-variant:small-caps">unfounder</span>: Component Soil. URL: https://docs.sunfounder.com/projects/umsk/de/latest/01_components_basic/02-component_soil.html, 14. Juli 2024 <br>
[12] M<span style="font-variant:small-caps">ikrocontroller</span>: AVR-Tutorial: ADC. URL: https://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC, 14. Juli 2024 <br>


== Anhang ==
== Anhang ==
* Datenblätter
* [[:Datei:Capacitive Soil Moisture Sensor Dateien.zip|Simulink-Modell und MATLAB-Script]]
* Simulink-Modell
* [[:Datei:Fritzing Capacitive Soil Moisture Sensor v1.2..fzz|Fritzing Anschluss- und Schaltplan ]]
* Originaldateien (PAP, Schaltplan,... )
----
----
→ zurück zum Hauptartikel: [[BSE_Angewandte_Informatik_-_SoSe24|BSE Angewandte Informatik SoSe24]] | [[BSE_Angewandte_Informatik_-_SoSe24_-_Hausarbeit|Hausarbeit SoSe24]]
→ zurück zum Hauptartikel: [[BSE_Angewandte_Informatik_-_SoSe24|BSE Angewandte Informatik SoSe24]] | [[BSE_Angewandte_Informatik_-_SoSe24_-_Hausarbeit|Hausarbeit SoSe24]]

Aktuelle Version vom 9. August 2024, 13:04 Uhr

Abb. 1: Kapazitiver Bodenfeuchtesensor
Autor: Ken Hilz
Studiengang: Business and Systems Engineering
Modul: BSE-M-2-1.03, Hausarbeit in Angewandte Informatik gehalten von Prof. Dr.-Ing. Schneider
Semester: Sommersemester 2024
Abgabetermin: 28.07.2024

Einführung

In der Lehrveranstaltung Angewandte Informatik ist als Prüfungsleistung eine semesterbegleitende Arbeit vorgesehen. Dieses Kapitel behandelt den Einsatz des Capacitive Soil Moisture Sensor v1.2 zur Bestimmung der Bodenfeuchtigkeit. Für die Durchführung dieser Arbeit sind Kenntnisse im Bereich von Microcontrollern, Sensoren, Aktuatoren sowie im Umgang mit MATLAB®/Simulink erforderlich. Des Weiteren sind Kenntnisse im Bereich der Signalverarbeitung und Filterung notwendig, um dieses Projekt durchzuführen. Die Funktionsweise des Sensors und die Umsetzung der Fragestellung wird im Folgenden Kapitel genauer erläutert.

Aufgabenstellung

Messen Sie die Bodenfeuchte mittels Capacitive Soil Moisture Sensor v1.2.

Thema/Fragestellung:
Messung der Bodenfeuchtigkeit mit dem Sensor Capacitive Soil Moisture Sensor v1.2.
Hypothese:
Die Bodenfeuchtigkeit lässt sich mit dem Capacitive Soil Moisture Sensor v1.2 messen.
Einordnung in den Lehrplan:
Die Lehrveranstaltung Angewandte Informatik vermittelt den Studierenden mehrere praktische Methoden, welche im Folgenden aufgelistet sind:

  • mit der Versionskontrolle SVN nachhaltig Quelltext entsprechend der Programmierrichtlinien schreiben, sichern, kollaboriert bearbeiten und Konflikte lösen.
  • in einer mathematisch orientierten Systax (z. B. MATLAB®) mit Vektoren und Matrizen rechnen, Programmteile in Funktionen auslagern, Zweige und Scheifen programmieren, Daten importieren und visualisieren.
  • die Mikrocontrollerplattform Arduino modellbasiert mit Simulink programmieren, so dass Sensoren eingelesen und Aktoren angesteurt werden können. [1]

Projektbeschreibung

In der unteren Tabelle 2 sind alle benötigten Materialien für diese Versuchsdurchführung aufgelistet.

Tabelle 2: Materialliste
# Anzahl Material
1 1 PC mit MATLAB/Simulink R2023b
2 1 Kapazitiver Bodenfeuchtesensor
3 1 Arduino Uno R3
4 1 Steckbrett
5 1 LCD Modul 16x02 I2C
6 1 Buzzer
7 8 Jumper Kabel, männlich/männlich, 20 cm

Beschreibung Funktionsweise der verwendeten Hard- und Software

Simulink R2023b
Für die Ausführung von Simulink wird die Software MATLAB® benötigt. Beide Softwares sind von The MathWorks. Über Simulink lassen sich mithilfe von Blockschaltbilder technische Systeme simulieren, testen und realisieren. Simulink wird für die Simulation von technischen Regelkreisen oder aber für die Signalverarbeitung verwendet. [2]

Sensor Kapazitiver Bodenfeuchtesensor

Abb. 2: Kapazitiver Bodenfeuchtesensor

Bei der kapazitiven Messung der Feuchtigkeit wird das Verfahren der indirekten Messung angewendet. Das gemessen Signal wird in eine elektrische Größe umgewandelt und an das Microcontroller-Board ausgegeben. Der kapazitive Feuchtigkeitssensor arbeitet auf Basis eines Kondensators. Zwischen den Platten des Kondensators ist ein elektrisches Feld aufgebaut, welches je nach Spannung und Abstand variiert. Die Speicherung von elektrischer Energie wird beim Kondensator Kapazität genannt und in Farad angegeben. Diese Kapazität wird durch den Abstand der Platten zueinander, der Fläche dieser Platten und des Dielektrikums bestimmt. Das Dielektrikum beschreibt das Material, welches zwischen den beiden Platten ist. Die Materialien haben unterschiedliche Isolationseigenschaften, wodurch auch unterschiedliche Durchlässigkeiten des elektrischen Feldes vorhanden sind. Diese Durchlässigkeit wird als Permittivität bezeichnet. Da bei einem kapazitiven Feuchtigkeitssensor der Abstand der beiden Kondensatorplatten unveränderbar ist, wird die Feuchtigkeit lediglich über die Änderung der Permittivität bestimmt. In Abbildung 2 ist der Sensor zu sehen. [3]

Arduino Uno R3

Abb. 3: Arduino Uno R3

Der Arduino Uno R3 ist ein Microcontroller-Board, welches aus 14 digitalen I/O Pins und sechs analogen I/O Pins besteht. Von den 14 digitalen I/Os können sechs ein PWM-Signal erzeugen. Verschiedene Arten von Sensoren und Aktuatoren können mit dem Arduino Uno R3 Board verbunden werden, wodurch eine Vielzahl von Einsatzmöglichkeiten entstehen. In Abbildung 3 ist der Arduino Uno R3 zu sehen. [4]

Steckbrett

Abb. 4: Steckbrett

Ein Steckbrett eignet sich zum schnellen Aufbau einer elektrischen Schaltung. Dadurch, dass die Bauteile nur gesteckt werden, können diese einfach umgesteckt werden. Somit lässt sich der Aufbau schnell und einfach überarbeiten und verbessern. Die äußeren Reihen dienen des Anschlusses der Versorgungsspannung und der Verbindung zu Ground. In den mittleren Reihen können die Bauteile gesteckt werden. In Abbildung 4 ist ein Steckbrett zu sehen. [5]

LCD Modul 16x02 I2C

Abb. 5: LCD Modul 16x02 I2C

Das LCD-Modul 16x2 I2C zeigt Text in zwei Zeilen mit je 16 Zeichen an und nutzt die I2C-Schnittstelle. Dadurch sind nur zwei Datenleitungen nötig: SDA (für Daten) und SCL (für den Takt), sowie VCC (Spannungsversorgung) und GND (Masse). Der Mikrocontroller überträgt die Daten seriell an das Modul, meist mit der I2C-Adresse 0x27 oder 0x3F. Die I2C-Verbindung vereinfacht die Kommunikation und reduziert den Verkabelungsaufwand. In Abbildung 5 ist das LCD Modul 16x02 I2C zu sehen. [6]

Buzzer

Abb. 6: Piezo-Lautsprecher

Ein Piezo-Lautsprecher nutzt Piezoelektrizität zur Schallerzeugung. Piezoelektrische Materialien erzeugen bei mechanischer Verformung eine elektrische Ladung und umgekehrt. Durch Anlegen einer Spannung an ein dünnes Piezoelement dehnt es sich aus und zieht sich zusammen, wodurch Schallwellen erzeugt werden. Ein Piezo-Lautsprecher kann aus 5V Gleichspannung Wechselstrom erzeugen, der das Piezoelement periodisch verformt und so Schall erzeugt. In Abbildung 6 ist der Buzzer zu sehen.[7]

Funktionsweise Capacitive Soil Moisture Sensor v1.2

Abb. 7: Schaltplan Capacitive Soil Moisture Sensor (v1.2) [8]

Der in Abbildung 7 dargestellte Schaltplan ist der des kapazitiven Bodenfeuchtigkeitssensors. Dieser misst die Änderung der Kapazität des sich zwischen den Kondensatorplatten befindenden Materials. Über eine TLC555-Timer-IC wird ein kontinuierliches Rechtecksignal mit einer Frequenz von etwa 1,5 MHz erzeugt.

Der Sensor verändert seine Kapazität basierend auf der Bodenfeuchtigkeit. Je feuchter der Boden ist, desto länger dauert es diesen Kondensator zu laden und entladen. Die dafür benötigte Zeit wird von dem Sensor gemessen.

Diese analoge Spannung kann von einem Mikrocontroller ausgelesen werden, um die Bodenfeuchtigkeit zu bestimmen. Die Versorgungsspannung der Schaltung beträgt 3,3 V bis 5 V.[8],[9]

Technische Daten

In dieser Tabelle sind grundlegende technische Daten des Sensors aufgelistet.

Tabelle 3: Technische Daten des Capacitive Soil Moisture Sensor v1.2 [10]
Messbereich 0 V ~ 3 V
Reaktionszeit ca. 7000 ms
Versorgungsspannung 3.3 V ~ 5.5 V
Versorgungsstrom 5 mA
Schnittstelle PH2.0-3P Steckkabel
Gewicht 10 g
Material korrosionsbeständiges Material
Abmessungen 98 mm x 23 mm x 9 mm

Pinbelegung

In dieser Tabelle ist die Pinbelegung des Sensors aufgelistet.

Tabelle 4: Pinbelegung des Capacitive Soil Moisture Sensor v1.2 [11]
Pin Belegung Signal Arduino Pin
1 Versorgungsspannung (VCC) 5 V 5V
2 Analog Output (AOUT) 0~3V A0
3 Masse (GND) 0 V GND


Versuchsaufbau und Durchführung

Versuchsaufbau

Der Anschlussplan des Versuchs ist in der unteren Abbildung 8 dargestellt. Zu sehen ist ein Arduino Uno R3 Board, das mit einem kapazitiven Feuchtigkeitssensor und einem Buzzer verbunden ist. Zu beachten gilt, dass der gezeigte Feuchtigkeitssensor nicht identisch mit dem für den Versuch verwendeten Sensor ist, da in Fritzing nur ein kapazitiver Sensor mit drei Anschlüssen verfügbar ist.

Auf dem Breadboard wird die Versorgungsspannung (VCC) von über ein rotes Kabel angeschlossen, während das schwarze Kabel die Ground-Verbindung zum Arduino herstellt. Da der Sensor nur drei Anschlüsse hat, von denen zwei für die Spannungsversorgung und Ground verwendet werden, wird der letzte freie Anschluss des Sensors mit dem analogen Eingang A0 des Arduino verbunden. Der GND Pin des Buzzers wird mit GND auf dem Breadboard verbunden und der andere mit dem Digitalen Output 10, sodass über diesen Output der Buzzer ein Signal bekommt, sobald der Wert konstant ist.

Anschließend wird der Arduino über ein USB-A Kabel mit dem Computer verbunden, um das in Simulink erstellte Modell hochladen zu können.

Die Schaltplanübersicht und ein Foto des Aufbaus sind in den Abbildungen 9 und 10 zu finden.


Versuchsdurchführung

Simulink Modell

Abb. 11: Simulink-Modell

Dieses Simulink-Modell dient der Ermittlung der Bodenfeuchtigkeit mithilfe eines kapazitiven Bodenfeuchtesensors v1.2 und wurde in Simulink R2023b implementiert. Das Simulink Support Package für Arduino Hardware wird für diesen Versuch benötigt.

Zunächst wird das analoge Sensorsignal über den Pin A0 des Arduino aufgenommen und durch einen double Block geführt, um es in einen Gleitkommawert umzuwandeln. Anschließend wird das umgewandelte Signal durch einen Gain-Block (Multiplikation mit 5/1023) geführt, um den digitalen Wert in eine Spannung umzuwandeln. Diese Spannung wird danach durch ein Rekursives Gleitendes Mittelwert (RGM)-Filter gefiltert, um Ausreißer zu reduzieren.

Das gefilterte Spannungssignal wird über einen weiteren Gain-Block geführt, um es wieder in einen digitalen Wert umzuwandeln. Ein MATLAB® Function Block berechnet dann aus diesem Digitalwert den entsprechenden Prozentwert der Bodenfeuchtigkeit. Die Spannungs- und Digitalwerte werden zudem an den Workspace ausgegeben, um die Unsicherheit im weiteren Verlauf berechnen zu können (über die Variablen out.Voltage und out.Digitalwert).

Für die zuverlässige Ansteuerung des Buzzers wird der Mittelwert der letzten acht gefilterten Spannungswerte berechnet. Dieser Mittelwert wird mit einem konstanten Wert von 0,001 verglichen. Wenn der Mittelwert kleiner oder gleich 0,001 ist, wird das Signal über einen Digital Out Block an den Pin 10 des Arduino ausgegeben, um den Buzzer zu aktivieren.

Die Modelleinstellungen für diese Durchführung lauten wie folgt:
● Hardware board: Arduino Uno
● Type: Fixed-step
● Solver: ode1 (Euler)
● Fixed-step Size: 0,001 s
Das Simulink-Modell ist in der rechten Abbildung 11 dargestellt.

Mess- und Vertrauensbereich

Bevor die Versuchsdurchführung starten kann, muss der Messbereich des Sensors festgelegt werden. Die Ermittlung des Messbereichs wurde mittels zweier Tests durchgeführt. Zunächst wurde der Sensor an einen Arduino angeschlossen und die Sensordaten im trockenen Zustand über 20 Sekunden ausgelesen. Anschließend wurde der Sensor vollständig in ein Glas Wasser eingetaucht, um die Messungen im nassen Zustand zu erfassen. Diese Tests ermöglichten es, die beiden Extremwerte der zumessenden Umgebung des Sensors zu ermitteln. Der Test im trockenen Zustand repräsentiert Feuchtigkeit. Der dabei ermittelte Digitalwert 789 wurde als Referenzwert für keine Feuchtigkeit gespeichert. Der Test im Wasserglas simulierte Feuchtigkeit, sodass der entsprechende Digitalwert 388 als Referenzwert für maximale Feuchtigkeit hinterlegt werden konnte. Der untere MATLAB®-Code dient zur Berechnung der maximalen und minimalen Digitalwerte des Sensors.

%% Berechnung des maximalen und minimalen Digitalwertes des Sensors
Max = max(DWert);  %% Den Maximalwert im Daten-Array finden
Min = min(DWert);  %% Den Minimalwert im Daten-Array finden
fprintf('Max Digitalwert: %.15f\n', Max); %% Darstellung Maximalwert
fprintf('Min Digitalwert: %.15f\n', Min); %% Darstellung Minimalwert

Um über diese beiden Werte nun den Messbereich des Sensors in Volt angeben zu können, wird folgende Formel benötigt:

[12]
Least Significant Bit
Referenzspannung
Quantisierungsstufen

In diesem Fall erhält man den Least Significant Bit, indem für die Referenzspannung eingesetzt und durch geteilt wird, wobei für eingesetzt wird, da der Arduino einen 10-Bit A/D-Wandler besitzt. Das Ergebnis kann dann anschließend mit dem maximalen und minimalen Digitalwert multipliziert werden, um so die maximale und minimale Ausgangsspannung des Sensors zu erhalten. Die Formel dafür lautet: [12]

In MATLAB® wurde diese Berechnung mit folgendem Code durchgeführt.

%% Berechnung der maximalen und minimalen Spannung des Sensors
Uamax = lsb * Max; % Berechnung der maximalen Spannung
Uamin = lsb * Min; % Berechnung der minimalen Spannung
format long  % Darstellung des Ergebnisses mit Nachkommastellen
fprintf('Uamax ohne Rundung: %.15f\n', Uamax); %% Darstellung Maximalwert
fprintf('Uamin ohne Rundung: %.15f\n', Uamin); %% Darstellung Minimalwert

Für ergibt sich dann folgender Spannungswert in Höhe von und für ergibt sich ein minimaler Spannungswert in Höhe von .
Der Messbereich des Sensors liegt somit zwischen und , was einem Spannungsbereich von entspricht. Diese Methode zum Bestimmen des Messbereichs wurde ausgewählt, da beide Tests ein Extremum der Messumgebung des Sensors darstellen. Aus diesen beiden Referenzwerten, kann nun die weitere Ermittlung der Unsicherheiten erfolgen.

Nachdem der Messbereich ermittelt wurde, kann nun die Messunsicherheit des Sensors bestimmt werden. Dazu wurde das Verfahren nach GUM (Guide to the Expression of Uncertainty in Measurement) angewendet, welches in der Lehrveranstaltung Signalverarbeitende Systeme näher betrachtet wurde.
Es werden die Standardunsicherheiten der Typen A, B und C ermittelt. Die Ermittlung der Unsicherheiten wurde mithilfe des untenstehenden MATLAB-Codes in Anlehnung an die, in MATLAB® Grader bearbeiteten Aufgaben, auf die hier vorliegende Problemstellung angepasst. Es wird ein Vertrauensniveau von angenommen, da der Sensor in die Kategorie „Vermessungstechnik“ fällt und diese für eine Standardabweichung von steht. Anschließend wird der Erweiterungsfaktor angenommen, da es sich um industrielle Messtechnik handelt.
Über den Button Ausklappen, wird der komplette MATLAB Code angezeigt, der zur Berechnung der Unsicherheit verwendet wurde.

%**************************************************************************
%                   Hochschule Hamm-Lippstadt                             *
%**************************************************************************
% Modul	          : Berechnung.m                                          *
%                                                                         *
% Datum           : 17.07.2024                                            *
%                                                                         *
% Funktion        : Auslesen Sensordaten zur Berechnung der Unsicherheiten*
%                                                                         *
% Implementation  : MATLAB 2023b                                          *
%                                                                         *
% Req. Toolbox    : DSP System Toolbox                                    *
%                                                                         *
% Author          : Ken Hilz                                              *
%                                                                         *
% Bemerkung       :                                                       *
%                                                                         *
% Letzte Änderung : 25-07-2024                                            *
%                                                                         *
%**************************************************************************

% Daten werden aus simout (Voltage, Digitalwert) geholt, das ein Array ist
Volt = Voltage;  % Hier Daten extrahieren
DWert = Digitalwert;  % Hier Daten extrahieren

% Datenverarbeitung
n = length(Volt);  % Anzahl der Datenpunkte ermitteln
Rm = mean(Volt);  % Durchschnitt berechnen
sE = std(Volt);  % Standardabweichung berechnen

% Parameter des Arduino Uno R3
Bit = 10;  % Auflösung 10 bit
Uref = 5;  % Referenzspannung in V
lsb = Uref / (2^Bit - 1);  % Mindestauflösung, Einheit: V (Quantisierungsfehler)

% Berechnen der Standardunsicherheit Typ A
alpha = 1 - 0.6827;  % Messunsicherheit mit 68,27% Prozent Aussagesicherheit, da Messtechnnik
p = 1 - (alpha / 2);  % Wahrscheinlichkeit für zweiseitiges t-Verteilungsintervall
t = tinv(p, n - 1);  % t-Wert für Student-t-Verteilung bei n-1 Freiheitsgraden
uA = sE * t / sqrt(n);  % Standardunsicherheit Typ A

% Berechnen der Standardunsicherheit Typ B
uB = lsb / sqrt(12);  % gleichverteilte (rechteckige) Verteilung

% Berechnen der Standardunsicherheit Typ C
uC = sqrt(uA^2 + uB^2);  % Kombination der Unsicherheiten Typ A und Typ B

% Berechnen der absoluten Messunsicherheit
k = 2;  % Vertrauensfaktor (Vertrauensniveau 0.9545)
uAbs = k * uC;  % absolute Messunsicherheit 
uRel = 100 * uAbs / Rm;  % relative Messunsicherheit in %

% Vollständiges Messergebnis ausgeben
disp(['Vollständige Messergebnis: U = ', num2str(Rm), ' ± ', num2str(uAbs), ' V ']);  % Ergebnis mit Unsicherheit anzeigen

% Maximal- und Minimalwerte sowie Bereich erstellen
Max = max(Volt);  % Den Maximalwert im Daten-Array finden
Min = min(Volt);  % Den Minimalwert im Daten-Array finden
x = Min:0.0001:Max;  % Einen Bereich vom Minimalwert bis zum Maximalwert erstellen

% Grafik erstellen
h = gcf;  % Aktuelle Figur holen
set(h, 'Name', 'Ergebnisdarstellung', 'NumberTitle', 'off');  % Figur benennen
xlabel('Anzahl der Messwerte')  % x-Achsenbeschriftung
ylabel('Spannung in V')  % y-Achsenbeschriftung
hold on

% Daten und Unsicherheiten plotten
p1 = plot(Volt, 'r.-');  % Messwerte plotten
p2 = yline(Rm, 'LineWidth', 2);  % Mittelwert als Linie plotten
p3 = yline(Rm + uC, 'Color', 'blue');  % Obere Grenze der Unsicherheit Typ C plotten
yline(Rm - uC, 'Color', 'blue');  % Untere Grenze der Unsicherheit Typ C plotten

% Titel und Legende 
title(['Messergebnis: Mittelwert = ', num2str(Rm), ' \pm ', num2str(sE), ' V, Spannung = ', num2str(mean(Volt)), ' \pm ', num2str(uRel), '%'])  % Titel hinzufügen
hLegend = legend([p1, p2, p3], "Messwerte", "Mittelwert", "Unsicherheit Typ C", 'Location', 'northeast');  % Legende hinzufügen
hold off  % Halten des Plots beenden


In der unteren Abbildung ist das Messergebnis, der Mittelwert und die mit dem MATLAB®-Code ermittelte Unsicherheit dargestellt.

Abb. 12: Messergebnisse der statischen Messung


Es konnten innerhalb von 20 Sekunden 4001 Messwerte gesammelt werden, aus denen die Unsicherheit errechnet wird.
Zu sehen ist der Mittelwert der Messung, welcher bei liegt. Um diesen Mittelwert streuen die Messungen im Bereich von .
Die Messunsicherheit des hier betrachteten kapazitiven Feuchtigkeitssensors beträgt, im statischen Zustand, somit:

Tonausgabe

Sobald der Sensor einen konstanten Wert im Bereich von ausgibt, wird der Buzzer über den digitalen Pin 10 des Arduinos angesteuert, sodass dieser einen Ton ausgibt. Ändert sich der Sensorwert stark, stoppt der Ton. Sobald der neu gemessene Wert wieder konstant ist, wird der Buzzer erneut aktiviert, um anzuzeigen, dass der gemessene Wert keine großen Abweichungen aufweist. Diese Schaltung wird realisiert, indem über 8 Memory Blöcke der Mittelwert genommen und dieser mit dem originalen Wert verglichen wird.

Referenzwert

Da für diesen Sensor keine Datenblätter vorliegen, wurden die Referenzwerte aus den Tests im Kapitel Mess- und Vertrauensbereich entnommen. Für eine Feuchtigkeit wurde der Sensor in Wasser getaucht, um den Maximalwert zu erhalten. Für Feuchtigkeit wurde der Sensor ohne Boden- oder Wasserkontakt ausgelesen, um den Minimalwert zu bestimmen.

Kalibrierung des Sensors

Mit den zuvor ermittelten maximalen und minimalen Digitalwerten für den Messbereich kann nun die Kalibrierung des Sensors erfolgen. Diese Werte bestimmen den Messbereich des Sensors und müssen nun im System hinterlegt werden, um die gemessenen Werte korrekt in Prozent der Bodenfeuchtigkeit umrechnen zu können. Da leider keine Datenblätter zu diesem Sensor zu finden sind, wurde die Kalibrierung des Sensors mit den zuvor ermittelten Werten durchgeführt.

Eine MATLAB®-Funktion berechnet auf Basis dieser Referenzwerte den Prozentwert der Bodenfeuchtigkeit. Da der Bereich, innerhalb dessen der Sensor die Bodenfeuchtigkeit messen kann, bereits in dem Kapitel Mess- und Vertrauensbereich bestimmt wurde, werden die ermittelten Werte als Minimum und Maximum festgelegt, die den Werten von bzw. entsprechen.

Nachdem der Sensor kalibriert wurde, können weitere Messungen in verschiedenen Umgebungen, wie zum Beispiel in einem Blumentopf, durchgeführt werden. Auf Grundlage der hinterlegten Referenzwerte liefert der Sensor nun realistische Werte für die Bodenfeuchtigkeit innerhalb des kalibrierten Bereichs.

Filterung der Messdaten

Abb. 13: Eingangssignal ungefiltert

Der Sensor weist Ausreißer auf, die so gut wie möglich eliminiert werden müssen, um zuverlässige Ergebnisse zu liefern. Diese Ausreißer sind in Abbildung 13 dargestellt. Drei Filtertypen wurden angewendet, um den bestmöglichen Filter zu ermitteln: das Rekursiv Gleitende Mittelwert Filter (RGM), das Median-Filter und das Tiefpassfilter. Diese Filter wurden in der Lehrveranstaltung Signalverarbeitende System behandelt und konnten somit für diese Untersuchung angewendet werden.

Abb. 14: Eingangssignal gefiltert

Das RGM erzeugt bei einem schwankenden Eingangssignal ein sehr stark geglättetes Ausgangssignal. Bei der Auslegung des Filters gilt es die Fensterbreite zu definieren, die angibt, wie viele Daten das Filter in die Berechnung mit einbezieht. Es ist zu beachten, dass ein Kompromiss zwischen guter Filterung und der Zeitverzögerung des gefilterten Signals zum Ursprungssignal eingegangen werden muss. Je größer die Fensterbreite, desto besser die Filterung. Allerdings steigt mit zunehmender Fensterbreite auch die zeitliche Verzögerung. Da dieser kapazitive Feuchtigkeitssensor jedoch nicht in Echtzeit arbeiten muss, ist eine geringe zeitliche Verzögerung des geglätteten Signals im Vergleich zum Originalsignal unproblematisch. Für diese praktische Anwendung ist die Verzögerung tolerierbar. Eine visuelle Darstellung der Ergebnisse ist in der unteren rechten Abbildung 15 zu sehen. Der verwendete Code für das Filter ist unten dargestellt.

%% Rekursiv Gleitender Mittelwert
function RGM = RekGleitenderMittelwert(x)
persistent n aSchieberegister % Festlegung persistenter Variablen
persistent bErsterDurchlauf % Festlegung persistenter Variable
if isempty (bErsterDurchlauf) % Erster Durchlauf nach Start
   n=160; % Größe des Schieberegisters auf 160 festgelegt
   aSchieberegister = x* ones (n,1); % Schieberegister mit aktuellen Wert besetzen
   bErsterDurchlauf = 1; % Bei erstem Durchlauf 1
end
for m=1:n-1 % Verschiebt die´Werte im Schieberegister um eine Position nach oben.
   aSchieberegister (m) = aSchieberegister (m+1); % Verschiebt den Wert an Position m+1 auf Position m
end
aSchieberegister (n) = x; % Fügt den neuen Wert hinzu
RGM = x; % RGM wird auf x gesetzt
RGM = sum(aSchieberegister)/n; % Gleitender Mittelwert wird berechnet, aus der Summe durch die Anzahl n
end

Somit wurde für die hier vorlegende Problemstellung eine Fensterbreite für das RGM von 160 festgelegt, wodurch eine sehr gute Filterung, der Ausreißer erzeugt werden konnte. In der Abbildung 14 ist ein direkter Vergleich des originalen analogen Signals zum gefilterten Ausgangssignals des RGM zu sehen.

Versuchsbeobachtung

Abb. 15: Dynamische Messung

Insgesamt wurden drei Messungen durchgeführt, bei denen das originale Sensorsignal mit dem Signal des Filters verglichen wurde. Die erste Messung diente der Erfassung der Schwankungen des Signals im statischen Zustand des Sensors. Die zweite Messung wurde zur Bestimmung der Schwankungen im dynamischen Zustand des Sensors durchgeführt. Anschließend konnte für die erste Messung im Ergebnis-Scope das originale mit dem gefilterten Signal verglichen werden. Das Ergebnis der statischen Messung ist bereits in der oberen Abbildungen 14 dargestellt.

Abb. 16: Messung in der Versuchsumgebung

Statische Messung: Während der statischen Messung zeigten sich hohe Schwankungen des originalen analogen Signals. Diese Schwankungen traten kontinuierlich über die gesamte Messdauer auf, lediglich einige wenige Ausreißer waren zusätzlich zu den Schwankungen vorhanden. Mit dem Einsatz des RGM-Filters konnte das originale Signal dennoch zufriedenstellend gefiltert werden. Leichte Schwankungen waren weiterhin vorhanden, hauptsächlich verursacht durch die Ausreißer. Das geglättete Signal zeigte insgesamt immer noch eine dynamische Änderung, die jedoch nicht vollständig vermieden werden konnte.

Dynamische Messung: Während der dynamischen Messung konnte eine Verbesserung der Signalstabilität festgestellt werden. Der RGM-Filter glättete das Eingangssignal gut und reagierte trotz kleiner Latenz immer noch schnell auf Änderungen des Signals. Es wurde festgestellt, dass der Sensor im statischen Betrieb, wenn ein Feuchtigkeitswert konstant ist, mehr Schwankungen und Ausreißer aufweist als im dynamischen Zustand, wenn sich die Feuchtigkeit ändert. Die dynamische Messung ist in der rechten Abbildung 15 zu dargestellt. Für diese Messung wurde der Sensor langsam in Wasser eingetaucht und wieder langsam herausgezogen.

Messung in der Versuchsumgebung: Die Versuchsumgebung des Sensors ist ein Blumentopf, der mit Erde gefüllt ist. Die Feuchtigkeit dieser Erde sollte mit dem Sensor gemessen werden. Da sich die Bodenfeuchtigkeit nur bedingt ändert und ansonsten konstant bleibt, wurde in diesem Fall Wasser in den Blumentopf gegossen, sodass der Sensor auf unterschiedliche Feuchtigkeitswerte reagieren musste. Wie aus den beiden vorherigen Messungen hervorgeht, sind Schwankungen im statischen Zustand vorhanden, nachdem ein Wert konstant bleibt. Sobald sich die Bodenfeuchtigkeit ändert und der Sensor darauf reagiert, ist das Signal nahezu ohne Schwankungen. Die Ergebnisse dieser Messung sind in der rechten Abbildung 16 zu sehen. Gut zu sehen ist, dass der maximale Spannungswert in trockener Erde bei liegt, was lediglich einen Unterschied von zum maximalen Spannungswert ist, welcher in dem Kapitel Mess- und Vertrauensbereich ermittelt wurde. Somit konnte der Messbereich des Sensors über die beiden Tests sehr genau bestimmt werden, ohne das Datenblätter zur Verfügung standen. Des Weiteren ist zu sehen, dass das gefilterte Sensorsignal bei konstanter Feuchtigkeit stark geglättet ist und kaum noch Ausreißer aufweist. Die Ausschläge nach unten, die bei circa 4 Sekunden und 17 Sekunden zu sehen sind, kamen durch einen direkten Kontakt des Wassers mit dem Sensor. Direkt anschließend steigt der Spannungswert wieder, was eine geringere Feuchtigkeit bedeutet, da das Wasser vom Sensor abgeflossen ist und sich in der Erde verteilt hat.

Auswertung

Die Messhypothese: "Die Bodenfeuchtigkeit lässt sich mit dem Capacitive Soil Moisture Sensor v1.2 messen." konnte bestätigt werden. Mit dem RGM-Filter konnte die hohe Anzahl an Ausreißern effektiv geglättet werden, wodurch der Sensor letztendlich zuverlässige Ergebnisse liefern konnte.

Durch die effiziente Filterung des analogen Eingangssignals ist die Messunsicherheit der Werte auf lediglich reduziert worden (siehe Abbildung 12 Messergebnisse der statischen Messung). Ohne Filter zeigt der Sensor jedoch eine hohe Ungenauigkeit und ist unter gleichen Versuchsbedingungen nur schwer anzuwenden, da keine zuverlässigen Ergebnisse erzielt werden können.

Wie zuvor beschrieben, ist das Einsatzgebiet des Sensors im Wesentlichen nicht auf Echtzeitdatenverarbeitung angewiesen. Eine Verzögerung von 2 Sekunden bei der Änderung der gemessenen Bodenfeuchtigkeit aufgrund des Filters ist daher akzeptabel. In diesem Versuch wurde eine Fensterbreite des RGM-Filters von 160 Werten gewählt. Eine geringere Anzahl an betrachteten Werten führt zu einer relativ guten Filterung des Signals mit geringerer Latenz. Hier wurde jedoch der Kompromiss gemacht, dass eine bessere Filterung für ein genaueres Ergebnis Vorrang vor der zeitlichen Anforderung hat.

In der unteren Abbildung 17 ist das Messergebnis aus dem Ergebnisvideo zu sehen. Für diese Endauswertung wurde neben dem analogen Eingangssignal und dem gefilterten Signal auch der Prozentwert in dieses Scope geführt, sodass die Bodenfeuchtigkeit für die Endauswertung auch in Prozent zu sehen ist.

Abb. 17: Messung Ergebnisvideo


Bereits zu Beginn der Messung zeigte der Sensor eine Feuchtigkeit von etwa , was einer Spannung von entspricht. Das liegt daran, dass die verwendete Erde aufgrund der Wetterbedingungen nicht ganz trocken war. Sobald Wasser hinzugefügt wurde, konnte beobachtet werden, dass die Spannung abnahm und gleichzeitig der Prozentwert stieg. Abschließend kann gesagt werden, dass der Sensor zuverlässig funktioniert und plausible Ergebnisse liefert. Des Weiteren ist durch den MATLAB®-Function Block eine Umrechnung in Prozent möglich, wodurch diese für ein einfacheres Verständnis der Bodenfeuchtigkeit dargestellt werden kann.

Das vollständige Ergebnisvideo findet sich hier: Ergebnisvideo

Zusammenfassung und Ausblick

Zusammenfassung

Bei diesem Projekt in der Lehrveranstaltung Angewandte Informatik galt es einen Sensor genauer zu betrachten, wobei der Messbereich und die Unsicherheit ermittelt werden sollten. Bei dieser Versuchsdurchführung wurde der Capacitive Soil Moisture Sensor v1.2 bearbeitet. Dieser liefert analoge Signale, die in eine Spannung umgerechnet werden müssen. Anhand dieser Werte kann der Messbereich und die Unsicherheit bestimmt werden. Es wurden verschiedene Tests zur Erfüllung der Anforderung durchgeführt, die in den Abbildungen dokumentiert worden sind. Des Weiteren wurde ein Ergebnisvideo angefertigt, bei dem der Sensor in einem Blumentopf mit Erde gesteckt und langsam Wasser dazu gegossen wird, damit sich die Bodenfeuchtigkeit ändert. Bei einem stabilen Spannungswert, wenn die Bodenfeuchtigkeit konstant ist, wird über den Buzzer ein Piepton ausgegeben.

Diskussion der Ergebnisse

Da für diesen Sensor keine Datenblätter verfügbar sind, mussten die genauen Maximal- und Minimalwerte selbst ermittelt werden. Auf Basis dieser Daten wurden sowohl der Messbereich als auch die Kalibrierung des Sensors durchgeführt. Mit einem Sensor, für den mehr Datenblätter und Referenzwerte einsehbar sind, wäre eine genauere Ermittlung des Messbereichs und der Messunsicherheit möglich. Dennoch zeigt sich, dass dieser Sensor auch ohne Datenblätter gut kalibriert und festgelegt werden konnte.

Nach der Kalibrierung des Sensors konnten in verschiedenen Testumgebungen zuverlässige und reproduzierbare Ergebnisse erzielt werden. Ohne den Einsatz eines Filters zeigte der Sensor jedoch ein Signal mit vielen Ausreißern, was zu hohen Schwankungen in den Ergebnissen führte. Durch den Einsatz des RGM-Filters mit einer Fensterbreite von 160 Werten wurde, wie bereits beschrieben, ein Kompromiss zwischen Genauigkeit und zeitlicher Verzögerung gefunden, wodurch ein geglättetes Signal erzeugt wird.

Ausblick

Für zukünftige Untersuchungen sollten unbedingt Referenzwerte von den Herstellern eingeholt werden. Diese Informationen würden eine genauere Ermittlung des Messbereichs und der Messunsicherheit ermöglichen und die Kalibrierung des Sensors erheblich verbessern. Eine präzisere Filterauslegung könnte ebenfalls in Betracht gezogen werden, um die Schwankungen des ursprünglichen Signals weiter zu minimieren. Hierbei müsste der Filter genauer untersucht und möglicherweise angepasst werden.

Ein wichtiger Aspekt dabei ist die begrenzte Kapazität des Arduino Uno zur Speicherung komplexer Modelle. Der Arduino Uno verfügt nur über begrenzten Speicherplatz, der bei größeren Fensterbreiten schnell ausgelastet ist. Diese Einschränkung stellte eine Herausforderung bei der aktuellen Projektdurchführung dar und begrenzte die Größe der verwendeten Fensterbreite des Filters.

Für eine präzisere Filterauslegung könnte in zukünftigen Projekten der Einsatz eines Mikrocontrollers mit größerem Speicher in Betracht gezogen werden. Alternativ könnten auch optimierte Algorithmen zur Filterung entwickelt werden, die weniger Speicherplatz benötigen. Diese Ansätze würden es ermöglichen, eine größere Anzahl von Messwerten zu berücksichtigen, ohne die Leistungsfähigkeit des Systems zu beeinträchtigen.

Zusammenfassend lässt sich sagen, dass die Einholung von Referenzwerten vom Hersteller und die Untersuchung präziserer Filterauslegungen wesentliche Schritte für zukünftige Untersuchungen sind. Trotz der begrenzten Kapazität des Arduino Uno bieten diese Ansätze vielversprechende Möglichkeiten zur Verbesserung der Messgenauigkeit und Zuverlässigkeit des Capacitive Soil Moisture Sensors v1.2.

Selbstreflexion/Lessons learned

Während der Durchführung des Projekts wurden wesentliche Aspekte der Signalverarbeitung vertieft. Die Grundlagen hierfür wurden bereits in den Lehrveranstaltungen Signalverarbeitende Systeme und Angewandte Informatik geschaffen. Die Bearbeitung dieser Aufgabe bot die Gelegenheit, das theoretische Wissen aus diesen Kursen in die Praxis umzusetzen und zu vertiefen.

Die Arbeit an diesem Projekt stellte einen guten Abschluss der beiden Lehrveranstaltungen dar und ermöglichte einen genaueren Einblick in die praktische Anwendung der Signalverarbeitung. Dabei konnten die theoretischen Konzepte auf eine reale Problemstellung angewendet werden, was die Lerninhalte noch greifbarer und verständlicher machte.

Insbesondere die Herausforderungen bei der Filterung und Kalibrierung des Sensors sowie der Umgang mit der begrenzten Speicherkapazität des Arduino Uno boten wichtige praktische Erfahrungen. Diese Erfahrungen konnten das Verständnis für die Komplexität der Signalverarbeitungstechniken erweitern und einen grundlegenden Einblick in die Problemlösung solcher Versuche geben.

Zusammengefasst war das Projekt eine wertvolle praktische Ergänzung zu den theoretischen Inhalten der Lehrveranstaltungen und trug maßgeblich dazu bei, die Kompetenz in der Signalverarbeitung und angewandten Informatik zu stärken.

Ergebnisvideo

Ergebnisvideo der Versuchsdurchführung

In diesem Ergebnisvideo ist die Messung der Bodenfeuchtigkeit mit dem Capacitive Soil Moisture Sensor v1.2 zu sehen. Dieses Video wurde aufgenommen, nachdem der Messbereich definiert, der Sensor anhand von Referenzwerten kalibriert wurde und das Eingangssignal durch ein auf diese Problemstellung ausgelegtes Rekursives Gleitendes Mittelwertfilter geglättet wird. Für dieses Video wurde die Dauer der Messung von 20 Sekunden auf 30 Sekunden erhöht.

Ergebnisvideo des Capacitive Soil Moisture Sensors v1.2


Lernzielkrontrolle

Beantworten Sie in Ihrem Wiki-Artikel die Lernzielkontrollfragen.

Literatur

[1] HSHL Wiki: BSE Angewandte Informatik - SoSe24. URL: https://wiki.hshl.de/wiki/index.php/BSE_Angewandte_Informatik_-_SoSe24, 14. Juli 2024
[2] BIGDATA-Insider: Was ist Simulink?. URL: https://www.bigdata-insider.de/was-ist-simulink-a-790857/, 14. Juli 2024
[3] Acoweb: Wie funktioniert eine kapazitive Feuchtemessung. URL: https://www.acoweb.de/wie-funktioniert-eine-kapazitive-feuchtemessung, 14. Juli 2024
[4] Starthardware: Arduino Uno. URL: https://starthardware.org/arduino-uno/, 14. Juli 2024
[5] HSHL Wiki: Steckbrett. URL: https://wiki.hshl.de/wiki/index.php/Steckbrett, 14. Juli 2024
[6] HSHL Wiki: LCD Modul 16x02 I2C. URL: https://wiki.hshl.de/wiki/index.php/LCD_Modul_16x02_I2C, 14. Juli 2024
[7] Fundunio: Piezo Speaker 5V. URL: https://funduinoshop.com/bauelemente/passive-bauelemente/buzzer-und-lautsprecher/piezo-speaker-5v/lautsprecher-kompatibel-mit-arduino, 17. Juli 2024
[8] Thecavepearlproject: Hacking a Capacitive Soil Moisture Sensor for Frequency Output. URL: https://thecavepearlproject.org/2020/10/27/hacking-a-capacitive-soil-moisture-sensor-for-frequency-output/, 22. Juli 2024
[9] YouTube: Kapazitiver Bodenfeuchtesensor, einfach erklärt!. URL: https://www.youtube.com/watch?v=ckKN4gV62tk, 14. Juli 2024
[10] Fundunio: Kapazitiver Feuchtigkeitssensor. URL: https://funduinoshop.com/elektronische-module/sensoren/feuchtigkeit/kapazitiver-feuchtigkeitssensor, 14. Juli 2024
[11] Sunfounder: Component Soil. URL: https://docs.sunfounder.com/projects/umsk/de/latest/01_components_basic/02-component_soil.html, 14. Juli 2024
[12] Mikrocontroller: AVR-Tutorial: ADC. URL: https://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC, 14. Juli 2024

Anhang


→ zurück zum Hauptartikel: BSE Angewandte Informatik SoSe24 | Hausarbeit SoSe24