Go Down

Topic: Lueftersteuerung um den Keller zu trocknen (Read 4 times) previous topic - next topic

Julianchr

Hallo,
ich habe leider einen feuchten Keller, und möchte diesen nun mit Lüftern trocknen. Wenn die absolute Luftfeuchtigkeit draußen geringer ist als im Keller, sollen die Lüfter sich anschalten.

Die Hardware:

1. Alte (unbenutzte) Papst-Lüfter, made in W-Germany mit einer Menge Power.
2. Arduino R3 (China)
3. LCD Keypad Shield (China) scheint ein 1602 Clone zu sein (http://goo.gl/xnjjc)
4. 2x DHT22 (auch aus China ;-))
5. 2 Relay Module (mit 2x IN)

Die (Beta)Software: (Soweit ich bisher halt bin)

http://pastebin.com/728kHBn2

Die Probleme die noch zu lösen sind:

1. Relais schaltet sich ständig ein aus, da der immer wieder auf LOW springt, womit natürlich das Relais angeht.
2. Menuestruktur muss noch fertig gemacht werden, hab da aber schon eine Idee.
3. In LiquidCrystal sind irgendwie die Pins 4,5,6,7 für das LCD zugeordnet, obwohl die im Shield durchgeschliffen sind. Habe ich noch keine Ahnung     
    ob das Probleme verursacht, bzw wie ich das löse.
4. Muss mir noch eine Logik überlegen, wie die Steuerung mit Taupunkten umgeht die beieinander schwanken, damit der Lüfter nicht ständig an und 
    aus geht.
5. Später noch soll noch eine RTC dazu kommen, um zu gewissen Zeiten schalten zu können.

Wenn jemand Fragen oder Anregungen hat, immer zu  8)




michael_x

#1
Jul 05, 2013, 03:54 pm Last Edit: Jul 05, 2013, 04:06 pm by michael_x Reason: 1
Erklär mal bitte
Quote
da der immer wieder auf LOW springt

wer ist "der" ?

Macht der Arduino einen Reset wenn ein Lüfter startet, oder brauchst du nur eine größere Hystere ?

Nachtrag: Mein Problem   Nachtrag: Mit deinen Links komm ich nicht zurecht ...

Julianchr

#2
Jul 05, 2013, 04:02 pm Last Edit: Jul 05, 2013, 06:20 pm by uwefed Reason: 1
Also das Relais (optoelektr.) geht bei jedem Durchlauf an. Vermutlich weil es am LCD-Shield angeschlossen ist.

Schema des LCD-Shields: http://sainsmart.com/zen/documents/20-011-901/schematic.pdf

In dem Beispiel Sketch der Firma steht : LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
Damit wird vermutlich dann auch das Relais geschaltet, wenn etwas auf das LCD geschickt wird.
Aber was kann ich machen, ich hab auf dem Shield nur PIN 4,5,6,7 ???

Der Code lautet:

Code: [Select]
#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 5
#define dhtI 6
#define relais 7

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 count = 0;  //Counter fuer die Eingabe
int statL = 1;  //Status der Luefter
int menueH = 0; //Durchs Hauptmenue gehen
int statS = 0;  //brauche ich das??


void setup()
{
 Serial.begin(115200); //Verbindung Computer
 digitalWrite(relais, HIGH);
 pinMode(relais, OUTPUT);  
 lcd.begin(16, 2);
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("0.01 by Jules");
 delay(2500);  
}

void loop()
{
 
   if(statL == 1)  //notwendig um Relais zu schalten!!
   {
     digitalWrite(relais, LOW);      
   }
   
   else
   {
     digitalWrite(relais, HIGH);        
   }
 
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("Messung laeuft");
 
 
 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));    
 
 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)  //Ueberprueft die Luftfeuchtigkeit schaltet die Luefter und speichert den Status in statL
 {  
   digitalWrite(relais, HIGH); //Luefter ausschalten
   statL = 0;
 }
 
 else
 {
   digitalWrite(relais, LOW); //Lufter einschalten
   statL = 1;
 }
 
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("Erwarte Befehle");
   
   
   count = 0; //integer, wenn zu hoch Speicherüberlauf!!!

 while(count < 30000) //Menuefunktion
 {
   keypad.getKey();
   menueH = keypad.getKey();
   
   if(statL == 1) //notwendig um Relais zu schalten!!
   {
     digitalWrite(relais, LOW);      
   }
   
   else
   {
     digitalWrite(relais, HIGH);        
   }
   
   
   switch (menueH) //Einzelne Menuepunkte
   {
     case 1:
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("Taste1");
     delay(2000);
     lcd.clear();
     break;
     
     case 2:
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("Taste2");
     delay(2000);
     lcd.clear();
     break;
     
     case 3:
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("Taste3");
     delay(2000);
     lcd.clear();
     break;
     
     case 4:
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("Taste4");
     delay(2000);
     lcd.clear();
     break;
     
     case 5:
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("Taste5");
     delay(2000);
     lcd.clear();
     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(count);      
   
       
 }


//  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 ("____________________");

}

michael_x

Tja, das passt nicht zu

Code: [Select]
#define dhtA 5
#define dhtI 6
#define relais 7

Fragt sich wo das Umlöten leichter geht ;)

Oder, wenn man die Shields nicht aufeinander steckt sondern alles erforderliche einzeln verbindet ...

Julianchr

Was ich nicht verstehe, wenn ich die Schematik richtig verstehe, (und es sieht von hinten auf der Platine auch so aus) sind die Pins 4,5,6,7 nicht mit der Schaltung des Shields verbunden, sondern werden nur durchgeschliffen, andererseits wieder: LiquidCrystal lcd(8, 9, 4, 5, 6, 7);. Ich verstehe es wirklich nicht.

skorpi08

Es werden diese PINs für das Keypad Shield benötigt:  LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
Nutzte auch das Shield.

Dies hier musst du auf andere PINs verlegen:
Code: [Select]
#define dhtA 5
#define dhtI 6
#define relais 7


Für das Menü empfehle ich das hier: http://forum.arduino.cc/index.php/topic,73816.0.html

RTC kannst du dir sparen und selber programmieren oder mich fragen, ist genau so ungenau wie die 1307.
Nicht Mensch, nicht Tier: Programmierer halt...

Julianchr

Welche Pin´s kann ich denn nehmen, bzw wo muss ich anlöten?

michael_x

Ausserdem seh ich noch D10 , mit dem die Beleuchtung des LCD-Shields geschaltet wird.

Auf dem LCD Shield kannst du
an J5 die Signale D0..D3 und D11..D13 und
an J6 die Signale A1 .. A5 "frei" verwenden.

So lese ich jedenfalls deine pdf Datei...


Serenifly

#8
Jul 05, 2013, 05:03 pm Last Edit: Jul 05, 2013, 05:04 pm by Serenifly Reason: 1
Punkt 4 ist ganz einfach:

Code: [Select]

if(wert >= schaltpunkt + hysterese)
{
     Lüfter an
}
else if(wert < schaltpunkt - hysterese)
{
    Lüfter aus
}


Dann behält er innerhalb von 2 * hysterese seinen Zustand. "Schaltpunkt +/- Hysterese" kann man natürlich auch als eine Konstante schreiben

michael_x

@Serenifly:

Mach dir mal keine Sorgen, mit
Code: [Select]

const int SCHALTPUNKT=100;
const int HYSTERESE = 20;

wird der Compiler auch SCHALTPUNKT+HYSTERESE direkt beim Compilieren ausrechnen und genauso wie 120 verwenden.

Serenifly

#10
Jul 05, 2013, 05:19 pm Last Edit: Jul 05, 2013, 05:22 pm by Serenifly Reason: 1
Ich war mehr um die Übersichtlichkeit als die Speicherverwendung besorgt :)

Ist auch Geschmackssache hier. Eventuell braucht man das ja gar nicht getrennt.

Julianchr

So, ich hab jetzt die Sensoren an Pin 12 und 13 und das Relais an Pin 3 angelötet. jedoch springt das Relais nach wie vor ständig an?

michael_x

;)
dann such doch mal, wie du statL verwendest ;)

( Oder nimm die erste Stelle

 
Code: [Select]
  if(statL == 1)  //notwendig um Relais zu schalten!!
    {
      digitalWrite(relais, LOW);       
    }
   
    else
    {
      digitalWrite(relais, HIGH);       
    }
 

einfach mal weg ;)

uwefed

Julianchr, Deine Auflistung hat einen Fehler:
"2. Arduino R3 (China)"
Es gibt keinen Arduino R3 Made in China. Wenn Du ihn in China gekauft hast, ist es kein Arduino.
Grüße Uwe

Julianchr

#14
Jul 05, 2013, 08:19 pm Last Edit: Jul 05, 2013, 08:50 pm by Julianchr Reason: 1
Wie meinst du das mit dem Fehler in statL?

Ja, der Arduino ist eine Replik!

Nachtrag: Hab mal das Relais an PIN 11 gelötet, und siehe da es klappt  :smiley-sweat:
Pin 3 war wohl dorch irgendwie mit dem LCD verbunden

Go Up