Pages: [1]   Go Down
Author Topic: Brauche ein Programm  (Read 1250 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-sad  smiley-confuse

 

Kann mir hier vielleicht einer weiterhelfen ? Wäre echt sehr nett smiley

Danke im voraus  smiley


------------------------------------------------------------------------------------------------------------------------

English ( google translator )  smiley-grin  smiley-lol :

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 smiley


It would be grate if someone could help me  smiley
Logged

Germany
Offline Offline
Edison Member
*
Karma: 47
Posts: 2320
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
I don´t even get the program to the series
Nette Übersetzung... smiley-grin

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

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
God Member
*****
Karma: 12
Posts: 589
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 263
Posts: 21587
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Faraday Member
**
Karma: 146
Posts: 3030
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-sad  smiley-confuse

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:
#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 Offline
Jr. Member
**
Karma: 0
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo jurs,

interessanter Code. Vorweg, ich fange gerade erst  damit an smiley

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 Offline
Faraday Member
**
Karma: 146
Posts: 3030
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Online
Brattain Member
*****
Karma: 263
Posts: 21587
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: January 14, 2013, 04:10:49 am by uwefed » Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 146
Posts: 3030
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Online
Brattain Member
*****
Karma: 263
Posts: 21587
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Danke für die vielen schnellen Rückmeldungen  smiley

Vor allem DANKE @jurs , dafür dass du dir die Zeit genommen hast mir das Program zu schreiben smiley-wink 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 smiley-grin

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

Germany S-H
Offline Offline
Faraday Member
**
Karma: 146
Posts: 3030
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Achso  smiley-lol also jetzt wird mir einiges klar smiley-grin


Danke, das werde ich dann genau so übernehmen smiley-wink
Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: