In den einzelenen Abschnitten wurden Übungsaufgaben gestellt um das Gelernte zu vertiefen. Diese sollten selbständig erarbeitet werden. Hier finden Sie Lösungsvorschläge für die gestelleten Aufgaben um diese mit ihren Lösungen zu vergleichen.

Lösung Übung 1

Aufgabe

Erweitern Sie zur Übung die Anwendung um eine weitere ErrorLED an Pin B1. Orientieren sie sich an den obigen Arbeitsschritten. Lassen Sie die ErrorLED im Gegentakt zur StatusLED blinken.

Lösung:

Controller::onWork()
statusLED.on();
errorLED.off();
waitMs(100);
statusLED.off();
errorLED.on();
waitMs(100);

Lösung Übung 2

Aufgabe

Erweitern Sie zur Übung die Anwendung um eine weitere Taste an Pin A1. Orientieren sie sich an den obigen Arbeitsschritten. Die Erweiterung der Lösung soll folgende Anforderungen erfüllen:

  • wenn die Funktionstaste gedrückt ist soll die Anzeige-LED leuchten
  • wenn die Zusatztaste gedrückt ist soll die Anzeige-LED blinken
  • wenn beide Tasten gedrückt sind hat die Zusatztaste Vorrang
  • wenn keine Taste gedrückt ist soll die Anzeige-LED aus sein

Lösung:

Controller::onWork()
if (additionalKey.getState()==0) 
{
	indicatorLED.toggle();	// AnzeigeLED blinkt
	waitMs(200);
}
else if (functionKey.getState()==0) 
{
	indicatorLED.on();	// AnzeigeLED leuchtet
}
else   // SONST
{
	indicatorLED.off();	// AnzeigeLED aus
}

Lösung Übung 3

Aufgabe

Erweitern Sie zur Übung die Anwendung um eine Reaktion beim loslassen der Funktionstaste nach dem langen halten (onHoldEnd). Beim Loslassen der gehaltenen Taste soll die Anzeige-LED kurz aufblitzen (flash).

Lösung:

FunctionKey::onHoldEnd()
app.indicatorLED.flash();

Lösung Übung 4

Aufgabe

Ändern Sie zur Übung die Anwendung wie folgt:

  1. Änderung: Kommentieren Sie den Code in onTimer10ms aus und lassen den Speaker in onWork toggeln.
    Bilden und Testen Sie diese geänderte Anwendung.
    Vergleichen und bewerten Sie das akustische Ergebnis.
    1. Der Ton ist viel höher. Was bedeutet das?
    2. Der Ton hat ist nicht durchgehend sondern hat Störungen. Warum?
  2. Änderung: Fügen Sie in onWork mit waitMs eine Wartezeit von 500 ms ein.
    Bilden und Testen Sie diese geänderte Anwendung.
    Vergleichen und bewerten Sie das optische und akustische Ergebnis.
    1. Der Ton ist nur noch ein Knacksen.
    2. Das Timing der Blinkenden LEDs hat sich verändert.

Ziehen Sie aus dem Ergebnis dieser Änderungen Schlussfolgerungen für die Anwendung von Wartefunktionen.

Lösung

Controller::onWork()
uint8_t brightness=5; // 1 .. 255
yellowLED.on();
for (int i=brightness; i>0; i--);
yellowLED.off();
for (int i=255-brightness; i>0; i--);
 
speaker.toggle(); // only this change make the tone frequency higher
waitMs(500); 	  // add this change and the the timing is corrupt

Lösung Übung 5

Aufgabe

Fügen Sie einen Taster als SendenTaste der Systemlösung hinzu. Stellen Sie die Lösung so um, dass die Datenübertragung im 100 Millisekunden Systemereignis onEvent100ms() erfolgt wenn die Taste Senden betätigt ist.

Lösung

Controller::onEvent100ms()
if (buttonSend.isPressed())
{
	counter++;
	terminal.writeByte(counter);
}

Lösung Übung 6

Aufgabe

Erweitern Sie zur Übung die Anwendung um eine ErrorLED. Die ErrorLED soll bei Sensorwerten unter 100 leuchten.

Lösung

Controller::onWork()
uint8_t value;
value=sensor.getValue();
terminal.writeByte(value);
 
if ( value<100 )
{
	errorLED.on();
}
else
{
	errorLED.off();
}
 
waitMs(10);

Lösung Übung 7

Aufgabe

Erweitern Sie zur Übung die Anwendung um eine UART-Verbindung mit 19200 BAUD zum SiSy-ControlCenter. Senden sie die PWM-Werte für die Ansteuerung der LED als 8 Bit Zahlen an das SiSy-ControlCenter. Verfolgen Sie den Signalverlauf in der Oszi-Ansicht des ControlCenters.

Lösung

Controller::onWork
//-----------------------------------------------------
// duty++;
// if (duty>=1000)
//     duty=0;
// pwm.setDuty(duty);
//-----------------------------------------------------
// atmende LED mit Exponentialfunktion pwm 0-1000 
// beachte #include math.h
duty++;
uint16_t dimValue;
if      (duty<1000) dimValue = pow(1.00693,duty);
else if (duty<2000) dimValue = pow(1.00693,2000-duty);
else                duty=0;
//-----------------------------------------------------
pwm.setDuty(dimValue);
terminal.writeByte((uint8_t)(dimValue/4));
waitMs(1);

Lösung Übung 8

Aufgabe

Erweitern Sie zur Übung die Anwendung um eine LED die bei jedem Trigger-Event umschaltet (toggle).

Lösung:

Controller::onWork
counter++;
app.terminal.writeByte(counter);
indicatorLED.toggle();

Lösung Übung 9

Aufgabe

Erweitern Sie die Anwendung um eine Zweite Taste mit einem UART-Terminal. Bei jedem Tastendruck soll ein Zähler hochgezählt werden und mit 19200 Baud an das SiSy-Controlcenter gesendet werden.

Lösung:

FunctionKey::onPinEvent
indicatorLED.toggle();
counter++;
app.terminal.writeByte(counter);

Lösung Übung 10

Aufgabe

Erweitern Sie die Anwendung um eine AlarmLED. Die AlarmLED soll bei Sensorwerten unter 100 schnell Blinken (flicker).
Bei werten über 100 ist die LED aus. Nutzen Sie für die AlarmLED das Pin B4. Geben Sie die Information „OK“ oder „ALARM“ zusätzlich auf dem Display aus.

Lösung:

Controller::onWork()
// lese Analogwert ein
uint16_t value;
value=sensor.getValue();
// formatiere die Textausgabe ------------------
String txt;
txt.format("Value=%d  ",value);
// Textausgabe Analogwert in der ersten Zeile --
display.home();
display.write(txt);
// Balken als Anzeige in der zweiten Zeile -----
display.setPos(1,2);
for (uint16_t i=0; i<16; i++ )
{
	if (i<=value/64) display.write("*");
	else             display.write(" ");
}
 
if (value<100)	alarmLED.flicker();
else		alarmLED.off();
 
// dem Auge Zeit lassen das Display zu lesen ---
waitMs(100);

Lösung Übung 11

Aufgabe

Erweitern Sie die Anwednung. Nutzen Sie das Text-LCD um die Sensordaten anzuzeigen!

Lösung

Controller::onWork
// continuous event from the Mainloop
temperatur=sensorBus1.temperaturSensor.getRawValue();
String txt;
txt.format("\ntemp=%d",temperatur);
terminal.writeString(txt);
 
display.setPos(1,1);
display.write("Temperatur");
display.setPos(1,2);
txt.format("%d Grad",temperatur/10);
display.write(txt);
 
waitMs(100);

Lösung Übung 12

Aufgabe

Erweitern Sie beide Lösungen so, dass diese jeweils eine SendeTaste und eine EmpfangsLED besitzen und die Board 1 an 2 und Board 2 an ein sendet.

Lösung:

Controller::onWork
...

Lösung Übung 13

Aufgabe

Erweitern Sie zur Übung die Anwendung um die Funktionalität das System per UART fernsteuern zu können. Das Protokoll soll folgende Kommandos umfassen:

  • E, Betriebsmodus ECO
  • N, Betriebsmodus NORMAL
  • S, Betriebsmodus SPEED
  • O, System ausschalten OFF
  • A, Alarm

Lösung:

Controller::onWork
...