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

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  smiley-cool



Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2734
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ...
« Last Edit: July 05, 2013, 09:06:55 am by michael_x » Logged

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

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

}
« Last Edit: July 05, 2013, 11:20:58 am by uwefed » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2734
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tja, das passt nicht zu

Code:
#define dhtA 5
#define dhtI 6
#define relais 7
Fragt sich wo das Umlöten leichter geht smiley-wink

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

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

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.
Logged

Cloppenburg
Offline Offline
God Member
*****
Karma: 23
Posts: 800
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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.
Logged

Arduino UNO, Ethernet Shield, Keypad Shield
1284p, Arduino MEGA.

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

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

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2734
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...

Logged

Offline Offline
Faraday Member
**
Karma: 79
Posts: 2727
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Punkt 4 ist ganz einfach:

Code:
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
« Last Edit: July 05, 2013, 10:04:39 am by Serenifly » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2734
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Serenifly:

Mach dir mal keine Sorgen, mit
Code:
const int SCHALTPUNKT=100;
const int HYSTERESE = 20;
wird der Compiler auch SCHALTPUNKT+HYSTERESE direkt beim Compilieren ausrechnen und genauso wie 120 verwenden.
Logged

Offline Offline
Faraday Member
**
Karma: 79
Posts: 2727
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich war mehr um die Übersichtlichkeit als die Speicherverwendung besorgt smiley

Ist auch Geschmackssache hier. Eventuell braucht man das ja gar nicht getrennt.
« Last Edit: July 05, 2013, 10:22:13 am by Serenifly » Logged

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

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?
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2734
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

smiley-wink
dann such doch mal, wie du statL verwendest smiley-wink

( Oder nimm die erste Stelle

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

einfach mal weg smiley-wink
Logged

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

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
Logged

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

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
« Last Edit: July 05, 2013, 01:50:42 pm by Julianchr » Logged

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