Frage zu Lüftersteuerung

Hallo Profis Könnte mir bitte mal jemand helfen. Bin Anfänger und habe leider keinen Plan wie ich folgendes, verwirklichen kann.

Ist es möglich eine Lüftersteuerung so zu Programmieren? Der Sketch ist ansonsten fertig und funktioniert.

Lüftersteuerung Garage (Autobatterie 12 Volt + Mini-Solaranlage)

Grundbedingungen für das Einschalten sind:

Spannung muss größer 12,5 Volt Spannung kleiner 12,5 Volt Lüfter ausschalten (Batterieschutz) Luftfeuchte muss außen kleiner wie Luftfeuchte innen sein Luftfeuchte außen größer wie Luftfeuchte innen Lüfter ausschalten

Schaltbedingungen wenn Grundbedingungen erfüllt sind:

Luftfeuchte innen größer 60% Lüfter ein Luftfeuchte innen kleiner 55% Lüfter aus (Hysterese)

Temperatur innen größer 30 °C Lüfter ein Temperatur kleiner 25°C Lüfter aus (Hysterese)

Volt, % u. °C sind nur Beispielwerte. Genaue Werte muss ich noch ermitteln.

Im Sketch verwende ich folgende Bezeichnungen: t1 = Temperatur innen t2 = Temperatur außen h1 = Luftfeuchte innen h2 = Luftfeuchte außen volt = Batteriespannung

wenn es hilft Poste ich auch gerne den Sketch.

Gruß Jürgen

Gute Idee, den Sketch zu zeigen.

Aber gerne

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#include <DHT.h>

int spannung = A2;                          // Spannung wird aus PIN A2 ausgelesen
int strom = A3;                             // Strom wird aus PIN A3 ausgelesen
int LED = 13;                               // LED an Pin 13 (Später Lüfter Output)
float vout = 0.0;
float volt = 0.0;
float R1 = 30000.0;                         // Widerstandswert R1 (30K)
float R2 = 7500.0;                          // Widerstandswert R2 (7,5K)
int value = 0;

#define DHT_1PIN A0                          // DHT Sensor wird aus PIN A0 ausgelesen
#define DHT_2PIN A1
#define DHTTYPE DHT22                        // DHT Type wird auf DHT22 festgelegt
DHT dht22_1(DHT_1PIN, DHTTYPE);              // DHTPIN und DHTTYPE in dht22_1 definiert
DHT dht22_2(DHT_2PIN, DHTTYPE);              // DHTPIN und DHTTYPE in dht22_2 definiert

void setup()
{
  pinMode(spannung, INPUT);
  pinMode(strom, INPUT);                      // Strom
  pinMode (LED, OUTPUT);                      // Pin 9 auf Output gesetzt
  Serial.begin(9600);                         // Serielle Ausgabe beginnen mit: 9600baud
  lcd.begin(20, 4);                           // LCD festlegen
  //Innentemperetur
  lcd.setCursor(0, 0);                       // Anfang auf Stelle 0, Zeile 0 setzen
  lcd.print("INNEN");                        // Temperatur: auf LCD ausgeben
  lcd.setCursor(12, 0);                      // Anfang auf Stelle 18, Zeile 0 setzen
  lcd.print("C");                            // C auf LCD ausgeben
  lcd.setCursor(19, 0);                      // Anfang auf Stelle 15, Zeile 0 setzen
  lcd.print("%");                            // % auf LCD ausgeben
  //Aussentemperatur
  lcd.setCursor(0, 1);                       // Anfang auf Stelle 0, Zeile 1 setzen
  lcd.print("AUSSEN");                       // Aussen-Temperatur: auf LCD ausgeben
  lcd.setCursor(12, 1);                      // Anfang auf Stelle 18, Zeile 1 setzen
  lcd.print("C");                            // C auf LCD ausgeben
  lcd.setCursor(19, 1);                      // Anfang auf Stelle 19, Zeile 1 setzen
  lcd.print("%");                            // % auf LCD ausgeben

  Serial.println("DHT22 Serielle Ausgabe");   // Begrüßung beim Aufruf vom seriellen Monitor
  dht22_1.begin();                            // Auslesen des 1. DHT22 beginnt
  dht22_2.begin();                            // Auslesen des 2. DHT22 beginnt

}
unsigned long timeT, timeVolt, intervalT = 15000, intervalVolt = 500;

void t1Messung()                                // Innentemperatur
{
  float h1 = dht22_1.readHumidity();            // Variable h1 = Luftfeuchtigkeit in %
  float t1 = dht22_1.readTemperature();         // Variable t1 = Temperatur in °C
  if (isnan(h1) || isnan(t1)) {                 // Überprüfen ob ein gültiger Wert gelesen wird

    Serial.println("Fehler beim Lesen des DHT1 Sensors!");

    lcd.setCursor(7, 0);
    lcd.print("_____");
    lcd.setCursor(14, 0);
    lcd.print("_____");
    return;
  }

  t1 = t1 - 0.6;
  // Taupunkt berechnen
  float a = 17.271;
  float b = 237.7;
  float taupunktTmp = (a * t1) / (b + t1) + log(h1 / 100);
  float taupunkt = (b * taupunktTmp) / (a - taupunktTmp);
  Serial.print("Taupunkt:          ");
  Serial.print(taupunkt);
  Serial.println(" *C");
  lcd.setCursor(11,3);
  lcd.print("TP ");
  lcd.print(taupunkt);
  lcd.setCursor(19, 3);
  lcd.print("C");
  // Berechnung Ende

  Serial.print("Luftfeuchte innen: ");
  Serial.print(h1, 2);
  Serial.println(" %");

  Serial.print("Temperatur innen:  ");
  Serial.print(t1, 2);
  Serial.println(" *C");

  lcd.setCursor(7, 0);                       // Anfang auf Stelle 13, Zeile 0 setzen
  lcd.print(t1, 2);                          // Wert aus "t" ausgeben (Temperatur)
  lcd.setCursor(14, 0);                      // Anfang auf Stelle 13, Zeile 1 setzen
  lcd.print(h1, 2);                          // Wert aus "h" ausgeben (Luftfeuchtigkeit)
}
void t2Messung()                                // Aussentemperatur
{
  float h2 = dht22_2.readHumidity();            // Variable h2 = Luftfeuchtigkeit in %
  float t2 = dht22_2.readTemperature();         // Variable t2 = Temperatur in °C
  if (isnan(h2) || isnan(t2)) {                 // Überprüfen ob ein gültiger Wert gelesen wird
    Serial.println("Fehler beim Lesen des DHT2 Sensors!");
    lcd.setCursor(7, 1);
    lcd.print("_____");
    lcd.setCursor(14, 1);
    lcd.print("_____");
    return;

  }
  t2 = t2 - 0.6;
  h2 = h2 + 17.6;
  Serial.print("Luftfeuchte aussen: ");
  Serial.print(h2, 2);
  Serial.println(" %");

  Serial.print("Temperatur aussen: ");
  Serial.print(t2, 2);
  Serial.println(" *C");
  lcd.setCursor(7, 1);                       // Anfang auf Stelle 13, Zeile 1 setzen
  lcd.print(t2, 2);                          // Wert aus "t" ausgeben (Temperatur)
  lcd.setCursor(14, 1);                      // Anfang auf Stelle 13, Zeile 1 setzen
  lcd.print(h2, 2);                          // Wert aus "h" ausgeben (Luftfeuchtigkeit)

}
void voltMessung()

{
  volt = analogRead(spannung);               // Werte am analogen Pin lesen
}

void loop()
{
  long  now = millis();
  if (now - timeT >= intervalT)
  {
    timeT = now;
    t1Messung();
    t2Messung();
  }

  if (now - timeVolt >= intervalVolt)
  {
    timeVolt = now;
    voltMessung();

    value = analogRead(spannung);             // Werte am analogen Pin lesen
    vout = (value * 5.0) / 1024.0;
    volt = vout / (R2 / (R1 + R2));

    Serial.print("Spannung: ");
    Serial.print(volt, 2);
    Serial.println(" Volt");

    lcd.setCursor(0, 2);
    lcd.print("AKKU");
    if (volt < 10.0)                      //Nur für Verschiebung der Anzeige bei - Messung
    { //Nur für Verschiebung der Anzeige bei - Messung
      lcd.setCursor(7, 2);
      lcd.print(" ");                    //Nur für Verschiebung der Anzeige bei - Messung
    }                                    //Nur für Verschiebung der Anzeige bei - Messung
    if (volt >= 10.0)                    //Nur für Verschiebung der Anzeige bei - Messung
    { //Nur für Verschiebung der Anzeige bei - Messung
      lcd.setCursor(7, 2);               //Nur für Verschiebung der Anzeige bei - Messung
    }                                    //Nur für Verschiebung der Anzeige bei - Messung
    lcd.print(volt, 2);
    lcd.setCursor(12, 2);
    lcd.print("V");
    lcd.setCursor(0, 3);
    lcd.print("L fTER");
    lcd.setCursor(1, 3);               // 2.Zeichen in der dritten Reihe
    lcd.print((char)245);              // "ü" auf dem Display ausgeben
    //delay(500);                      // Nur für Test

    //Strommessung
    {
      float average = 0;
      for (int i = 0; i < 500; i++) {
        average = average + (.02644 * analogRead(A3) - 13.51); // 0.264=Grundeinstellung
        delay(2);
      }
      average = average / 500;
      if (average  <= 0.01 && average >= -0.01) average = 0.0;
      if (average >= 0.0)                  //Nur für Verschiebung der Anzeige bei - Messung
      { //Nur für Verschiebung der Anzeige bei - Messung
        lcd.setCursor(14, 2);
        lcd.print(" ");                    //Nur für Verschiebung der Anzeige bei - Messung
      }                                    //Nur für Verschiebung der Anzeige bei - Messung
      if (average < 0.0)                   //Nur für Verschiebung der Anzeige bei - Messung
      { //Nur für Verschiebung der Anzeige bei - Messung
        lcd.setCursor(14, 2);              //Nur für Verschiebung der Anzeige bei - Messung
      }                                    //Nur für Verschiebung der Anzeige bei - Messung
      lcd.print(average, 2);
      lcd.setCursor(19, 2);
      lcd.print("A");
      Serial.print("Strom:    ");
      Serial.print(average, 2);          // Strommessung auf LCD ausgeben
      Serial.println(" Ampere");
      //Strommessung Ende

     /*Nur für Test
      if (volt >= 12.8)
      {
        digitalWrite(LED, HIGH);           // Led (Lüfer) Ein
        lcd.setCursor(7, 3);
        lcd.print("EIN");

      }
      else if (volt <= 12.3)
      {
        digitalWrite(LED, LOW);         // Led (Lüfer) Aus
        lcd.setCursor(7, 3);
        lcd.print("AUS");
      */

      }
    }
  }
}

Also Lüfter an Pin 13 am Uno ist keine gute Idee. Der Pin zappelt wenn der Bootloader aktiv ist.

Du liest alle Werte ja schon aus. Also fehlt nur die bedingte Aktivierung des Lüfterpins. Dafür ist if Dein Freund. Hystere ist empfehlenswert, um Ruhe reinzubringen.

Wo genau klemmt's?

Ich habe leider überhaupt keinen Plan wie ich an die Sache ran gehen soll. Den Pin 13 habe ich nur genommen da ja auf dem UNO ein Led Pin 13 vorhanden ist. So brauchte ich keine auf dem Steckbrett zu montieren. Welcher Pin ist der geeigneter?

Ok, der Sketch ist also zusammenkopiert. Läuft der denn? Zum Testen ist Pin 13 ok, final jeder ausser den verwendeten und den seriellen.

Die Bedingungen hast Du doch schon beschrieben - schau Dir mal if/then in der Referenz an.

Der Sketch ist das Ergebnis mehrerer Forenthreads, also wohl schon brauchbar.

Gruß Tommy

@Tommy
Du hattest Recht mit den DHT22. Die beiden die ich gestern vom gelben Mann erhalten habe zeigen beide ca. 17% zu wenig Luftfeuchte an.

Könnte es so in etwa aussehen?

if (volt <= 12.5 || h2 > h1) LED, LOW //LED = später Lüfter
if (volt >= 13.0 && t1 > 30.0) LED, HIGH
if (volt <= 12.5 || t1 < 25.0) LED, LOW
if (volt >= 13.0 && h1 > 60.0) LED, HIGH
if (volt <= 12.5 || h1 < 55.0) LED, LOW

@Klaus_ww
Ja der Sketch läuft

Mit meinem SHT21 bin ich zufrieden. Es ist aber ein I2C-3,3V-Typ

Du musst die Bedingungen noch etwas zusammenfassen. Bestimme erst mal, was das wichtigste Schaltkriterium ist.

Das nimmst Du als erste Bedingung und dann hängst Du die, die zum gewünschten Ergebnis führen dran. Sowas läßt sich schlecht erklären. Ich schau mir das mal an.

Gruß Tommy

Ich weiß nicht, ob ich es richtig interpretiert habe.
Hauptbedingung scheint die Spannung zu sein.

Ich würde erst mal eine Variable led setzen und erst nach allen Bedingungen schauen, ob ich was ändern muss. Deshalb den alten Status in der Variablen ledalt.

Ob Du in 2 Wochen noch weißt, was h1 und h2 sind?
Besser wäre wenigstens hi, ha für innen und außen oder noch besser humiInnen und humiAussen oder feuchteInnen und feuchteAussen usw.
Das ist aber Deine Entscheidung.

Hier mal mein Versuch der Interpretation

/*
Grundbedingungen für das Einschalten sind:

Spannung muss größer 12,5 Volt
Spannung kleiner 12,5 Volt Lüfter ausschalten (Batterieschutz)
Luftfeuchte muss außen kleiner wie Luftfeuchte innen sein
Luftfeuchte außen größer wie Luftfeuchte innen Lüfter ausschalten


Schaltbedingungen wenn Grundbedingungen erfüllt sind:

Luftfeuchte innen größer 60% Lüfter ein
Luftfeuchte innen kleiner 55% Lüfter aus (Hysterese)

Temperatur  innen größer 30 °C Lüfter ein
Temperatur kleiner 25°C Lüfter aus (Hysterese)

Volt, % u. °C sind nur Beispielwerte. Genaue Werte muss ich noch ermitteln.

Im Sketch verwende ich folgende Bezeichnungen:
t1 = Temperatur innen
t2 = Temperatur außen
h1 = Luftfeuchte innen
h2 = Luftfeuchte außen
volt = Batteriespannung

*/

boolean led = false, leadalt = false;
...

// wegen der Hysterese
led = ledalt;
if (volt <= 12.5) led = false;
else {
  if ((h1 > 60) && (h1 > h2) && (t1 > 30)) led = true;
  if ((h1 < 55) || (h1 < h2) || (t1 < 25) ) led = false;
}
if (ledalt != led) {
  ledalt = led;
  if (led) digitalWrite(LED_PIN, HIGH);
  else digitalWrite(LED_PIN,LOW);
}

Probiers mal.

Gruß Tommy

Dein Batteriespannung wird sicher auch unter die 12,5V fallen, den Wert würde ich Richtung 11V verändern.

Gruß

@Scherheinz
Volt, % u. °C sind nur Beispielwerte. Genaue Werte muss ich noch ermitteln.

@Tommy
Danke
ja den SHT21 hattest du mir ja empfohlen

Als Temperatur-/Feuchtesensor würde ich den SHT22 nehmen (Achtung 3,3V). Der ist vorkalibriert. Der DHT22/11 hat nach meiner Erfahrung eine ziemliche Streuung und muss kalibriert werden.

Habe den Code von dir in die Loop kopiert aber erhalte diese Fehlermeldungen:

C:\Users\Jürgen\AppData\Local\Temp\arduino_modified_sketch_987591\Garage_2.ino.ino: In function ‘void loop()’:

Garage_2.ino:218: error: ‘h1’ was not declared in this scope

if ((h1 > 60) && (h1 > h2) && (t1 > 30)) led = true;

^

Garage_2.ino:218: error: ‘h2’ was not declared in this scope

if ((h1 > 60) && (h1 > h2) && (t1 > 30)) led = true;

^

Garage_2.ino:218: error: ‘t1’ was not declared in this scope

if ((h1 > 60) && (h1 > h2) && (t1 > 30)) led = true;

^

Garage_2.ino:219: error: ‘h1’ was not declared in this scope

if ((h1 < 55) || (h1 < h2) || (t1 < 25) ) led = false;

^

Garage_2.ino:219: error: ‘h2’ was not declared in this scope

if ((h1 < 55) || (h1 < h2) || (t1 < 25) ) led = false;

^

Garage_2.ino:219: error: ‘t1’ was not declared in this scope

if ((h1 < 55) || (h1 < h2) || (t1 < 25) ) led = false;

^

Garage_2.ino:223: error: ‘LED_PIN’ was not declared in this scope

if (led) digitalWrite(LED_PIN, HIGH);

^

Garage_2.ino:224: error: ‘LED_PIN’ was not declared in this scope

else digitalWrite(LED_PIN, LOW);

^

exit status 1
‘h1’ was not declared in this scope

Als LED_PIN musst Du Deine Variable LED einsetzen oder die in LED_PIN umbenennen. Mach die h1,h2,t1,t2 usw. mal global. Achtung die Deklarationen aus den Funktionen raus nehmen. Oder nimm gleich richtige Variablennamen ;)

Gruß Tommy

So Sketch läuft erstmal Fehlerfrei durch. Danke Habe diese Variablen:

float h2 = dht22_2.readHumidity(); float t2 = dht22_2.readTemperature(); float h1 = dht22_1.readHumidity(); float t1 = dht22_1.readTemperature();

nochmal vor void setup geschrieben.

Dann habe ich die Luftfeuchte innen auf 70% gesetzt. (Also > außen) Weiterhin habe ich diese Zeile geändert: if ((h1 > 60) && (h1 > h2) && (t1 > 20)) led = true; Somit sollte doch der Pin 13 High sein? Ist er aber nicht. Spannung ist 13,5 Volt. Also diese Bedingung ist auch erfüllt.

Deklaration von Variablen:

float h2;           
float t2;         
float h1;           
float t1;

Beschreiben tust Du sie in Deinen eigenen Messroutinen.

led ist erst mal nur eine Variable, was mit der LED passieren sollte.

Nach der Zeit, in der Du Dich mit dem Arduino beschäftigst, könntest Du mal einige Grundlagen lernen.

Gruß Tommy

Würde ich gerne machen. Leider fehlt mir die Zeit und das Grundwissen dazu.
Es geht schon damit los, dass ich vor 45 Jahren in der Schule eine andere Sprache als Englisch lernen musste.

led ist erst mal nur eine Variable, was mit der LED passieren sollte.

Verstehe ich nicht.
Trotzdem vielen Dank für Deine Hilfe
Gruß Jürgen

Wir scheinen eine ähnliche Altersklasse zu sein. Ich beginne gerade in der FHS einen Englischkurs, weil ich es auch nie in der Schule hatte. Man darf sich aber auch nicht nur darauf zurück ziehen und nix tun. Das ist zu bequem. Es gibt auch gute deutsche Literatur. Ich habe meinen Arduino seit Mai 2016, bin also auch noch am Lernen. Diesen Willen zum Lernen vermisse ich bei Dir.

Ich speichere in meinem Beispiel den zukünftigen Zustand der LED erst mal in led und schaue dann, ob sich überhaupt was geändert hat. Dazu brauchst Du keine Englischkenntnisse, nur den Willen es zu verstehen.

Gruß Tommy

Hallo Tommy
Schön das du diese Energie aufbringst und auch die Zeit dafür hast.
Das ist bei mir leider anders. Da ich mich um meine Eltern und Schwiegereltern kümmern muss, komme ich fast nie vor 18:00 Uhr nach Hause und am WE sind die Enkelkinder da.
Nur das wir nicht aneinander vorbei Reden.
Hier wollte ich nur aufzeigen was ich geändert habe, um die Bedingungen für High an Pin 13 zu erfüllen.

Dann habe ich die Luftfeuchte innen auf 70% gesetzt. (Also > außen)
Weiterhin habe ich diese Zeile geändert:
if ((h1 > 60) && (h1 > h2) && (t1 > 20)) led = true;
Somit sollte doch der Pin 13 High sein? Ist er aber nicht.
Spannung ist 13,5 Volt. Also diese Bedingung ist auch erfüllt.

Den Code von Dir habe ich natürlich komplett in den Sketch eingefügt.
“LED” bleibt aber auf LOW obwohl die Bedingungen erfüllt sind.

     boolean led = false, ledalt = false;

      // wegen der Hysterese
      led = ledalt;
      if (volt <= 12.5) led = false;
      else {
        if ((h1 > 60) && (h1 > h2) && (t1 > 20)) led = true; 
        if ((h1 < 55) || (h1 < h2) || (t1 < 15)) led = false;  
      }
      if (ledalt != led) {   
        ledalt = led;
        if (led) digitalWrite(LED, HIGH);
        else digitalWrite(LED, LOW);
      }

Gruß Jürgen
Sorry wenn ich dir auf die Nerven gehe!

Dann hänge Dir mal Serial.println-Ausgaben in die ifs rein und gib die Werte von led und ledalt aus.
Woher weißt Du, dass die (welche) Bedingung erfüllt ist?

Evtl. hilft Dir ansonsten diese deutsche Arduino-Referenz weiter. Link in Posting #12. Es gab vorgestern eine Aktualisierung.

Gruß Tommy

Woher weißt Du, dass die (welche) Bedingung erfüllt ist?

Ich meine die Bedingungen die den Lüfter (LED) einschalten sollten.
Also Luftfeuchte aussen < innen
Spannung > 12,5 Volt und
Temp innen > 20 °C