Offline
Newbie
Karma: 0
Posts: 3
|
 |
« on: January 13, 2013, 10:50:12 am » |
Deutsch: Hey Leute, Ich wollte mit einem Freund zusammen eine (Modell-)Arena bauen, bei der das Dach (mithilfe des Arduinos) sich schließt sobald der Feuchtigkeitssensor meldet, dass es feucht ist. Das Dach soll dann für 20 Minuten geschlossen bleiben und sich danach wieder öffnen, doch falls der Feuchtigkeitssensor nach dem Öffnen des Dachs wieder Feuchtigkeit meldet soll das Dach natürlich wieder schließen. Leider bin ich noch ein Anfänger was den Umgang mit dem Arduino angeht, daher bekomme ich das Programm auch nicht auf die Reihe Kann mir hier vielleicht einer weiterhelfen ? Wäre echt sehr nett  Danke im voraus  ------------------------------------------------------------------------------------------------------------------------ English ( google translator )  : Hey guys, I was with a friend to build a (model) arena, wherein the roof (using the Arduino) closes itself when the humidity sensor reports that it is wet. The roof will then be closed for 20 minutes and then, after 20 minutes open again. Unfortunately, I am still a beginner in working with the Arduino, so I don´t even get the program to the series: ( Can help me here maybe one? Would be really nice  It would be grate if someone could help me 
|
|
|
|
|
Logged
|
|
|
|
|
Germany
Online
Edison Member
Karma: 33
Posts: 1838
Arduino rocks
|
 |
« Reply #1 on: January 13, 2013, 11:50:33 am » |
I don´t even get the program to the series Nette Übersetzung...  Grundsätzlich solltest du dir überlegen, mit welcher Hardware du das realisieren willst: Ein Servo lässt sich ohne weiteren Treiberbaustein ansteuern, ein normaler Getriebemotor braucht hierzu eine H-Brücke, wenn er in beide Richtungen (Auf und Zu) laufen soll. Für Modelle finde ich Servos schon ganz praktisch, schau dir mal das Servo-Beispiel an, da ist das gut erklärt: http://arduino.cc/en/Tutorial/SweepDann musst du noch festlegen, welchen Feuchtigkeitssensor du verwenden willst, danach orientiert sich dann die weitere Programmierung.
|
|
|
|
|
Logged
|
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 124
|
 |
« Reply #2 on: January 13, 2013, 11:59:38 am » |
Ich halte es für realistischer, wenn das Dach geschlossen bleibt solange der Sensor Feuchtigkeit meldet. Programmablauf also 1. Feuchtigkeitssensor abfragen 2. wenn feucht dann Dach zu für 20 Minuten, wenn nach 20 Minuten trocken dann Dach auf 3. gehe zu 1. also so in Kurzform dargestellt 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
BZ (I)
Online
Brattain Member
Karma: 172
Posts: 16139
+39 349 2158303
|
 |
« Reply #3 on: January 13, 2013, 05:53:09 pm » |
Luftfeuchtigkeit ist keine genügend genaue Meßwert um Regen zu detektieren. Dasu braucht es einen Oberflächen-Flüssigkeitssensor ( im einfachsten Fall 2 Drähte zwiscen denen man den Widerstand mißt. Grüße Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Germany S-H
Offline
God Member
Karma: 35
Posts: 950
|
 |
« Reply #4 on: January 14, 2013, 02:29:49 am » |
Ich wollte mit einem Freund zusammen eine (Modell-)Arena bauen, bei der das Dach (mithilfe des Arduinos) sich schließt sobald der Feuchtigkeitssensor meldet, dass es feucht ist. Das Dach soll dann für 20 Minuten geschlossen bleiben und sich danach wieder öffnen, doch falls der Feuchtigkeitssensor nach dem Öffnen des Dachs wieder Feuchtigkeit meldet soll das Dach natürlich wieder schließen. Leider bin ich noch ein Anfänger was den Umgang mit dem Arduino angeht, daher bekomme ich das Programm auch nicht auf die Reihe  Da Du nichts von der Steuerung des Daches schreibst und wie es bewegt wird, z.B. von Motoren und Endschaltern, die das Erreichen der Endstellungen melden, gehe ich davon aus, dass Du eine Steuerung mit "Servos" machst, denen Du eine Stellung vorgibst, und diese vorgegebene Servostellung wird vom Servo selbsttätig angefahren. Das mit der "Servosteuerung" ist also eine Annahme. Ansonsten würde ich eine Time-Library einbinden, damit Du einen verlässlichen Zeittakt hast, der über das Überlaufen des millis-Timers (ca. 50 Tage) hinausreicht. Falls das Programm nie länger als 50 Tage am Stück arbeiten muss, weil der Arduino zwischendurch ausgeschaltet/resettet wird, könntest Du die Time-Library auch weglassen und die Zeit per millis() statt mit now() ermitteln (mit Angabe der Hysterese dann in Millisekunden statt Sekunden). Mein Vorschlag für die Feuchtesteuerung mit Servo-Dachöffner: #include <Time.h> #define OFFEN true #define GESCHLOSSEN false #define NASS true #define TROCKEN false // Zwanzig Minuten sind 1200 Sekunden #define HYSTERESE 1200
// Zwei Variablen merken sich die Zeit wann zuletzt "TROCKEN" // oder "NASS" festgestellt wurde long zuletztNass, zuletztTrocken;
// Annahme: Dach wird über Servos gesteuert, die Steuerung kennt den Status boolean dachStatus; // Eine Variable merkt sich den Status des Daches
void dachBewegen(boolean neuerStatus) { // Dach bewegen und den dachStatus setzen // hier den Code zum Bewegen des Daches dachStatus=neuerStatus; }
boolean feuchteMessen() { // hier den Regensensor auswerten und TROCKEN oder NASS zurückliefern return(TROCKEN); // return(NASS); }
void setup() { Serial.begin(9600); // Dach auf einen definierten Anfangsstatus setzen // Annahme: Dach wird über Servos gesteuert if (feuchteMessen()== NASS) dachBewegen(GESCHLOSSEN); else dachBewegen(OFFEN); }
void loop() { if (feuchteMessen()== NASS) zuletztNass=now(); else zuletztTrocken=now(); if ((dachStatus==OFFEN) && (zuletztNass>zuletztTrocken)) dachBewegen(GESCHLOSSEN); else if ((dachStatus==GESCHLOSSEN) && (zuletztTrocken>zuletztNass+HYSTERESE)) dachBewegen(OFFEN); }
Für eine Steuerung, bei der normale Gleichstrommotoren statt Servos das Dach bewegen und die Endstellungen mit Endschalter-Sensoren gemeldet werden, ist so eine Logik allerdings nur bedingt brauchbar.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 68
|
 |
« Reply #5 on: January 14, 2013, 03:06:55 am » |
Hallo jurs, interessanter Code. Vorweg, ich fange gerade erst damit an  Lieg ich richtig in der annahme, das mann eigene definierte Namen für define, boolean, long etc. verwenden kann. LG. Rene
|
|
|
|
|
Logged
|
|
|
|
|
Germany S-H
Offline
God Member
Karma: 35
Posts: 950
|
 |
« Reply #6 on: January 14, 2013, 04:04:50 am » |
Lieg ich richtig in der annahme, das mann eigene definierte Namen für define, boolean, long etc. verwenden kann.
Mit #define legst Du Definitionen für den Präprozessor des Compilers fest, quasi Ersetzungs-Code. Wenn ich beispielsweise definiere #define OFFEN true dann ist das im Code genau so als wenn überall wo "OFFEN" steht tatsächlich "true" stehen würde und genau so sieht es der Compiler und compiliert das Programm. Eine "#define" Zeile ist quasi nichts anderes als eine Definition für irgendwas anderes, das der Compiler tatsächlich kompilieren soll. Solche Definitionen sind (unter anderem, aber bei weitem nicht nur) praktisch, um "sprechenden Code" zu erhalten, für Leute, denen eine Zeile wie: if ((dachStatus==OFFEN) && (zuletztNass>zuletztTrocken)) dachBewegen(GESCHLOSSEN); mehr sagt als die Zeile if ((dachStatus==true) && (zuletztNass>zuletztTrocken)) dachBewegen(false); Für den Programmsketch ist es absolut dasselbe. "boolean" und "long" sind Datentypen. Und Datentypen stehen in Zeilen, in denen Variablen deklariert werden. Die Variablennamen sind unter Beachtung der Grundregeln für Bezeichner natürlich frei wählbar.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
BZ (I)
Online
Brattain Member
Karma: 172
Posts: 16139
+39 349 2158303
|
 |
« Reply #7 on: January 14, 2013, 04:05:50 am » |
Lieg ich richtig in der annahme, das mann eigene definierte Namen für define, boolean, long etc. verwenden kann. LG. Rene Schau Dir mal "Data Types" in http://arduino.cc/en/Reference/HomePage an. #define funktioniert wie ersetzen in einem Editor oder Word. Vor dem kompilieren wird das eine Wort mit dem anderen ersetzt. Aber Achtung: es kann dir auch passieren daß etwas von dir nicht beabsichtigt ersetzt wird weil das Suchwort Teil eines Variablen- Funktionsnamen ist. http://arduino.cc/en/Reference/DefineGrüße Uwe
|
|
|
|
« Last Edit: January 14, 2013, 04:10:49 am by uwefed »
|
Logged
|
|
|
|
|
Germany S-H
Offline
God Member
Karma: 35
Posts: 950
|
 |
« Reply #8 on: January 14, 2013, 05:02:30 am » |
Achtung: es kann dir auch passieren daß etwas von dir nicht beabsichtigt ersetzt wird weil das Suchwort Teil eines Variablen- Funktionsnamen ist.
Das kann überhaupt nicht passieren, wenn man sich an eine kleine Konvention bei der Vergabe von Bezeichnernamen in seinem Sketch hält. In C/C++ sind die Bezeichner "case sensitive", d.h. Groß- und Kleinschreibung ist relevant. Seine Variablen- und Funktionsnamen schreibt man im Sketch zweckmäßigerweise in Gemischtschreibung oder vollkommener Kleinschreibung: zuletztNass, zuletztTrocken, dachBewegen() Jedenfalls so, dass Großbuchstaben nur als einzelne Großbuchstaben im Bezeichner vorkommen. Und seine Bezeichner für defines schreibt man einfach KOMPLETT IN GROSSBUCHSTABEN. #define NASS true #define TROCKEN false Und schon kann es im Sketch überhaupt kein Vertun mehr geben Variablen- und Funktionsnamen ==> Kleinbuchstaben oder gemischte Schreibweise mit nur 1 Großbuchstaben in Folge Defines ==> NUR GROSSBUCHSTABEN Auch beim Debuggen kann es äußerst hilfreich sein, im Code seine Define-Bezeichner von Variablennamen unterscheiden zu können, z.B. wenn der Compiler eine scheinbar fehlerfreie Codezeile nicht kompilieren möchte, weil man einen Fehler in eine Define-Definition eingebaut hat (z.B. versehentlich ein Semikolon ans Ende der Define-Zeile gesetzt).
|
|
|
|
« Last Edit: January 14, 2013, 05:12:43 am by jurs »
|
Logged
|
|
|
|
|
Forum Moderator
BZ (I)
Online
Brattain Member
Karma: 172
Posts: 16139
+39 349 2158303
|
 |
« Reply #9 on: January 14, 2013, 06:40:50 am » |
Hattest Du noch nicht gesagt  Grüße Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 3
|
 |
« Reply #10 on: January 14, 2013, 12:23:57 pm » |
Danke für die vielen schnellen Rückmeldungen Vor allem DANKE @jurs , dafür dass du dir die Zeit genommen hast mir das Program zu schreiben  aber wie´s aussieht hat sich ein kleiner Fehler eingeschlichen: void loop() { if (feuchteMessen()== NASS) zuletztNass=now(); meine Arduino-Software kommt mit dem "now" nicht klar, also wie könnte ich das now definieren ? Deine Annahme mit dem Servo war natürlich richtig Also nochmals vielen Dank, jetzt müsste nur noch dieser kleine Fehler korrigiert werden.
|
|
|
|
|
Logged
|
|
|
|
|
Germany S-H
Offline
God Member
Karma: 35
Posts: 950
|
 |
« Reply #11 on: January 14, 2013, 12:40:56 pm » |
Also nochmals vielen Dank, jetzt müsste nur noch dieser kleine Fehler korrigiert werden.
Wenn Du die Time-Library nicht hast und auch nicht installieren möchtest, und wenn Du weißt, dass das Programm niemals länger als 50 Tage am Stück durchlaufen muß ohne dass der Arduino zwischendurch resettet oder ausgeschaltet wird, dann kannst Du (und das hatte ich in meinem Posting auch angedeutet): - Die Zeile #include <Time.h> weglassen oder auskommentieren - die Funktion "millis()" anstelle von "now()" verwenden Und weil die Systemzeit dann in Millisekunden statt Sekunden läuft, muß die Konstante angepaßt werden auf: #define HYSTERESE 1200000L (20 Minuten wären dann 1,2 Mio Millisekunden statt 1200 Sekunden)
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 3
|
 |
« Reply #12 on: January 14, 2013, 12:42:53 pm » |
Achso  also jetzt wird mir einiges klar Danke, das werde ich dann genau so übernehmen 
|
|
|
|
|
Logged
|
|
|
|
|
Munich/Germany
Offline
God Member
Karma: 8
Posts: 592
|
 |
« Reply #13 on: January 14, 2013, 02:47:34 pm » |
Wenn Du die Time-Library nicht hast und auch nicht installieren möchtest, und wenn Du weißt, dass das Programm niemals länger als 50 Tage am Stück durchlaufen muß ohne dass der Arduino zwischendurch resettet oder ausgeschaltet wird, dann kannst Du ... Wieso hält sich eigentlich das Gerücht so hartnäckig, dass bei der Benutzung von millis() der Überlauf ein Problem darstellt? http://arduino.cc/forum/index.php/topic,85706.msg642008.html#msg642008
|
|
|
|
|
Logged
|
_______ Manfred
|
|
|
|
|