Pages: 1 [2] 3 4   Go Down
Author Topic: Lueftersteuerung um den Keller zu trocknen  (Read 4083 times)
0 Members and 1 Guest are viewing this topic.
Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 3001
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Wie meinst du das mit dem Fehler in statL?

Entweder du hast es inzwischen korrigiert oder ich hab mich verguckt. smiley-wink

( Sorry, klar. Ich muss mich wohl verguckt haben )

(statL=1) und digitalWrite(relais, LOW), sowie dessen Gegenteil,  müssen immer zusammenpassen. Und das tun sie auch.

Allerdings fehlt die Hysterese, also ein Bereich, in dem nichts verändert wird, sondern nur der alte Zustand beibehalten wird.
Und mehrmals in loop() einen Digitalausgang setzen muss nicht falsch sein, könnte aber smiley-wink

Blinkt der "unbenutzte" Pin 3 denn jetzt ( wenn du eine LED mit Vorwiderstand dransteckst )?
Dass das Relais permanent hin und her geschaltet hat, kann ja nur mit der loop - Zeit von 2 * delay(500) zusammenhängen, schätze ich...
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So, im Prinzip funktioniert jetzt alles  smiley-lol
mal sehen, was noch dazu kommt.
Vielen Dank für die kompetente Hilfe.

Code:
___________________________________                                                                                                                       
Verwendete Teile:

Arduino R3
Sainsmart 1602 LCD Keypad Shield
optoelektronisches Relais
2x DHT22
___________________________________
Key Codes (in left-to-right order):

None   - 0
Select - 1
Left   - 2
Up     - 3
Down   - 4
Right  - 5
___________________________________

*/

#include <dht.h>
#include <LiquidCrystal.h>
#include <DFR_Key.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


dht DHT;
DFR_Key keypad;

#define dhtA 12
#define dhtI 13
#define relais 11


int localKey = 0;      //Tastenerkennung
String keyString = ""; //??

double dewPointFast(double celsius, double humidity) //Taupunkt berechnung
{
        double a = 17.271;
        double b = 237.7;
        double temp = (a * celsius) / (b + celsius) + log(humidity/100);
        double Td = (b * temp) / (a - temp);
        return Td;
}

float dewI = 0; //Taupunkt Innen
float dewA = 0; //Taupunkt Aussen
float tempI = 0;//Temperatur Innen
float tempA = 0;//Temperatur Aussen
float humI = 0; //Luftfeuchtigkeit Innen
float humA = 0; //Luftfeuchtigkeit Aussen
int hysterese = 1; //Hysterse (mal 2) für die Schaltung

long count = 0;  //Counter fuer die Eingabe
int statL = 0;  //Status der Luefter
int menueH = 0; //Durchs Hauptmenue gehen
//int menueS = 0; //Menue bei Select
int menueC = 0;
int intro = 0;

long previousMillis = 0;
long milliMil = 0;
long milliMin = 0;
long milliStd = 0;



void setup()
{
  Serial.begin(115200); //Verbindung Computer
  pinMode(relais, OUTPUT);
  digitalWrite(relais, HIGH);

 
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Fan Control");
  lcd.setCursor(0, 1);
  lcd.print("Version 0.1.9");
 
  while(intro < 5)
  {
    lcd.setCursor(15, 1);
    lcd.print((char)0x7C);
    delay(500);
    lcd.setCursor(15, 1);
    lcd.print((char)0x2D);
    delay(500);   
    intro++;
  }
 
  delay(2500); 
}

void loop()
{
  unsigned long currentMillis = millis();
  milliMil = currentMillis - previousMillis;
  milliMin = milliMil / 60000;
  milliStd = milliMin / 60;
 
 
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Hello Dave,");
  lcd.setCursor(0, 1);
  lcd.print("I'm very busy");
 
 

   
  DHT.read22(dhtI); //Sensor Innen auslesen
  //delay(500);
  //DHT.read22(dhtI);
  float humI = DHT.humidity;
  float tempI = DHT.temperature;
  float dewI = (dewPointFast(DHT.temperature, DHT.humidity));   
 
  delay(1500);
 
  DHT.read22(dhtA); //Sensor Aussen auslesen
  //delay(500);
  //DHT.read22(dhtA);
  float humA = DHT.humidity;
  float tempA = DHT.temperature;
  float dewA = (dewPointFast(DHT.temperature, DHT.humidity));
 
  //dewA = dewA - 5; //Test!!!!!!!!!!!!!!!!!!!
 
  if (dewA <= dewI - hysterese)  //Ueberprueft die Luftfeuchtigkeit schaltet die Luefter und speichert den Status in statL
  {   
    digitalWrite(relais, LOW); //Luefter einschalten
   
    if (statL == 0)
    {
    previousMillis = millis();
    }
    statL = 1;
  }
 
  else if (dewA > dewI + hysterese)
  {
    digitalWrite(relais, HIGH); //Lufter ausschalten
   
    if (statL == 1)
    {
    previousMillis  = millis();
    }
    statL = 0;
   
  }
 
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("HAL:Im waiting");
    lcd.setCursor(0, 1);
    lcd.print("    for command");
   
   
    count = 0;
 
  while(count < 300000) //Menuefunktion
  {
    keypad.getKey();
    menueH = keypad.getKey();
       
    switch (menueH) //Einzelne Menuepunkte
    {
      case 1:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Luefter:");
      lcd.setCursor(9, 0);
      Serial.println(statL);//loeschen
      if(statL == 1)
      {
        lcd.print("AN");
      }
      if(statL == 0)
      {
        lcd.print("AUS");
      }
     
      lcd.setCursor(0, 1);
      lcd.print(milliStd);
      lcd.print("Std ");
      lcd.print(milliMin);
      lcd.print("Min ");
      delay(1000);
      break;         
     
      case 2: //Relais ausschalten Pfeil nach links
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Luefter: Aus");
      digitalWrite(relais, HIGH); //Schalte Relais AUS
      delay(1000);//Verzögere um erneute Eingabe zu verhindern
     
      menueC = 0; //setze Schaltzustand auf 0     
      while(menueC != 1) //Manueller Luefter
      {
        keypad.getKey();
        localKey = keypad.getKey();
         
        if (localKey == 2) //Wenn 2 gedrückt wird wird die Schleife beendet
        {
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Automatikmodus");
          lcd.setCursor(0, 1);
          lcd.print("ist AN");
          previousMillis  = millis(); //setze Timer auf Null
          digitalWrite(relais, HIGH); //Schaltet Luefter wegen Hysterese aus!
          delay(1000);
          menueC = 1; //beende Schleife
        }
         
      }
      break;
     
       
      case 3: //Anzeige Daten Aussen Pfeil nach oben
 
      //Erste Zeile
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Aussen: ");
     
      lcd.print(dewA);
      lcd.print((char)223);
      lcd.print("C");
 
      //Zweite Zeile
      lcd.setCursor(0, 1);
      lcd.print(tempA);
      lcd.print((char)223);
      lcd.print("C ");
 
      lcd.print(humA);
      lcd.print((char)0x25);
      delay(1000);
      break;
     
      case 4: //Anzeige Daten Keller Pfeil nach unten
 
      //Erste Zeile
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Keller: ");
 
      lcd.print(dewI);
      lcd.print((char)223);
      lcd.print("C");
 
      //Zweite Zeile
      lcd.setCursor(0, 1);
 
      lcd.print(tempI);
      lcd.print((char)223);
      lcd.print("C ");
 
      lcd.print(humI);
      lcd.print((char)0x25);
      delay(1000);
      break;
     
      case 5: //Luefter einschalten Pfeil nach rechts
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Luefter: An");
      digitalWrite(relais, LOW); //Schalte Relais AN
      delay(1000);//Verzögere um erneute Eingabe zu verhindern
     
      menueC = 0; //setze Schaltzustand auf 0     
      while(menueC != 1) //Manueller Luefter
      {
        keypad.getKey();
        localKey = keypad.getKey();
         
        if (localKey == 5) //Wenn 5 gedrückt wird wird die Schleife beendet
        {
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Automatikmodus");
          lcd.setCursor(0, 1);
          lcd.print("ist AN");
          previousMillis  = millis(); //setze Timer auf Null
          digitalWrite(relais, HIGH); //Schaltet Luefter wegen Hysterese aus!
          delay(1000);
          menueC = 1; //beende Schleife
        }
         
      }
      break;
    }
     
    if(menueH != SAMPLE_WAIT) //Setzt den Counter auf Null wenn Eingabe erfolgt ist.
    {
      count = 0;
    }
   
   
    else   
    {
      count++; //Ohne Einmgabe laueft der Counter
    }
   
   
 }
 
 
  Serial.println ("Innensensor:");
  Serial.print ("humI: ");
  Serial.println (humI);
  Serial.print ("tempI: ");
  Serial.println (tempI);
  Serial.print ("dewI: ");
  Serial.println (dewI);
  Serial.println ("");
 
 
  Serial.println ("Aussensensor:");
  Serial.print ("humA: ");
  Serial.println (humA);
  Serial.print ("tempA: ");
  Serial.println (tempA);
  Serial.print ("dewA: ");
  Serial.println (dewA);
  Serial.println ("____________________");

}
« Last Edit: July 05, 2013, 07:43:36 pm by Julianchr » Logged

Offline Offline
Faraday Member
**
Karma: 116
Posts: 3904
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Für Code musst du diese Tags verwenden:
[.code]
[./code]

Ohne die Punkte. Oder Einfach auf den # Knopf klicken.


Deine Ausgabe auf dem LCD solltest du zumindest teilweise in eine Methode auslagern und die Position auf dem Display und den Inhalt mit Parametern übergeben. Das wird dann wesentlich übersichtlicher. z.B. so ähnlich:
Code:
void printLCD(byte x, byte y, char* str)
{
    lcd.setCursor(x,y);
    lcd.print(str);
}

Oder eine PrintTemp Methode die das "°C" dranhängt, da du das mehrmals machst

Double bringt dir hier übrigens keine höhere Präzision als Float. Beide haben auf dem Arduino 4 Byte

String keyString = ""; //?? <--- das ist einfach ein leeres String-Objekt falls dich das noch wundert

Wenn du nur zwei Zustände in einer Variable speichern willst ist int Verschwendung. Da nimmt man bool/boolean. Der nimmt true/false an.

Das kannst du einfach so abfragen:
Code:
bool state = false;

void loop()
{
     if(state)    //oder deutlich: if(state == true)
     {
         ...
     }
}

Andersherum:
Code:
if(!state)    //oder: if(state == false)
{
}
« Last Edit: July 05, 2013, 05:30:29 pm by Serenifly » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also wie ich jetzt den Code poste habe ich irgendwie noch nicht verstanden  smiley-roll-blue

Pin 3, hing am Shield und deshalb hat er bei jeder LCD Ausgabe geschaltet.

Ja, der Code muss noch aufgeräumt werden  smiley-wink
bin aber froh, dass er zumindest rudimentär funktioniert.
Dass mit der Hysterese war ein super Tipp, der macht das deutlich einfacher...
Danke nochmal, ich werde aber weiterhin über das Projekt schreiben. Vielleicht kann das ja jemand gebrauchen.
 
Logged

Offline Offline
Faraday Member
**
Karma: 116
Posts: 3904
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das sind die normalen Tags in eckigen Klammern wie sie in allen Foren sind.

[.code]
//Code hier
[./code]

Und die Punkte nach der ersten Klammer weglassen. Die habe hier nur reingemacht damit man es sieht.

Oder: Code markieren und oben bei den Icons auf den #-Knopf klicken (untere Reihe, dritter von rechts)
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 257
Posts: 21468
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die Variablen um millis() abzuspeichern müssen unsigned long sein ansonsten gibt es nach 25 Tagen Probleme weil die Zahl dann negativ wird.
Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So, habe heute den ersten Aufbau installiert. Soweit ich das sagen kann ,funktioniert alles. Ich werde den Code aber noch weiter aufräumen. Mein größtes Problem ist, dass die Tasten nur unzuverlässig funktionieren. Keine Ahnung ob das an der unzureichenden Entprellung in der Library oder am Code liegt. Naja dafür, dass ich zum ersten Mal programmiert habe, bin ich stolz^^.

Für die Zukunft sind geplant:

Datenlogger;
RTC;
anderes LCD bzw Tasten;
Umrüsten auf Arduino mini pro; 

Hier also der Staus Q : da mehr als 9500 Zeichen: http://pastebin.com/FJDEUndK

P.S.
Danke Uwe!, ist gemacht;
Dass mit dem Code bekomme ich mittlerweile hin, aber der ist wohl zu groß^^. Danke Serenifly!;
Ja, diese Relais, haben mich auch schlaflos gemacht, danke Michael!;

P.P.S Für die Ausgabe der Zeit habe ich vorerst die Methode von Fribbe verwendet, da mich die fehlenden 0en gestört haben: http://macherzin.net/Arduino++Echtzeit
« Last Edit: July 07, 2013, 05:23:28 pm by Julianchr » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hat jemand Erfahrungswerte, welche Hysterese man für die Schaltung verwenden sollte?

Momentan sieht es so aus: hysterese = 1
                                            dewA = Taupunkt Aussen
                                             dewI = Taupunkt Innen


if (dewA <= dewI - hysterese)  //Ueberprueft die Luftfeuchtigkeit schaltet die Luefter und speichert den Status in statL
  {   
    digitalWrite(relais, LOW); //Luefter einschalten
   
    if (statL == 0)
    {
    previousMillis = millis();
    time_t Zeitstempel = now();
    }
    statL = 1;
  }
 
  else if (dewA > dewI + hysterese)
  {
    digitalWrite(relais, HIGH); //Lufter ausschalten
   
    if (statL == 1)
    {
    previousMillis  = millis();
    time_t Zeitstempel = now();
    }
    statL = 0;
   
  }
« Last Edit: July 07, 2013, 08:37:33 pm by Julianchr » Logged

Offline Offline
Faraday Member
**
Karma: 116
Posts: 3904
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das muss man ausprobieren. Das hängt auch damit zusammen wie schnell sich deine Werte ändern (die Regelgröße) und wie groß der Raum ist (die Regelstrecke)
Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1127
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Deine Tasten funktioineren nicht zuverlässig. da du delays in deinem Programm verwendest du solltest dir vieleicht ein paar Merker bauen sowas wie t1000ms und t1500ms. Die dann Entsprechend mit millis setzen und dann wenn sie gesetzt sind sie in einer Scheife abfragen  z.B.
Code:

if(t1500ms){  // Hier läuft er erst rein wenn der Merker HIGH ist
// hier der Code der nur einmal alle 1500ms bzw 1m5 sekunden ausgeführt wird
t1500ms=!t1500ms;   // setzt den Merker zurück da er hier nur positiv sein kann wird der invertier und low 
}

if{t1000ms){
// Der Code für einmal die Sekunde
}


Du musst dann nur noch per millis prüfen wann die nächsten 1000ms bzw 1500ms vorbei sind.
So kann man es einfach Strukturieren oder wenn man den Merker t1000ms oder t1500ms öfter braucht, oder du machst es analog zu Blinkwithout delay.




Gruß
Der Dani
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Obwohl Du von absoluter Luftfeuchtigkeit sprichst, solltest Du Dir ebenfalls Gedanken über die relative Luftfeuchtigkeit machen.
Du bläst "trokene", jedoch warme Luft in einen kühlen Raum. Die warme Luft kühlt aus und die relative Luftfeuchtigkeit steigt mit der Auskühlung an. Das kann soweit gehen, dass die darin enthaltene Feuchtigkeit kondensiert. Somit hast Du schnell mit einer Entfeuchtungsanlage einen Befeuchter gebaut.
Ich denke, Du bist besser bedient, wenn Du einen Luftentfeuchter zulegst. So bist Du auch nicht auf die Witterung angewiesen. Eventuell wäre es auch sinnvoll, an der Quelle der Feuchtigkeit anzusetzen.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Deswegen ja der Unterschied mit absoluter und relativer Luftfeuchtigkeit. was ich noch hinzufüge ist ein Intervall, um sich die Luft im Keller akklimatisieren zu lassen und  einen Temperatursensor an/in der Wand, um eine Kondensation der Luft an dieser zu vermeiden. Ein Luftentfeuchter ist mir einerseits in der Anschaffung zu teuer, andererseits verbraucht dieser, meinem Geschmack nach viel zu viel Energie. Ich bin zwar kein Öko. möchte aber auch nicht die Umwelt verpesten.
« Last Edit: July 14, 2013, 05:39:40 pm by Julianchr » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo zusammen,

als Neuling möchte ich Euch alle erst mal grüßen.

Da ich auch das Problem mit dem feuchten Keller habe und gerne eine Arduino-Lösung dafür bauen möchte, bin ich sehr an Euren Erfahrungen interessiert.

Ich würde gerne wissen, wie man den Taupunkt und die absolute Feuchte messen kann. Ich finde nur Sensoren für die relative Feuchte. Für Taupunkt und absolute Feuchte müsste ich noch die Temperatur und den Luftdruck messen und daraus Taupunkt und absolute Feuchte (aufwändig!?!) berechnen.

Gibt es Sensoren, die den Taupunkt messen?

V
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 143
Posts: 2996
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich würde gerne wissen, wie man den Taupunkt und die absolute Feuchte messen kann. Ich finde nur Sensoren für die relative Feuchte. Für Taupunkt und absolute Feuchte müsste ich noch die Temperatur und den Luftdruck messen und daraus Taupunkt und absolute Feuchte (aufwändig!?!) berechnen.

Üblicherweise mißt Du Temperatur und relative Luftfeuchte und errechnest daraus die Taupunkttemperatur mit einer Berechnung. Je genauer Du die Werte der relativen Luftfeuchte und der Temperatur messen kannst, desto genauer wird die errechnete Taupunkttemperatur ausfallen.

Luftdruck wird bei der Berechnung in der Meteorologie üblicherweise vernachlässigt. Es sei denn Du willst die Taupunkttemperatur nicht für atmosphärische Bedingungen berechnen, sondern zum Beispiel innerhalb einer Turbine.

Gibt es Sensoren, die den Taupunkt messen?

Es gibt Sensoren, die die relative Luftfeuchte und die Temperatur mit unterschiedlicher Genauigkeit messen können. Billige Sensoren sind meist ungenauer, teure Sensoren genauer. Und teure Sensoren können noch genauer werden, wenn sie entweder mit Referenzsensoren oder mittels gesättigter Salzlösungen in Klimakammern abgeglichen und kalibriert werden.

In Sachen Taupunkttemperatur sind die Referenzsensoren für die manuelle Messung von Hand sogenannte "Aspirations Psychrometer" und für automatisierte Messungen sogenannte "Taupunktspiegel-Hygrometer‎". Aber mit solchen hochwertigen Spezial- und Referenzsensoren kann es insbesondere beim Taupunktspiegel-Hygrometer‎ sein, dass der Sensor dann mehr Wert ist als ein feuchter Keller.
« Last Edit: November 01, 2013, 03:34:57 pm by jurs » Logged

Offline Offline
Full Member
***
Karma: 5
Posts: 129
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo V Malkowitz,

Welcome on Board.. nen kleinen Tipp an ne Newbie, lass mal das, was älter als 6 Monate ist, im Archiv liegen, also mit Deiner Antwort liegst du hart an der Grenze.

smiley-wink   nur mal als Tip..

Zu den Fachbegriffen: Strg+C, Strg+V ins Wikipedia... Hier sind Freaks unterwegs, wo sogar so machem Dottore die Luft vor Facwissen wegbleibt.

Fürs Entfeuchten habe ich gute Erfahrungen mit nem zerlegtem Kühlschrank gemacht, das dann noch Zeit/Feucte gsteuert, Jop, wie gesagt,

Welcome on Board..

Greetz, Linpotec
Logged

العشب أخضر، أن الكرة مستديرة،

Pages: 1 [2] 3 4   Go Up
Jump to: