Aufgabe
Der
Händetrockner soll so programmiert werden, daß, sobald die Lichtschranke
unterbrochen wird, der Lüfter ein- und nach 5 Sekunden wieder ausgeschaltet
wird. So der Text aus "Computing Starter". Dazu wird an M1 der
Ventilator (Propeller) und an M2 eine Linsenlampe angeschlossen. An E1 ist der
Phototransistor angeschlossen (auf Polung achten). Phototransistor und Lampe
bilden eine Lichtschranke
Anwendungskonstanten
mVentilator = 1; mLampe = 2;
eLichtschranke = 1;
Beschriftung der Textfelder
clblTitel = 'Händetrockner 1';
clblE: array[1..8] of string = ('Lichtschranke',
'E2', 'E3', 'E4', 'E5', 'E6', 'E7', 'E8');
clblM: array[1..4] of string = ('Ventilator', 'Lichtschranke',
'M3', 'M4');
fishMain
begin
ftiSetMotor(mLampe, ftiEin);
ftiWaitForTime(Werte(wAnlaufzeit));
repeat
// --- Endlosschleife, Ende : HALT-Button
if not ftiGetInput(eLichtschranke) then begin
ftiSetMotor(mVentilator, ftiEin);
printStatus('trocknet');
ftiWaitForTime(Werte(wTrockenzeit));
ftiSetMotor(mVentilator, ftiAus);
end;
printStatus('bereit');
until ftiFinish(0);
end;
Was passiert da?
Die Lampe der Lichtschranke wird eingeschaltet, dem Phototransistor wird 1
Sekunde (1000 Millisekunden) Zeit zum sicheren Erkennen der Lampe gelassen, dann
startet die repeat ... until Schleife. Dort wird die Lichtschranke (Phototransistor)
abgefragt, ob sie unterbrochen wurde. In diesem Fall wird der Ventilator für 5
Sekunden eingeschaltet und dann wieder abgeschaltet. Die repeat ... until Schleife
wiederholt sich bis sie (ftiFinish(0)) einen Abbruchwunsch erkennt. Das ist hier
der HALT-Button auf der Form, dann wird das Programm beendet.
Erweiterungen
Anzeige des Betriebszustandes in der Statuszeile :
printStatus('trocknet');
printStatus('bereit');
printStatus gibt einen Text in die Statuszeile aus. Der Text
"trocknet" sollte nach Einschalten des Ventilators erscheinen, der
Text bereit, wenn die Lichtschranke steht, aber der Ventilator nicht läuft.
Variable Zeiten.
In die Felder "Steuerwerte" können beliebige numerische Werte
eingegeben werden. Den oberen nennen wir Anlaufzeit und den unteren Trockenzeit.
Dazu muß die Beschriftung der Textfelder erweitert werden :
Const wAnlaufzeit = 1; wTrockenzeit = 2;
clblW: array[1..2] of string = ('Anlaufzeit', 'Trockenzeit');
ctxtW: array[1..2] of string = ('1000', '5000');
und in der Source von fishMain werden dann die entsprechende Zeilen geändert
:
ftiWaitForTime(Werte(wAnlaufzeit));
ftiWaitForTime(Werte(wTrockenzeit));
Aufgabe 2
Modell wie bisher. Der Lüfter soll jetzt aber nicht mehr konstant 5 Sekunden
laufen, sondern, wenn die Lichtschranke nicht mehr unterbrochen ist (die Hände
sind raus) den Betrieb einstellen.
modifiziertes fishMain
begin
ftiSetMotor(mLampe, ftiEin);
ftiWaitForTime(Werte(wAnlaufzeit));
repeat // --- Endlosschleife, Ende : HALT-Button
if not ftiGetInput(eLichtschranke) then begin
ftiSetMotor(mVentilator, ftiEin);
end
else begin
ftiSetMotor(mVentilator, ftiAus);
end;
until ftiFinish(0);
end;
Auf den ersten Blick siehts recht ähnlich aus. In der repeat ... until Schleife
ist jetzt ein komplexeres If (mit Else) angesiedelt : wenn die Lichtschranke
unterbrochen ist (not ftiGetInput(ePhototransistor)) wird der Ventilator
eingeschaltet, wenn nicht wird er abgeschaltet (bei jedem Durchlauf der
Schleife, wäre eigentlich nicht nötig, ist aber einfacher, was könnte man da
tun?).
Man sollte wieder die printStatus einfügen und bei den Konstanten die nicht
mehr benötigten für Trockenzeit entfernen.
|