Aufgabe Vorschlag B - Aufgabe 2 - Mikrocontroller program… · Abitur Hessen Elektrotechnik LK 2022

Thema: Mikrocontroller programmieren (Arduino) · Aus der Prüfung LK (2022)

Aufgabenstellung

In manchen Gebieten sind die Menschen einer überdurchschnittlich hohen Radioaktivität ausgesetzt, welche u. a. natürliche Ursachen hat. So kann beispielsweise radioaktives Gas, z. B. Radon, aus dem Erdreich in Kellerräume eindringen. Um entsprechende Gegenmaßnahmen planen zu können, ist eine Langzeitmessung der radioaktiven Strahlung erforderlich. Tragbare Geräte, welche Messdaten nicht nur erfassen, sondern auch mithilfe von Mikrocontrollern verarbeiten können, können hier zweckdienlich sein. Für die Entwicklung solcher Geräte existiert bereits ein Ansatz (Material 3 und 4).

Material 3 zeigt die unvollständige Beschaltung des Mikrocontrollers. Der Zählrohrbaustein enthält ein Geiger-Müller-Zählrohr. Gelangt ein Teilchen der radioaktiven Strahlung in das Zählrohr, so entsteht ein kurzer Spannungsimpuls, der im Zählrohrbaustein verstärkt wird und danach an Pin 2 gelangt. An den Pins 4 bis 9 ist ein LCD-Baustein zur Anzeige von Messwerten angeschlossen.

Material 4 zeigt den unvollständigen Programmcode für den Mikrocontroller. Innerhalb der Prozedur setup werden zwei Interrupts, die jeweils auf die ansteigende Flanke von Impulsen reagieren, definiert und aktiviert. Löst der Impuls des Zählrohrs einen Interrupt aus, so wird die Prozedur zaehlenImpulse aufgerufen. Der bei Betätigung des Tasters erzeugte Impuls löst einen Interrupt aus, der zum Aufruf der Prozedur zaehlenTaster führt. Innerhalb der Prozedur loop werden drei weitere Prozeduren aufgerufen, deren Code noch nicht existiert.

Hinweise: Die im Programmcode verwendete Abkürzung CPM ist eine Maßeinheit und steht für „Counts per minute“. Sie gibt an, wie viele Impulse pro Minute von einem Zählrohr erzeugt wurden. Es handelt sich also um eine Zählrate.

Material 3

Beschaltung des Mikrocontrollers, unvollständig

Material 4

Programmcode (unvollständig)

#include <LiquidCrystal.h> //LCD-Bibliothek wird importiert

//LCD-Objekt wird erzeugt, Anschlusspins werden übergeben

LiquidCrystal lcd(9,8,7,6,5,4);

//Konstanten und Variablen werden definiert und initialisiert

#define zaehlrohr 2

#define taster 3

#define gelbeLED 12

#define roteLED 13

int zaehlerImpulse = 0; //zählt die Impulse des Zählrohrs

int zaehlerTaster = 0; //zählt die Betätigungen des Tasters

int zaehlerMinuten = 0; //zählt die Minuten (ab Programmstart)

int aktuellCPM = 0; //speichert den zuletzt berechneten cpm-Wert

int mittelCPM = 0; //speichert den Mittelwert aller cpm-Werte ohne

//Nachkommastellen

int maximalCPM = 0; //speichert den größten cpm-Wert

int summeCPM = 0; //speichert die Summe aller cpm-Werte

const int grenzwertCPM = 20; //Grenzwert in cpm

void setup()

{

pinMode(zaehlrohr, INPUT);

pinMode(taster, INPUT);

pinMode(gelbeLED, OUTPUT);

pinMode(roteLED, OUTPUT);

Serial.begin(9600); //Serieller Monitor mit 9600 bps wird geöffnet

lcd.begin(16, 2); //LCD mit 16 Zeichen und zwei Zeilen wird festgelegt

lcd.clear(); //Der Inhalt des LCDs wird gelöscht

lcd.print("BITTE WARTEN"); //Der Text BITTE WARTEN wird ausgegeben

//Interrupt für Zählrohrimpulse wird definiert und aktiviert

attachInterrupt(digitalPinToInterrupt(zaehlrohr),zaehlenImpulse,RISING);

//Interrupt für Tasterimpulse wird definiert und aktiviert

attachInterrupt(digitalPinToInterrupt(taster),zaehlenTaster,RISING);

}

void loop()

{

delay(60000);

zaehlerMinuten++;

wertebestimmenCPM();

ausgebenLCD();

pruefenGrenzwert();

}

void zaehlenImpulse()

{

zaehlerImpulse++;

}

void zaehlenTaster()

{

zaehlerTaster++;

ausgebenLCD();

}

void ausgebenLCD()

{

//Hier findet die Ausgabe auf dem LCD statt

}

void wertebestimmenCPM()

{

Hier fehlt Programmcode

}

void pruefenGrenzwert()

{

Hier fehlt Programmcode

}

Material 5

Informationen zur Verwendung des seriellen Monitors

Wichtige Funktionen

Serial.begin()

Der serielle Monitor wird geöffnet und die Geschwindigkeit der Datenübertragung in bit pro Sekunde wird festgelegt.

Beispiel:

Serial.begin(9600);

Serial.print()

Text sowie Inhalte von Variablen werden auf dem seriellen Monitor ausgegeben.

Beispiel:

Ausgabe von einem Text und dem Inhalt der variablen Zahl.

Serial.print("Zahlenwert: "+zahl);

Serial.println()

Identisch mit dem Befehl Serial.print(), jedoch folgt nach der Ausgabe ein Zeilenumbruch.

Material 6

Programmcode der Prozeduren suchen1 und suchen2

void suchen1()

{

for(int i = 0; i < 1440; i++)

{

if(werte[i] > grenzwertCPM)

{

Serial.print("INDEX:"+i);

Serial.println(" WERT:"+werte[i]);

}

delay(4000);

}

}

void suchen2()

{

int index = 0;

int maximum = werte[0];

for(int i = 1; i < 1440; i++)

{

if(werte[i] > maximum)

{

maximum = werte[i];

index = i;

}

}

Serial.print("INDEX:"+index);

Serial.println(" Max.:"+maximum);

}

2.2

Innerhalb der Prozedur loop (Material 4) wird die Prozedur wertebestimmenCPM in Abständen von jeweils einer Minute aufgerufen. Sie muss drei Werte bestimmen und in den Variablen aktuellCPM, mittelCPM sowie maximalCPM ablegen. Die Zählrate der letzten Minute ist in aktuellCPM abzulegen. Der Mittelwert (Durchschnitt) und der Maximalwert aller seit dem Programmstart gemessenen Zählraten sind in den Variablen mittelCPM bzw. maximalCPM abzulegen.

Implementieren Sie den Programmcode der Prozedur wertebestimmenCPM. [6 BE]

void wertebestimmenCPM()

{

}

2.3

Der bei Betätigung des Tasters erzeugte Interrupt (Material 4) bewirkt das Hochzählen der Variable zaehlerTaster und den Aufruf der Prozedur ausgebenLCD. Diese Prozedur soll verschiedene Informationen auf dem LCD-Baustein ausgeben. Wurde der Taster seit dem Programmstart nicht betätigt, so ist der Text "Aktuell:" und der Inhalt der Variablen aktuellCPM auszugeben. Nach einmaliger Betätigung wird der Text "Mittel:" und der Inhalt der Variablen mittelCPM ausgegeben. Eine weitere Betätigung bewirkt die Ausgabe des Textes "Maximal:" und des in der Variablen maximalCPM gespeicherten Wertes. Weitere Betätigungen des Tasters bewirken, dass die gerade beschriebenen Ausgaben in derselben Reihenfolge erneut durchgeführt werden.

Bei jeder Ausgabe muss hinter der jeweiligen Zahl immer die Maßeinheit cpm erscheinen. Vor jeder Ausgabe muss das Display gelöscht werden.

Entwickeln und zeichnen Sie ein Struktogramm oder einen Programmablaufplan für die Abläufe in der Prozedur ausgebenLCD unter Beachtung aller genannten Informationen. [10 BE]

2.4

Die Prozedur pruefenGrenzwert (Material 4) soll ergründen, ob die in den Variablen aktuellCPM und mittelCPM gespeicherten Werte den Grenzwert überschreiten, der in der Konstante grenzwertCPM gespeichert ist. Ist dies bei aktuellCPM der Fall, soll die gelbe LED eingeschaltet werden. Die rote LED soll leuchten, wenn der Wert von mittelCPM über dem Grenzwert liegt. Beide LEDs müssen ausgeschaltet werden, wenn die jeweiligen Bedingungen für das Einschalten nicht mehr erfüllt sind.

Implementieren Sie den Programmcode der Prozedur pruefenGrenzwert. [8 BE]

void pruefenGrenzwert()

{

}

2.5 Das in Material 4 dargestellte Programm soll einen größeren Funktionsumfang erhalten. Um nach einer Langzeitmessung von 24 Stunden auf alle pro Minute ermittelten Zählraten (cpm-Werte) zugreifen zu können, ist deren Speicherung in einem Array notwendig. Dieses Array wird mit int werte[1440] definiert.

2.5.1

Beschreiben Sie den informationstechnischen Begriff Array. Erläutern Sie einen Vorteil der Verwendung von Arrays im Vergleich zu einzelnen Variablen. [4 BE]

2.5.2

Berechnen Sie den Speicherplatz des Arrays werte im RAM. [2 BE]

2.5.3

Das Array werte sei vollständig mit Werten gefüllt und soll durchsucht werden. Dabei sollen nicht nur bestimmte Werte gefunden werden, sondern auch die zugehörigen Indizes (Positionen im Array). Über diese Indizes kann jedem Wert ein Zeitpunkt zugeordnet werden. In der Testphase des Programmcodes soll die Funktion mithilfe von Ausgaben auf dem seriellen Monitor geprüft werden. Das Material 6 enthält den Programmcode von zwei entsprechenden Prozeduren mit den Bezeichnungen suchen1 und suchen2. Erklären Sie die programmtechnischen Abläufe, welche in diesen Prozeduren realisiert sind.

Hinweise: Beide Prozeduren erzeugen Ausgaben auf dem seriellen Monitor. Alle diesbezüglichen Funktionen sind in Material 5 erklärt.

[14 BE]

Aufgabenstellung: Aufgabe Vorschlag B - Aufgabe 2 - Mikrocontroller program… · Abitur Hessen Elektrotechnik LK 2022

Lösung

Nach den offiziellen Korrekturhinweisen

2.2 Implementieren Sie den Programmcode der Prozedur wertebestimmenCPM.

Lösung: ```c aktuellCPM = zaehlerImpulse; zaehlerImpulse = 0; summeCPM = summeCPM + aktuellCPM; mittelCPM = summeCPM / zaehlerMinuten; if (aktuellCPM > maximalCPM) { maximalCPM = aktuellCPM; } ``` ```c aktuellCPM = zaehlerImpulse; zaehlerImpulse = 0; summeCPM += aktuellCPM; mittelCPM = summeCPM / zaehlerMinuten; if (aktuellCPM > maximalCPM) { maximalCPM = aktuellCPM; } ```

2.3 Entwickeln und zeichnen Sie ein Struktogramm oder einen Programmablaufplan für die Abläufe in der Prozedur ausgebenLCD unter Beachtung aller genannten Informationen.

Lösung:

2.4 Implementieren Sie den Programmcode der Prozedur pruefenGrenzwert.

Lösung: ```c if (aktuellCPM > grenzwertCPM) { digitalWrite(gelbeLED, HIGH); } else { digitalWrite(gelbeLED, LOW); } if (mittelCPM > grenzwertCPM) { digitalWrite(roteLED, HIGH); } else { digitalWrite(roteLED, LOW); } ``` ```c if (aktuellCPM > grenzwertCPM) { digitalWrite(gelbeLED, HIGH); } else { digitalWrite(gelbeLED, LOW); } if (mittelCPM > grenzwertCPM) { digitalWrite(roteLED, HIGH); } else { digitalWrite(roteLED, LOW); } ``` ```c digitalWrite(gelbeLED, aktuellCPM > grenzwertCPM ? HIGH : LOW); digitalWrite(roteLED, mittelCPM > grenzwertCPM ? HIGH : LOW); ```

2.5.1 Beschreiben Sie den informationstechnischen Begriff Array. Erläutern Sie einen Vorteil der Verwendung von Arrays im Vergleich zu einzelnen Variablen.

Lösung: Das Array ist ein komplexer Datentyp, der mehrere Daten des gleichen Typs (z. B. Integer-Werte) aufnehmen kann. Der Zugriff auf die Daten erfolgt über Indizes. Vorteil: Wenn mehrere logisch zusammenhängende Daten desselben Typs verarbeitet werden müssen, muss nur ein einziger Datentyp bzw. Bezeichner definiert werden. Der Zugriff auf die Elemente kann innerhalb von Schleifen über den Index erfolgen, wodurch der Programmieraufwand deutlich verringert wird.

2.5.2 Berechnen Sie den Speicherplatz des Arrays werte im RAM.

Lösung: 2880 Byte / 23040 Bit

2.5.3 Erklären Sie die programmtechnischen Abläufe, welche in diesen Prozeduren realisiert sind.

Lösung: In der Prozedur suchen1 wird mittels einer Zählschleife das komplette Array werte durchlaufen. Dabei wird jeder gespeicherte Wert mit einem Grenzwert verglichen, welcher in der Konstanten grenzwertCPM gespeichert ist. Zwischen den Vergleichen wird die Programmausführung für vier Sekunden gestoppt (delay(4000)). Liegt der Wert über dem Grenzwert, so wird dieser Wert und dessen Index (Position im Array) auf dem seriellen Monitor ausgegeben. Andernfalls passiert nichts. Die Prozedur suchen2 sucht den größten Wert (Maximum), welcher im Array werte existiert. Zunächst wird angenommen, dass dieser Wert unter dem Index 0 gespeichert wurde. Die Variablen maximum und index werden entsprechend initialisiert. Anschließend wird das Array werte mittels einer Zählschleife durchlaufen. Dabei wird jeder gespeicherte Wert mit dem aktuellen Maximalwert verglichen, welcher in der Variablen maximum gespeichert ist. Ist dieser Wert größer, so wird er in der Variablen maximum gespeichert. Der zugehörige Index wird in der Variablen index gespeichert. Am Ende der Prozedur erfolgt die Ausgabe der Inhalte, welche in den Variablen maximum und index gespeichert sind, auf dem seriellen Monitor.

Die ausführliche Erklärung Schritt für Schritt (mit KI) gibt es mit Premium. Premium

Löse sie direkt hier: automatische Korrektur, Hinweise und Lösung Schritt für Schritt.

‹ Aufgabe Vorschlag A - Aufgabe 2 - Mikrocontroller program… · LK 2022 · Aufgabe Vorschlag C - Aufgabe 4.2 - Mikrocontroller progr… · LK 2022 ›

Mehr Aufgaben zu Mikrocontroller programmieren (Arduino)