Temperatur-/Luftfeuchtigkeitsabhängige Lüftersteuerung

Liebe Arduino-Pros.

Ich möchte einen Lüfter Abhängigkeit des Outputs eines DHT22-Sensor steuern und bin kompletter Anfänger. Aus anderen Beiträgen habe ich folgenden Code zusammengebastelt und möchte gern fragen, ob bitte jemand meinen Code kommentieren könnte?

Hardware:
Arduino UNO Rev3
DHT22
be quiet Shadow wings 2 PWM (4 Pin)

Was passieren soll:
Wenn Temperatur und Luftfeuchte kleiner als x (hier 30GradCelsius und 55%H), dann soll der Lüfter AUS sein. Wenn größer als x, soll er 100% laufen (später dann gern noch eine 50% Abstufung).

Was passiert:
Der Lüfter läuft mit geringer Leistung trotz Temperatur kleiner x.

Einen Schaltplan habe ich per PDF-Skizze erstellt, kann ihn aber offenbar nicht hochladen, da das neuen Nutzern nicht gestattet ist. Weiß jemand Rat?

Die Anzeige im seriellen Monitor funktioniert.

Würde mich sehr über direkte Hilfe freuen.
Danke im Voraus und viele Grüße, Steffen

#include <DHT.h>

#define DHTPIN 2

#define DHTTYPE DHT22

#define fan 9

DHT dht(DHTPIN, DHTTYPE);

void setup()
{

  Serial.begin(9600);                     //nur für Darstellung der Werte notwendig
  Serial.println("DHT22");               //nur für Darstellung der Werte notwendig


  delay(2000);

  dht.begin();
}
void loop() {
  delay(2000);

  float h = dht.readHumidity();
  float t = dht.readTemperature();


  if (isnan(h) || isnan(t)) {
    return;
  }

  Serial.print("Luftfeuchtigkeit: ");
  Serial.print(h);                  // Ausgeben der Luftfeuchtigkeit
  Serial.print("%\t");              // Tabulator
  Serial.print("Temperatur: ");
  Serial.print(t);                  // Ausgeben der Temperatur
  Serial.write('°');                // Schreiben des ° Zeichen
  Serial.println("C");


  if (t < 30 || h < 55) {
    analogWrite(fan, 0);
    delay(100);
  }

  /*
    else if(t==26 || h > 50 && h < 55) {
    analogWrite(fan, 51);
    delay(100); }
    else if(t==28 || h > 55 && h < 60) {
    analogWrite(fan, 153);
    delay(100); }
    else if(t==29 || h > 60 && h < 65) {
    analogWrite(fab, 204);
    delay(100); }
  */
  else if (t > 30 || h > 55) {
    analogWrite(fan, 255);
    delay(100);
  }
  delay(3000);
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

1 Like

Du prüfst auf ODER:

Ich empfehle das ausschreiben der Funktionen:

  Serial.println("C");
  if (t < 30)               // Temperatur hat Wert nicht erreicht?...
  {
    if (h < 55)             // .. UND Luftfeuchte auch nicht? ...
    {
      analogWrite(fan, 0);  // ... Ausmachen
      delay(100);
    }
  }
  else if (h > 55)          // ... Temperatur ist erreicht UND Luftfeuchte auch
  {
    analogWrite(fan, 255);  // Anmachen
    delay(100);
  }

Dann mach mal bitte folgendes: In der IDE unter DATEI - VOREINSTELLUNGEN - "Ausführliche Ausgabe während" [x] Kompilierung
Darunter ALLE

Dann bekommst Du eine Warnung die solltest Du auflösen.

Und später killen wir Deine delays() :wink:

Ich schätze mall das ist ein 12V Lüfter, wie wird er angesteuert, mit welchem Transistor, was für Widertand ist zwischen Basis oder Gate zu Arduino.
Je nach Typ und Beschaltung kann sein das er nicht "zu ist" und bleibt leichte Spannung so das nach anlaufen er langsam weiter dreht, versuch die PDF rein schieben, manchmal klappst

Hi my_xy_projekt, Hi fony,

vielen Dank für eure Beiträge.

zu 1.1) Ich habe meinen Post leider falsch formuliert. Der Lüfter soll angehen, wenn entweder das eine oder das andere eintritt. Also ODER nicht UND

zu 1.2) Unter DATEI finde ich leider keine VOREINSTELLUNGEN. Woanders auch nicht. Nutze die IDE-Version für Macs.

zu 2) Ich habe gar keinen Transistor dazwischen, sondern den Lüfter direkt an "Vin" und GND vom Arduino geschaltet.
Später sollen der Lüfter und der Arduino direkt an einen 12 V - Akku angeschlossen werden. Das heißt, ich brauche noch einen Transistor? Falls ja, welchen und muss ich dann am Code etwas ändern?

PS: Leider wird mir immer noch nicht gestattet den Schaltplan hochzuladen.

#include <DHT.h>

#define DHTPIN 2

#define DHTTYPE DHT22

#define fan 9

DHT dht(DHTPIN, DHTTYPE);

void setup()
{

  Serial.begin(9600);                     //nur für Darstellung der Werte notwendig
  Serial.println("C");               //nur für Darstellung der Werte notwendig


  delay(2000);

  dht.begin();
}
void loop() {
  delay(2000);

  float h = dht.readHumidity();
  float t = dht.readTemperature();


  if (isnan(h) || isnan(t)) {
    return;
  }

  Serial.print("Luftfeuchtigkeit: ");
  Serial.print(h);                  // Ausgeben der Luftfeuchtigkeit
  Serial.print("%\t");              // Tabulator
  Serial.print("Temperatur: ");
  Serial.print(t);                  // Ausgeben der Temperatur
  Serial.write('°');                // Schreiben des ° Zeichen
  Serial.println("C");


  if (t < 30 || h < 55) {  // ..Temperatur/Luftfeuchtegrenze nicht erreicht
    analogWrite(fan, 0); // .. Lüfter ausmachen
    delay(100);
  }

  /*
    else if(t==26 || h > 50 && h < 55) {
    analogWrite(fan, 51);
    delay(100); }
    else if(t==28 || h > 55 && h < 60) {
    analogWrite(fan, 153);
    delay(100); }
    else if(t==29 || h > 60 && h < 65) {
    analogWrite(fab, 204);
    delay(100); }
  */
  else if (t > 30 || h > 55) {  // Temperatur oder Luftfeuchte erreicht
    analogWrite(fan, 255);      // Lüfter anmachen
    delay(100);
  }
  delay(3000);
}

Nicht gut, Du brauchst ein Transistor am besten ein Low Level MOSFET Diode und zwei Widerstände. Wen ich Schafe zeichne Morgen ein Schaltplan. Ohne Freilaufdiode las den nicht Laufen sonst kann passieren das Du dein Uno schrotest.
Hier zum nachlesen

Hier die Schaltung
https://www.mintgruen.tu-berlin.de/robotikWiki/doku.php?id=techniken:schalten
runter Scrollen bis

Einen Motor an- und ausschalten

und somit habe ich mir zeichnen gespart.

Das ist böse.
Vin ist das, was es heisst. Ein INPUT für die Versorgung.

Du brauchst in jedem Fall eine Leistungsstufe, die zwischen dem OutputPin 9 und dem Lüfter dafür sorgt, das Du den Arduino nicht killst.

Ok, dann wieder zurück.

  Serial.println("C");
  if (t > 30 || h > 55)             // Temparatur oder Luftfeuchte hat Wert nicht erreicht?...
  {
    analogWrite(fan, 255);          // ... Anmachen
    delay(100);
  }
  if (t < 30 && h < 55)             // Temperatur ist unterschritte UND Luftfeuchte auch
  {
    analogWrite(fan, 0);            // Ausmachen
    delay(100);
  }
  delay(3000);
}

:frowning: Da weiss ich nicht, wo das liegt...

Ist so wie bei Linux und Win also so einstellen

Guten Morgen,
ich nehme alles zurück, nach dem ausschalten meines Rechners ist mir erst aufgefallen
4Pin Lüfter also ist schon zum teil ok deine Beschaltung, den der Lüfter hat intern ein Steuer IC oder Transistor
Die Pin Belegung solte sein - = GND, +, RPM Geber, PWM Pin

Was ist wen Du dem Lüfter ohne Ardu ein kurzen + Impuls gibt's, bleibt er "Stehen" oder dreht langsam weiter?

Bei Arduino UNO:
Zwischen der schwarzen Netzteilbuschse und Vin ist eine 1A Diode die verhindet daß der Arduino Kaputtgeht wenn die Polung des netzteils falsch ist.

Vin kann als SpannungsversorgungsAusgangsPin verwendet werden. es kommt da die Netzteilspannung minus 0,7V heraus . Die max strombelstung ist etwas unter 1A.
Wenn Du einen 2 Poligen Lüfter (+ und Gnd Spannungsversorgung) an Gnd und Vin anschließt dreht der sich dauernd unabhängig vom Arduino.

4 Wire Lüfter mit PWM Eingang.
Der PWM Eingeng kann irekt von einem PWM Ausgang des Arduino angesteuert werden. Beim Starten des Lüfters ist es gut diesen für 5 Sekunden auf 100% Anzusteuern um danach auf den Tatsächlichen Wert herunterzuschalten.

Fehlt das PWM-Signal dreht der Lüfter trotzdem zum Schutz der Elektronik.

Grüße Uwe

Hi zusammen,

vielen Dank für eure kompetenten Beiträge.

Okay, meinetwegen könnte dann da ein MOSFET dazwischen (habe aber derzeit keinen da), allerdings würde es ja dann, sofern ich dich in deinem späteren Post richtig verstehe aufgrund des 4PIN-PWM gar nicht unbedingt nötig sein, oder?

Wie ist dann jetzt aber die Schaltung zu machen?
Deinem Schaltplan ist zu entnehmen, dass PIN 9 (nicht PIN 10) in meinem Code wie gehabt das PWM-Signal geben sollte.

Plus 12 V+ und GND habe ich zwar (noch) nicht an einer externen Spannungsquelle, sondern wie erwähnt an Vin und GND, aber wie uwefed sagt, liefert Vin ja doch eine Ausgangsspannung, wenn auch nur eine sehr kleine.
Siehe:

@uwefed Doch wie muss ich nun meinen Code ändern, sodass es funktioniert?

Offenbar fehlt bei mir ja das PWM-Signal, da der Lüfter trotzdem dreht (vgl. deine Aussage:

Ich darf leider immer noch keine Anhänge senden..

Freu mich auf Eure Vorschläge.
Viele Grüße! Steffen

Nachtrag an @fony

Ich weiß leider nicht wie ich dem Lüfter einen kurzen + Impuls gebe. Weder mit, noch ohne Arduino.

Auf den PWM Pin + drauf, wurde der so angeklemmt wie oben im Plan, nur den PWM Pin anpassen die Stecker sind genormt, außer Du hast ein nackten Lüfter.
Zweite Frage werden dir im Serial monitor die Werte angezeigt?

Nur mal so: Das Projekt hier bei Heise Make kennst du?

Den wollte ich auch zeigen nur ist hinter der Pay Wand
Heise ist nicht das was er war

Ich bin Abonnent von c't und Make, deswegen ist das für mich offen. Kost' aber nicht die Welt, so ein Artikel.

War über 20J nur vor 5J habe gekündigt ich zahle nicht für 80% Werbung . wen was interesantes gibt's dann wird gekauft

Danke für den Hinweis, dadurch habe ich gemerkt, dass auch Heise+ zum Zugriff berechtigt ist.

Gruß Tommy

1 Like

Hi @Miq1,
mal geschaut, wie und an was der Lüfter da angepinnt ist?
Wenn hier so ein Foto gepostet würde.... :wink:

Und ja, ich schliesse mich @fony an. Mein C't Abo ist vor nem halben Jahr nach fast 20 Jahren nicht mehr verlängert worden.
Wer mal die 194 Seiten mit früheren Ausgaben verglichen hat, wird wissen warum.
Nachdem im Jahr zuvor die Mehrwertsteuersenkung nicht durchgereicht wurde war dann die letzte Preiserhöhung der Scheidepunkt.... Dafür gibts jetzt regelmäßig trotz Papierpreise Spezialangebote enmass...

Ja, der Hardwareaufbau ist nicht so geschickt. Ich würde das auch nicht sklavisch nachbauen, sondern als Basis nehmen. Ich mag auch keine Anlagen, bei denen man zum Austausch von Sensoren oder Verbrauchern die Kiste aufschrauben muss - ich würde die DHT22 per extern zugänglicher Steckbuchsen anschließen und dem Lüfter eine Steckdose spendieren. Und intern dann direkt mit dem Relais verbinden, die 230V-Anschlüsse per Wagoklemmen.