Forum: Mikrocontroller und Digitale Elektronik Hygrostat für Terrarium bauen


von Martin H. (Gast)


Lesenswert?

Hallo Zusammen,


mein Name ist Martin und ich bin neu hier im Forum. Ich habe eine 
Ausbildung zum Elektroniker für Geräte und Systeme absolviert und 3 
Jahre lang als Facharbeiter im Bereich Analog/Digitalfunk gearbeitet.

Leider bin ich aus der Thematik der Microcontrollerprogrammierung ein 
wenig raus, daher wollte ich mich an euch wenden.

Ich hatte vor ein Hygrostat zu bauen um in einem Terrarium die 
Luftfeuchtigkeit in einem gewissen Fenster zu halten.

Die Elektronik ( Treiber etc. ) krieg ich selber auf die Kette. Für mich 
von relevanz ist , welchen Microcontroller sollte ich verwenden , 
welchen Feuchtigkeitssensor und wo finde ich vorgefertigte 
Programmschnipsel die ich dann für meine Bedürfnisse anpassen kann.

Das Programm sollte wie folgt arbeiten:

- Wenn Feuchtigkeit zu niedrig , Ausgang für 5 Sekunden aktivieren

- Nach 5 Minuten erneut prüfen und ggf. erneut 5 Sekunden aktivieren



Ich denke diese Aufgaben sollten nicht besonder schwierig für einen 
einfachen Controller zu bewältigen sein. Dennoch ahbe ich leider selber 
keine Ahnung.


Vielen Dank für eure Bemühungen im Vorraus

von Frank (Gast)


Lesenswert?

nur zwei Stichworte:

- Arduino als Mikrocontroller (ca. 25,-)
- Sensor DHT11 (ca. 5,-)
- als Treiber ein Mini-Relais oder solid state realais

Lesen und einarbeiten musst du schon selber ...

http://www.google.de/#hl=de&sclient=psy-ab&q=arduino+dht11&oq=arduino+dht11&gs_l=hp.3..0j0i30l3.1783.6423.0.6806.13.10.0.3.3.1.474.1723.0j8j0j1j1.10.0...0.0...1c.1.GnB0ZZepmUw&pbx=1&bav=on.2,or.r_gc.r_pw.r_qf.&fp=273aa0d90065244e&biw=1690&bih=925

von Albert M. (Firma: Bastler aus Mönchengladbach) (albertm) Benutzerseite


Lesenswert?

DHT22/AM2302 digital Sensor Feuchtigkeit Temperatur
für 6 Euro ist genauer als der DHT11
http://www.ebay.de/itm/DHT22-AM2302-digital-Sensor-Feuchtigkeit-Temperatur-Feuchte-Temperatur-Sensor-/170896035975?pt=Mess_Pr%C3%BCftechnik&hash=item27ca329087

Relais Modul mit Treiber für ca. 4 Euro
http://www.ebay.de/itm/2-Kanal-5V-Relay-Relais-Module-Modul-fur-Arduino-Special-Sensor-Shield-V4-0-/140796845376?pt=Elektromechanische_Bauelemente&hash=item20c8255d40

Arduino Board mit ATMega 328 für 14 Euro
http://www.ebay.de/itm/ATMEGA328P-ATMEGA8U2-Development-Board-w-USB-Cable-for-2011-Arduino-UNO-/261078990963?pt=Elektromechanische_Bauelemente&hash=item3cc9854073

Billiges Steckernetzteil mit ca 9V= Ausgang für Arduinoboard

Den ATMega auf dem Arduinoboard kannst Du mit der Arduino Software, 
BASCOM, LunaAVR oder in C programmieren.

Ich würde alles selber z.B. auf Lochraster aufbauen und einen ATmega 8 
oder 168 nehmen und noch ein billiges 2x16 Zeichen LCD Display zur 
Anzeige von Temperatur und Feuchte hinzunehmen. Dann brauchst Du 
allerdings noch einen Programmer (z.B. AVRISP MKII von Atmel ca. 40 
Euro).

von Martin H. (Gast)


Lesenswert?

Danke schonmal für die Infos. Wie gesagt , die Elektronik drumherum ist 
überhaupt kein Problem.

Für mich wäre nur die Frage , welches Board und welcher Sensor und woher 
bekomme ich Programmschnipsel um das ganze dann auf meinen Bedarf 
anzupassen.

Da habt ihr mir auf jeden Fall schon sehr geholfen , dafür vielen Dank. 
In den Rest muss ich mich wohl wirklich selber einarbeiten.

von Electronics'nStuff (Gast)


Lesenswert?

Was du vorhast ist eigentlich ziemlich simpel:

Du musst erstens einen Analogen Wert auslesen. Dafür verwendet man den 
A/D Wandler im Mikrocontroller. Wie der genutzt wird kannst du bspw. 
hier nachlesen:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe

Du findest in diesem Artikel die entsprechenden Register und sogar 
Codeschnipsel in C.

Wie genau müssen deine 5 Sekunden sein? Je nach dem musst du dich halt 
noch in Timer einarbeiten. Oder du machst einfach eine Zeitverzögerung 
von 5 Sekunden, dafür gibt es fertige Bibliotheken, musst du nix mehr 
studieren :)

Gruss

von Martin H. (Gast)


Lesenswert?

Ich hab mich mal wieder an das Thema begeben.

Ich habe aktuell nach den Empfehlungen mir einen DHT11 und ein Arduino 
UNO geholt.

Da ich die Programmiersprache wie gesagt noch nicht richtig beherrsche 
habe ich mir ein Beispiel geladen.

Die Quelle der Daten ist " 
http://learn.adafruit.com/dht/using-a-dhtxx-sensor "

Im Hauptprogramm findet man den Ausschnitt der sich Werte aus einem 
zuvor angelegten Register holt und diese an den PC weitergibt.

void loop() {
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow 
sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // check if returns are valid, if they are NaN (not a number) then 
something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.println(" *C");
  }
}

Mein Vorhaben müsste es jetzt natürlich sein, das Register zu verstehen 
und zu den Werten eine "über oder unter Schwellwert Abfrage" zu 
programmieren.

Hier wäre z.B. wenn ich das richtig erkenne, die Abfrage zur Temperatur.

//boolean S == Scale.  True == Farenheit; False == Celcius
float DHT::readTemperature(bool S) {
  float f;

  if (read()) {
    switch (_type) {
    case DHT11:
      f = data[2];
      if(S)
        f = convertCtoF(f);

      return f;
    case DHT22:
    case DHT21:
      f = data[2] & 0x7F;
      f *= 256;
      f += data[3];
      f /= 10;
      if (data[2] & 0x80)
  f *= -1;
      if(S)
  f = convertCtoF(f);

      return f;
    }
  }
  Serial.print("Read fail");
  return NAN;
}

float DHT::convertCtoF(float c) {
  return c * 9 / 5 + 32;
}

Kann mir Jemand sagen was die einzelnen Befehle in der Verkettung zu 
bedeuten haben?

von Martin H. (Gast)


Lesenswert?

Ich habe mich grade eben nochmal zu dem Thema beraten lassen. Wenn ich 
das ganze jetzt richtig verstanden habe ist es wie folgt:

float t = dht.readTemperature() // Hier wird der Unterprogramm 
dht.readTemperature aufgerufen. Der aus dem Programm folgende Wert wird 
als float ( Gleitkommazahl ) in das Register t geschrieben.

Ich müsste also dementsprechend ein Codesegment schreiben. Was diesen 
Wert mit einem Schwellwert vergleicht z.B. if <= 35 und daraufhin einen 
entsprechenden ausgang auf high setzt

then set high pin0
delay 5000
set low pin0

Liege ich damit richtig?

von Karl H. (kbuchegg)


Lesenswert?

Martin H. schrieb:
> Ich habe mich grade eben nochmal zu dem Thema beraten lassen. Wenn ich
> das ganze jetzt richtig verstanden habe ist es wie folgt:
>
> float t = dht.readTemperature() // Hier wird der Unterprogramm
> dht.readTemperature aufgerufen. Der aus dem Programm folgende Wert wird
> als float ( Gleitkommazahl ) in das Register t geschrieben.

und es heißt deswegen 't' weil in ihm die Temperatur gespeichert ist. 
Und PS: In einer Hochsprache nennt man so etwas eine 'Variable' und kein 
Register.

> Ich müsste also dementsprechend ein Codesegment schreiben. Was diesen
> Wert mit einem Schwellwert vergleicht z.B. if <= 35 und daraufhin einen
> entsprechenden ausgang auf high setzt
>
> then set high pin0
> delay 5000
> set low pin0
>
> Liege ich damit richtig?

Im Prinzip ja.
Nur: du kannst nicht einfach deine eigene Syntax erfinden!
Die Programmiersprache ist definiert und verwendet einen vorgegebenen 
Wortschatz. Du musst dich an die Sprache anpassen und nicht umgekehrt.

Ohne wenigstens rudimentäre Kentnisse der Programmierspache (in deinem 
Fall C++, aber ein einfaches C-Tutorial tuts für deine Zwecke auch) 
kommst du genau überhaupt nicht weiter.
1
...
2
3
  float t = dht.readTemperature();
4
5
  if( !isnan(t) )    // ist die Temperatur gültig oder
6
                     // liegt zb ein Sensordefekt vor?
7
  {
8
    if( t > 35 ) 
9
    {
10
       ... mach was
11
    }
12
    else
13
    {
14
       ... mach was anderes
15
    }
16
  }

Kauf dir zumindest ein C-Buch und arbeite die ersten paar Kapitel durch 
und such dir ein Arduino Tutorial für den Hardwarespezifischen Teil. Das 
reicht für dein Vorhaben. Aber ohne geht es nicht.

von Martin H. (Gast)


Lesenswert?

Dass ich meine eigene Synthax nicht erfinden kann ist mir natürlich 
klar. Das war jetzt einfach mal so aus der Hüfte geschossen um zu 
schauen ob ich denn in die richtige Richtung denke. Oder ob ich sowieso 
total auf dem Holzpfad bin.

Die richtigen Befehle hätte ich mir natürlich rausgesucht. Aber vielen 
Dank, dass du mir ein Beispiel gezeigt hast wie der Code aussehen meinen 
Vorstellungen nach aussehen müsste.

von Martin H. (Gast)


Lesenswert?

Ich habe jetzt mal das Beispiel Programm genommen und verändert.

An PIN 4 (humid) würde später über entsprechenden Treiber die Pumpe zur 
Befeuchtung geschlossen.

An PIN 5 (heat) würde ebenfalls über Treiber die Heizung angeschlossen 
werden.
1
#include "DHT.h"
2
#define DHTPIN 2     // what pin we're connected to
3
#define DHTTYPE DHT11   // DHT 11 
4
DHT dht(DHTPIN, DHTTYPE);
5
6
int humid = 4
7
int heat = 5
8
9
void setup() 
10
{
11
  pinMode(humid, OUTPUT);
12
  pinMode(heat, OUTPUT);
13
  
14
  Serial.begin(9600); 
15
  Serial.println("DHTxx test!");
16
 
17
  dht.begin();
18
}
19
20
void loop() {
21
  
22
  float h = dht.readHumidity();
23
  float t = dht.readTemperature();
24
25
  if (isnan(t) || isnan(h)) {
26
    Serial.println("Failed to read from DHT");
27
  } else {
28
    Serial.print("Humidity: "); 
29
    Serial.print(h);
30
    Serial.print(" %\t");
31
    Serial.print("Temperature: "); 
32
    Serial.print(t);
33
    Serial.println(" *C");
34
    if ( t < 30 )
35
    {
36
      digitalWrite(heat, HIGH);
37
    }
38
    if ( t > 36 )
39
    {
40
      digitalWrite(heat, LOW);
41
    }
42
    if ( h < 40 )
43
    {
44
      digitalWrite(humid, HIGH);
45
      delay(5000)
46
      digitalWrite(humid, LOW);
47
  }
48
}

von Manuel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Martin!

Ich habe die letzten Tage den AM2302 Sensor über einen PIC 16F88 
ausgelesen was sehr gut funktioniert. Der Sensor ist am PORTB.1 
angeschlossen.

Im Anhang die Lese Routine.

lg Manuel

von Manuel (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, falsches File!
Hier das Richtige..

Mein Tip für den Anfang:

Lass die Bibliotheken mal weg und probier selbst was zu erstellen. In 
den Datenblättern findest du alles notwendige und erhältst dazu auch das 
notwendige Verständnis.

Hilfreich dabei ist ein kleiner Datenlogger, welcher dir zeigt was am 
Bus gerade läuft.

lg Manuel

von Manuel (Gast)


Lesenswert?

Wichtig:

Die Checksumme wird in dieser Schleife icht berechnet. Müsste wie folgt 
aussehen:

if(tx_data[4] == !(tx_data[0]&tx_data[1]&tx_data[2]&tx_data[3])){
       //fehler...mach irgendwas, lese neu.. etc
       }

Bit 5 (tx_data[4]) ist die Checksumme des AM2302, die UND Verknüpfung 
der BIT 0 -3 sollte dieses Bitmuster ergeben.

lg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.