Go Down

Topic: Brauche ein Programm (Read 1 time) previous topic - next topic

kendal

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 )  :D  XD :

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  :)

sth77

Quote
I don´t even get the program to the series
Nette Übersetzung... :D

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/Sweep

Dann musst du noch festlegen, welchen Feuchtigkeitssensor du verwenden willst, danach orientiert sich dann die weitere Programmierung.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Klaus_ww

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 8)

uwefed

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

jurs


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:

Code: [Select]

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

Rene_Merten

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

jurs


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.

uwefed

#7
Jan 14, 2013, 10:05 am Last Edit: Jan 14, 2013, 10:10 am by uwefed Reason: 1

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/Define
Grüße Uwe

jurs

#8
Jan 14, 2013, 11:02 am Last Edit: Jan 14, 2013, 11:12 am by jurs Reason: 1

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

uwefed

Hattest Du noch nicht gesagt  :smiley-roll: :smiley-roll:
Grüße Uwe

kendal

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:
Quote
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 :D

Also nochmals vielen Dank, jetzt müsste nur noch dieser kleine Fehler korrigiert werden.

jurs


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)

kendal

Achso  XD also jetzt wird mir einiges klar :D


Danke, das werde ich dann genau so übernehmen ;)

MaFu

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
_______
Manfred

Go Up