Möchtest du eine Aktion auslösen, sobald die Temperatur einen bestimmten Wert überschreitet? Dann brauchst du ein Schwellwertmodul
Im letzten Tutorial haben wir uns mit der Temperaturmessung mit analogen Temperaturmodulen beschäftigt. Nicht alle Anwendungen erfordern jedoch einen absoluten Temperaturwert. Heute werden wir uns mit Temperaturschwellwertmodulen befassen, die verwendet werden können, um eine Aktion auszulösen, sobald eine bestimmte Temperatur überschritten wird. Um genauer zu sein, werden wir uns das Modul KY-028 anschauen. Dieses Modul verwendet ebenfalls einen NTC-Thermistor, eignet sich aber nicht zur Messung eines absoluten Temperaturwertes. Das Modul verfügt über ein Potentiometer, mit dem der Temperaturschwellwert eingestellt werden kann. Wenn die Temperatur über diesen Schwellwert steigt, wird der digitale Ausgang des Moduls eingeschaltet. In unserem Code können wir auf dieses Ereignis reagieren und eine entsprechende Aktion auslösen.
In diesem Tutorial werden wir einen einfachen Temperaturalarm bauen. Sobald die Temperatur den Schwellenwert überschreitet, schalten wir einen Summer ein, um vor dem Temperaturereignis zu warnen. Machen wir uns an die Arbeit!
Zuerst müssen wir den in der Abbildung unten gezeigten Schaltkreis aufbauen. An Pin 9
habe ich einen Summer angeschlossen. Um das KY-028 Modul anzuschließen, müssen wir den digitalen Ausgang D0
mit einem digitalen Pin unseres Arduinos und den analogen Ausgang A0
mit einem analogen Pin verbinden. Zu Beginn werden wir den analogen Ausgang nicht benötigen. Ich werde dir später zeigen, wofür dieser Ausgang verwendet werden kann. Ich habe den digitalen Ausgang mit Pin 8
und den analogen Ausgang mit Pin A0
verbunden. Zum Schluss müssen wir noch 5V
und GND
mit den Pins +
und G
des Moduls verbinden.
Was müssen wir in unserem Programm tun? Nun, nicht viel. Der Schwellenwert wird durch Drehen des Potentiometers auf dem Modul eingestellt. In unserem Code brauchen wir uns darum nicht zu kümmern. Das Einzige, das noch zu tun ist, ist, den Zustand von Pin 8
zu lesen und den Summer entsprechend zu betätigen.
Wenn die Temperatur über dem Schwellenwert liegt, wird der digitale Ausgang des Moduls auf HIGH
geschaltet. In diesem Fall müssen wir den Summer einschalten.
Hier ist der Code:
void setup() {
pinMode(8, INPUT);
pinMode(9, OUTPUT);
}
void loop() {
if(digitalRead(8) == HIGH) {
digitalWrite(9, HIGH);
}
else {
digitalWrite(9, LOW);
}
}
Das war einfach, stimmts? Nun, wenn man das Ergebnis im untenstehenden Video anschaut, sieht man, dass unsere Lösung ein Problem hat: Der Ausgang oszilliert, wenn die Temperatur in der Nähe des Schwellwertes liegt. Solange die Temperatur nicht deutlich über dem Schwellwert liegt, hören wir keinen klaren Piepton. Wir erhalten ein seltsames Rauschen, weil der Ausgang des Temperaturschwellenmoduls hin- und herschaltet, anstatt einen stabilen Ausgangspegel zu erzeugen. Eine einfache Lösung wäre es, Verzögerungen einzubauen, aber es geht noch besser. Lass uns anschauen, wie.
Das Problem, das wir beobachtet haben, ist ein weit verbreitetes Problem, für das es natürlich bereits eine Lösung gibt. Wir müssen eine Hysterese verwenden. Was bedeutet das? Nun, wir brauchen verschiedene Schwellenwerte für das Aus- und Einschalten des Summers. Wir sagen einfach, dass der Sensor etwas kälter werden muss als der von uns gewählte Schwellenwert, damit sich der Summer ausschalten kann. Dadurch wird ein Oszillieren verhindert. Leider können wir diesen zweiten Schwellenwert nicht direkt auf dem Modul einstellen, aber wir können ihn in Software implementieren. An dieser Stelle kommt der Analogausgang des KY-028 Moduls ins Spiel. Aber bevor wir den Code schreiben können, müssen wir zunächst verstehen, wie die Spannung am Analogausgang zu interpretieren ist.
Der NTC-Thermistor und das Potentiometer auf dem Modul KY-028 bilden einen Spannungsteiler. Das Potentiometer wird als variabler Widerstand verwendet. Da wir die Position des Schleifers und damit den Widerstand des Potentiometers nicht kennen, können wir keinen absoluten Temperaturwert berechnen. Für unseren Anwendungsfall brauchen wir das aber auch gar nicht. Die Spannung am Analogausgang nimmt mit steigender Temperatur ab. Der Digitalausgang wird eingeschaltet, sobald die Spannung unter die halbe Versorgungsspannung fällt. Das heißt, der Digitalausgang wird eingeschaltet, wenn die Spannung, die wir am Analogausgang messen, unter 2,5 V liegt. Die 2,5 V entsprechen einem ADC-Wert von 512
. Mit diesem Wissen können wir leicht eine Hysterese implementieren. Wir nehmen einen Wert, der etwas über 512
liegt, als Schwellenwert für das Ausschalten des Summers. Ich habe 530
gewählt, aber du kannst einfach ein bisschen experimentieren und sehen, ob du einen besseren Wert für deinen Anwendungsfall findest. Der zusätzliche Code ist denkbar einfach: Wir prüfen, ob der ADC-Wert über 530
ist. Falls ja, schalten wir den Summer aus.
Hier ist der geänderte Code:
void setup() {
pinMode(8, INPUT);
pinMode(9, OUTPUT);
}
void loop() {
if(digitalRead(8) == HIGH) {
digitalWrite(9, HIGH);
}
if(analogRead(A0) > 530) {
digitalWrite(9, LOW);
}
}
Das Video zeigt unser Endergebnis. Wir erhalten einen schönen und sauberen Piepton. Das Tolle daran ist, dass der Schwellenwert zum Einschalten des Piepsers unabhängig von der Potentiometerstellung immer bei 2,5 V liegt. Das liegt an der Art und Weise, wie dieses Modul aufgebaut ist. Für uns hat es den Vorteil, dass wir den zweiten Schwellenwert nicht anpassen müssen, wenn wir die Temperatureinstellung am Potentiometer ändern. Das Modul lässt sich dadurch besonders einfach verwenden.