Drücke „Enter”, um zum Inhalt zu springen.

Temperaturmessung und Lüftersteuerung mit einem Arduino

Jan 0
geschätzte Lesedauer: 7 Minuten

Die Idee war die Konvektion des Heizkörpers zu verstärken und so die warme Luft besser im Raum zu verteilen. Nach einem ersten Versuch stellte ich schnell fest, dass die Idee zwar effektiv war, aber nicht effizient. So entstand die Idee für aktive Heizungslüftung mit Temperaturmessung. Die gesamte Steuerung sollte ein Arduino Nano Every übernehmen.

Einleitung

Vor 20 Jahren hatte ich schon mal einen Kurs zu Mikrocontroller-Programmierung gemacht. Es waren Leute dabei, die sich mit Elektronik auskannten, denen aber die Programmierung fremd war und umgekehrt. Deswegen fing der Kurs mit einem einfachen LED blinken an und hörte dann mit einer kompletten Steuerung auf. So ein paar Sachen von damals waren hängen geblieben. Nur war ich mir noch nicht über die Plattform im Klaren.

Als ich an der ersten Version meiner aktiven Heizungslüftung baute, entstand schnell die Idee einer Computersteuerung. Mit Minicomputern wie Raspberry Pi oder Arduino sollte das ja überhaupt kein Problem mehr sein. Mein Bauchgefühl tendierte zu Arduino und sollte sich als richtig erweisen. Ich schaute mich ein bisschen im Arduino-Bereich um und entdeckte sofort alles, was ich benötigte: Temperatursensoren und eine überwältigende Auswahl an Boards für alles mögliche. Ich brauchte eigentlich nur zwei Sachen: Den Sensor auslesen und dementsprechend den Wert an die Motorsteuerung weitergeben. Klingt banal.

Von der Idee zur Schaltung

Jede Plattform hat ein gut moderiertes Forum, so auch Arduino. Relativ schnell fand ich eine Lösung, die erklärt, wie man den Sensor mit Hilfe der DallasTemperature Bibliothek ausliest. Und weiterhin fand ich eine Lösung, wie man einen 12V Motor mit einem 5V-Ausgang ansteuert. Blieb nur noch das Problem, dass ich nicht gleichzeitig 5V und 12V erzeugen kann. Auch hier gibt es mit einem Spannungsregler eine geeignete Lösung. Und so entstand ein Schaltplan für die Steuerung.

Schaltplan für aktive Heizungslüftung mit Temperatursensor
Schaltplan für den Anschluss von Temperatursensor und Motorsteuerung an einen Arduino Nano.

Ich ließ noch mal meinen Freund und Elektroniker Basti über die Schaltung schauen. Sie wurde vom Fachmann bestätigt und damit konnte die Bestellung rausgehen. Hier die Teileliste, die in Summe auf noch mal ca. 30 Euro kommt, wobei der Arduino und der Sensor schon 2/3 der Kosten ausmachen.

  • 1x Arduino Nano Every, ATMega4809
  • 1x MOSFET N-Ch, IRF 540
  • 1x Drahtwiderstand 100 Ohm
  • 1x Drahtwiderstand 10 kOhm
  • 1x Diode 12V
  • 1x Temperatursensor DS18B20
  • 1x Kondensator 6,3V, 22µF
  • 1x Spannungsregler 5V, LM 2940
  • 1x Satz Steckbrückenkabel

Ich hatte vor über 20 Jahren nach dem Studium mal einen Kurs in Mikro-Controller-Programmierung gemacht. Und irgendwo mussten die Teile noch in einer Kiste sein? Nach etwas Suche fand ich die Tüte mit den Bauteilen und war erstaunt. Der Kurs damals war mit einem Atmel Mikrocontroller – Bezeichnung AT90S4433. Mir fielen die Hälfte der Teile von meiner Bestellliste in die Hände. Ich musste lachen. Damals hatten wir das Steckboard schon fertig vorbereitet bekommen und haben je nach Anwendung LEDs angesteuert und Taster abgefragt. Trotzdem hatte sich nicht viel geändert.

Der Spannungsregler, den ich auf dem alten Board hatte, wurde als veraltet beschrieben, weil er zu schnell heiß wird. Und eigentlich hätte es vermutlich auch noch der alte Atmel-Controller getan, wenn ich eine passende Schnittstelle dazu hätte. Jetzt gibt es den ATMega4809, der von MikroChip kommt, der Firma, die 2016 Atmel übernommen hat. Und die große serielle Schnittstelle war einem kleinen Mikro-USB-Port gewichen.

Erste Gehversuche

Die Teile trafen ein. Ich dachte, ich fange wieder ganz einfach an. Lerne die Arduino IDE kennen, den Chip und wie das Programmieren geht. Im Grunde musste ich gar nichts groß machen. IDE starten, den passenden Arduino einstellen, den Port einstellen und schon konnte es losgehen. Wichtig war nur, dass ich die neuste Version der IDE nehme, weil der Arduino Nano Every mit der Version, die über das Software Center von Linux Mint kommt, noch nicht unterstützt wird. Aber das war schnell gelöst. Nach ein paar Blinkversuchen mit der eingebauten LED steuerte ich eine LED auf dem Breadboard an. Auch das ging reibungslos.

Temperaturmessung – die erste Hürde

Ich hatte Temperatursensor LK-Temp2 gekauft, der mit einem 1m langen Kabel verbunden war. In der Anleitung stand, dass man die Bibliotheken OneWire und DallasTemperature nehmen sollte, die vom Hersteller bereitgestellt werden. Gesagt, getan. Plus auf 5V, Minus auf GND, Datenkabel an den Port. Ergebnis: -127°C.

Ich begann zu suchen und fand den Hinweis, dass die OneWire Bibliothek in einer älteren Version den ATMega4809 noch nicht kennt und deswegen damit nicht klar kommt. Also gut, dann machen wir mal das Update auf die letzte Version und nehmen auch gleich die neuste Version von DallasTemperature mit. Ergebnis: -127°C.

Langsam hatte ich das Gefühl der Sensor war kaputt. Ich suchte und fand eine Beschreibung, dass bei manchen Sensoren ein Pull-Up-Widerstand notwendig ist. Es wurden 4,7kOhm vorgeschlagen. Ich hatte aber nur 1kOhm und 10kOhm. Also von Minus auf den Widerstand, vom Widerstand auf die Datenleitung. Ich probierte 10kOhm, ich probierte 1kOhm. Ergebnis: -127°C.

Ich war langsam am Verzweifeln und schrieb schon eine Mail an den Hersteller. Der würde natürlich auf seine Bibliotheken verweisen. Also probierte ich noch mal von vorn. Neue Bibliotheken gelöscht, alte Bibliotheken reinkopiert. Wieder kam die Meldung, dass die OneWire den ATMega4809 nicht unterstützt. Gut, dann mache ich darauf ein Update. Ergebnis: 22,18°C! Heureka!

Das Fazit zum Einsatz eines LK-Temp2 mit einem Arduino Nano Every: OneWire in der neuesten Version 2.3.8 nehmen, die DallasTemperature auf der alten Version belassen, 5V auf die Datenleitung geben und einen Pull-Up-Widerstand von 1kOhm vorschalten.

Während meiner Suche stieß ich auf das Programm Fritzing, mit dem man ziemlich einfach Schaltungen auf einem Breadboard darstellen konnte. Und für den Blog allemal schöner für die Kommunikation. Also war das die Schaltung für das erste Setup, gefolgt vom Code.

Fritzing Schaltplan Temperaturmessung
Schaltplan für Temperaturmessung mit einem LK-Temp2 und einem Arduino Nano Every
#include <DallasTemperature.h>
#include <OneWire.h>


#define LK_TEMP2_PIN 4

// Globals
OneWire oneWire(LK_TEMP2_PIN);
DallasTemperature sensors(&oneWire);

void setup()
{
  sensors.begin();
  Serial.begin(9600);
}

void loop() 
{
  ReadTemperature();
  delay(5000);
}

void ReadTemperature()
{
  float temp = 0.0;
  sensors.requestTemperatures();
  temp = sensors.getTempCByIndex(0);
  Serial.print("Temperature: ");
  Serial.print(temp);
  Serial.println(" C");
}

Der Nachteil von diesem Code ist ja, dass der Arduino am Rechner hängen muss, damit man die Temperatur sieht. Warum also nicht eine mehrstufige Anzeige?

Temperaturmessung mit LED-Level

Wenn die Lüftersteuerung fertig ist, sollte ich auf einen Blick erkennen, ob der Heizkörper heizt und auf welcher Stufe die Lüfter arbeiten. Also dachte ich an eine fünfstufige Schaltung. Erste LED zeigt an, dass die Temperaturmessung funktioniert. Das Erlebnis mit -127°C hatte tiefe Spuren hinterlassen! Und danach in vier Stufen zwischen 25 und 55°C. Alles darüber sollte Volllast der Lüfter bedeuten.

Dieses Feature war mehr ein Gimmik für mich und hatte eigentlich keine wirkliche Bedeutung für das Endergebnis.

Fritzing Schaltplan Temperaturmessung mit LED Indikatoren
Schaltplan für Temperaturmessung mit einem LK-Temp2, fünf LEDs und einem Arduino Nano Every
#include <DallasTemperature.h>
#include <OneWire.h>


#define LK_TEMP2_PIN 4

#define LED_BASE_PIN 12
#define LED_LOW_PIN 11
#define LED_MEDLOW_PIN 10
#define LED_MEDHIGH_PIN 9
#define LED_HIGH_PIN 8

// Globals
OneWire oneWire(LK_TEMP2_PIN);
DallasTemperature sensors(&oneWire);

void setup() {
  // set PINs to output
  pinMode(LED_BASE_PIN, OUTPUT);
  pinMode(LED_LOW_PIN, OUTPUT);
  pinMode(LED_MEDLOW_PIN, OUTPUT);
  pinMode(LED_MEDHIGH_PIN, OUTPUT);
  pinMode(LED_HIGH_PIN, OUTPUT);
  sensors.begin();
  // TODO can be removed, but useful for debugging
  Serial.begin(9600);
  Init();
}

void loop() 
{
  float temperature = ReadTemperature();
  if (temperature > 0 && temperature < 25.0)
  {
    SetTemperatureIndicators(HIGH, LOW, LOW, LOW, LOW);
  }
  else if (temperature >= 25.0 && temperature < 35.0)
  {
    SetTemperatureIndicators(HIGH, HIGH, LOW, LOW, LOW);
  }
  else if (temperature >= 35.0 && temperature < 45.0)
  {
    SetTemperatureIndicators(HIGH, HIGH, HIGH, LOW, LOW);
  }
  else if (temperature >= 45.0 && temperature < 55.0)
  {
    SetTemperatureIndicators(HIGH, HIGH, HIGH, HIGH, LOW);
  }
  else if (temperature >= 55.0)
  {
    SetTemperatureIndicators(HIGH, HIGH, HIGH, HIGH, HIGH);
  }
  delay(5000);
}

void Init() 
{
  digitalWrite(LED_BASE_PIN, LOW);
}

float ReadTemperature()
{
  float temp = 0.0;
  sensors.requestTemperatures();
  temp = sensors.getTempCByIndex(0);
  // TODO can be removed, but good for debugging
  Serial.print("Temperature: ");
  Serial.print(temp);
  Serial.println(" C");
  return temp;
}

void SetTemperatureIndicators(int base, int low, int medlow, int medhigh, int high)
{
    digitalWrite(LED_BASE_PIN, base);
    digitalWrite(LED_LOW_PIN, low);
    digitalWrite(LED_MEDLOW_PIN, medlow);
    digitalWrite(LED_MEDHIGH_PIN, medhigh);
    digitalWrite(LED_HIGH_PIN, high);
}

Das Feature lief sofort. Ich legte den Sensor in meine Hand – die erste rote LED ging an. Dann tauchte ich den Sensor in meinen frischen Kaffee, schon gingen die weiteren LEDs an. Ich war motiviert für den nächsten Schritt. Jetzt sollte der Einsatz der Lüfter aus dem ersten Versuch folgen.

Lüftersteuerung

Jetzt nur noch den Lüfter anbinden! Hier konnte ich ja auf den Plan zurückgreifen, den ich initial entworfen hatte. Nur, dass ich alles noch mal mit Fritzing nachzeichnete. Und dabei auch feststellen musste, dass es da unendliche Erweiterungen gibt, die man einbinden kann.

Fritzing Schaltplan Temperaturmessung mit LED Indikatoren und Lüftersteuerung
Schaltplan für Temperaturmessung mit einem LK-Temp2, fünf LEDs, einem Lüfter und einem Arduino Nano Every

Ich nahm den Code von oben und fügte in die einzelnen Temperaturzweige noch die Steuerung für den Motor ein, den ich dann mit Werten zwischen 0 und 255 versorgte.

analogWrite(MOTOR_OUT, value);

Aber egal, welchen Wert ich dort schrieb, der Motor stand still. Ich studierte Blogs, Videos und Forenbeiträge. Ich nahm das Multimeter und maß nach. Alles schien richtig zu sein, nur beim Motor kam kein Strom an. Ich steckte und baute zwei Nachmittage lang um und probiere alle Kombinationen, die ich fand.

Danach hatte ich genug und fragte im Arduino-Forum. Die erste Antwort deckte sich mit einem Bauchgefühl. Der MOSFET war nicht der Richtige. Ich bekam den Hinweis, dass ich einen Logic-Level-MOSFET brauche, Kurzbezeichnung IRLZ44N. D.h. ich musste meine Bestellung von oben korrigieren.

  • MOSFET, N-CH, IRLZ44N

Als der MOSFET ankam, musste ich nichts weiter machen, als den Transistor zu tauschen und schon lief alles wie gewünscht. Ich änderte die Verkabelung geringfügig und baute die Lüftung das erste Mal an der Heizung an. Nach einem Tag konnte ich schon erste Konsequenzen ziehen.

  1. Ich brauche keine vier Drehstufen. Die Lüftung lief den ganzen Tag entweder auf Stufe 1 oder 2, aber schaltete nie ab. In Stufe eins spürte ich kaum einen Luftzug an der Heizung, d.h. es sollte nur zwei Stufen geben. Ab 30°C in Stufe 1 schalten, was 50% Leistung entspricht und alles oberhalb von 40°C geht auf Volllast.
  2. Dementsprechend brauche ich auch keine fünf LEDs. Die eingebaute LED des Arduino reicht als Funktionsanzeige und zwei LEDs reichen für die zwei Stufen.
  3. Die Luftverteilung der Billiglüfter war eher mäßig. Selbst auf voller Last spürte ich oben am Heizkörper nichts. D.h. ich brauchte jetzt Lüfter, die mehr Luft bewegen.

Diese Erkenntnisse waren dann die Voraussetzung für die nächste Stufe: Temperaturmessung, Lüftersteuerung über PWM mit einem Arduino Nano Every.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

WordPress Cookie Hinweis von Real Cookie Banner