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
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
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).
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.
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
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?
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?
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.
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.
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 | }
|
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.