INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Gewächshaussteuerung
01.11.2015, 18:29
Beitrag #1
Gewächshaussteuerung
Hallo liebe community

also vorab erstmal, ich bin ziemlicher Arduino anfänger, vor allem was das programmieren angeht.

zu meinem Vorhaben:

ich möchte ein Vorzuchtgewächshaus für verschiedenes Gemüse etc. mit einer 3-geteilten Sensorsteuerung ausstatten.
zum einen soll ein Feuchtigkeitssensor verbaut werden der bei unterschreiten eines wertes ein relais schaltet, was eine Aquariumpumpe o. ä. an- und ausschaltet.
Ein Temperatursensor soll die temperatur messen und möglicherweise einen Ventilator an- und ausschalten und ein Ultraschallsensor soll mit einem Schrittmotor gekoppelt werden um den Abstand der Pflanzen von der Lichtquelle zu steuern, um Verbrennungen der jungen Blätter zu verhindern.
Das Ganze soll dann noch auf einem kleinen LCD Display visualisiert werden.

ich habe:
-arduino mega 2560
-TMP36 analoger temperatursensor
-Feuchtigkeitssensor
- schrittmotor
- relaiskarte
- ultraschallsensor
- 16x2 lcd display
- breadboard + externe stromversorgung 2x

ich habe auch schon alle schritte einzeln programmiert, was auch funktioniert.
also der feuchtigkeitssensor schaltet die pumpe, der tmp misst die temp und zeigt sie an und das mit dem abstand klappt auch.
ABER wenn ich alles zusammen in einen loop stecke klappt nix mehr so recht.
der tmp zeigt komische werte an sobald sich einer der anderen sensorwerte verändert, und natürlich das ewige problem mit der delay funktion.
ich habe mir das beispiel blink without delay angeschaut, weiß aber nicht wirklich wie ich es anwenden soll.
kann man irgendwie parallel laufende loops schreiben die sich nicht beeinflussen oder sowas? ich glaube so schwer ist das alles gar nichtr aber ich komme mit meinen laienkenntnissen einfach nicht weiter.
falls noch angaben fehlen lasst es mich wissen.
ich bin für jede Hilfe dankbar.
ich hoffe ich bekomme bald eine Antwort.


MfG

ElAlemano
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.11.2015, 19:05
Beitrag #2
RE: Gewächshaussteuerung
(01.11.2015 18:45)Lötzinnerhitzer schrieb:  ertse Antwort:

- Grundlagen und Basics der Programmierung selbst lernen
- Google nutzen
- nicht auf fertigen Code warten

danke erstmal für deine antwort, auch wenn sie nicht wirkjlich hilfreich istBig Grin
ich will ja gar keinen fertigen code sondern eher ´n denkanstoss.
das problem ist, das ich bei google entwedeer einfache anwendungen mit einem sensor finde, wie in jedem anfängerbuch oder so komplizierte foreneinträge, so dass ich gar nix versteheBig Grin
also mein hauptproblem ist, dass ich bei den verschiedenen sensoren unterschiedliche delayzeiten habe aber dadurch das alles in einem loop ist eine delayzeit für alles gilt glaube ich^^ also die werte sollen zwar in kurzen intervallen ausgelesen werden aber es würde reichen wenn sie sich auf dem display nur alle 2 oder 3 sekunden aktualisieren. und das mit den schwankungen beim tmp verstehe ich einfach nicht. als ob sich die spannung am analogpin ändert wenn bspw. der schrittmotor anspringt. ausreichend stromversorgung müsste vorhanden sein.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.11.2015, 19:43 (Dieser Beitrag wurde zuletzt bearbeitet: 01.11.2015 19:46 von hotsystems.)
Beitrag #3
RE: Gewächshaussteuerung
Wie sollen wir dir helfen, wenn wir deinen Code nicht kennen.
Die einzelnen "Programme" solltest du jeweils in eigene Funktionen unterbringen.
Was die delays betrifft, müssen wir sehen wo die stehen und was die verursachen.
Eine bessere Beschreibung zur Änderung der delays findest du in diesem Forum.

http://www.arduinoforum.de/arduino-Threa...kl%C3%A4rt

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.11.2015, 20:55
Beitrag #4
RE: Gewächshaussteuerung
(01.11.2015 19:43)hotsystems schrieb:  Wie sollen wir dir helfen, wenn wir deinen Code nicht kennen.
Die einzelnen "Programme" solltest du jeweils in eigene Funktionen unterbringen.
Was die delays betrifft, müssen wir sehen wo die stehen und was die verursachen.
Eine bessere Beschreibung zur Änderung der delays findest du in diesem Forum.

http://www.arduinoforum.de/arduino-Threa...kl%C3%A4rt

ja also so sieht das ganze bis jetzt aus für den ultraschallsensor und den feuchtigkeitssensor. jetzt werden halt dauerhaft die daten auf dem display angezeigt und da der sensor so feinfühlig ist, verändern sich die werte so schnell das man sie kaum lesen kann.

#include <Stepper.h>
int SPMU =32;
Stepper myStepper(SPMU, 2,3,4,5);

#include <LiquidCrystal.h>
LiquidCrystal lcd(39,37,49,47,45,43);

float messwert=0;
float feuchtigkeit;

int trigger=8;
int echo=9;
long dauer=0;
long entfernung=0;

void setup()
{
lcd.begin(16,2);
Serial.begin(9600);

myStepper.setSpeed(500);

pinMode(21, OUTPUT);

pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
}

void loop()
{
messwert=analogRead(A0);
feuchtigkeit=messwert/6.75;
lcd.setCursor(6, 0);
lcd.print("FTE");
lcd.setCursor(6, 1);
lcd.print(feuchtigkeit);
Serial.println(messwert);
delay(100);
if(feuchtigkeit<=40)
{
digitalWrite(21, HIGH);
}
else
{
digitalWrite(21, LOW);
}


digitalWrite(trigger, LOW);
delay(5);
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
dauer=pulseIn(echo, HIGH);
entfernung=(dauer/2)/29.1;
lcd.setCursor(12, 0);
lcd.print("ABS");
lcd.setCursor(12, 1);
lcd.print(entfernung);
if(entfernung<=15)
{
myStepper.step(20);
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.11.2015, 23:12 (Dieser Beitrag wurde zuletzt bearbeitet: 01.11.2015 23:14 von hotsystems.)
Beitrag #5
RE: Gewächshaussteuerung
Hallo ElAleMaNo,
das mit den Funktionen hatte ich dir schon geschrieben und Lötzinnerhitzer hat es noch mal bestätigt.
Wenn du den Code für "ultraschallsensor und feuchtigkeitssensor" in Funktionen packst machst du dir das leichter. Das gilt natürlich für alle Routinen.

Und du solltest in kleinen Stepps arbeiten, das wird für dich übersichtlicher. Aktuell sehe ich noch keine Probleme mit den delays, kann aber noch kommen, da du wohl noch nicht alles an Code gepostet hast.

Fang einfach mal so an (siehe auch Vorschlag von Lötzinnerhitzer):

Code:
void loop() {
Ultraschall()
\\ Andere_Funktionen()
LCDAnzeige()

}

\\ Hier folgen deine Funktionen
Void Ultraschall() {
   digitalWrite(trigger, LOW);
   delay(5);
   digitalWrite(trigger, HIGH);
   delay(10);
   digitalWrite(trigger, LOW);
   dauer=pulseIn(echo, HIGH);
   entfernung=(dauer/2)/29.1;

}

Void Andere_Funktionen() {

}

Void LCDAnzeige() {
   lcd.setCursor(12, 0);
   lcd.print("ABS");
   lcd.setCursor(12, 1);
   lcd.print(entfernung);
// hier folgen weitere Anzeigen anderer Sensoren
}

Die Anzeige solltest du als letztes aufrufen.
Die Variablen müssen Global deklariert werden.
Damit sich die Sensorwerte nicht ständig ändern, musst du diese auch nicht bei jedem Loopdurchlauf anzeigen, sondern kannst die durch einen Zähler oder besser Timer erst nach einer bestimmten Zeit aktualisieren.
Sobald du alle Sensoren sauber auslesen und anzeigen kannst, wird der Stepper eingebunden.

Aber bitte beachte, der Code wurde von mir nicht getestet.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.11.2015, 10:58 (Dieser Beitrag wurde zuletzt bearbeitet: 02.11.2015 11:45 von ElAleMaNo.)
Beitrag #6
RE: Gewächshaussteuerung
Guten Morgen,
ja genau so wollte ich das machen mit den untermethoden.
ich wusste nur nicht wie ich die aus dem loop an die eigene Methode weitergebe.
denn ich jetzt bspw. in

void feuchtigkeit()
.
.
.
delay(1000);

einbinde gilt das nur für den void feuchtigkeit und nicht für den gesamt-loop oder?

ps. ja du hattest recht ich habe den tmp und die delayzeiten vorerst wieder aus dem Code rausgenommen, weil es bis dahin annähernd funktionierte und ich mich jetzt wieder voranarbeiten wollte.

Nachtrag:

jetzt habe ich alles in einzelne funtionen gepackt, wie ihr es mir geraten habt.
im setup habe ich alle Variablen definiert, allerdings bekomme ich jetzt den error z. B.
" 'temp' was not declared in this scope". ich habe temp im void setup() definiert aber es wird nicht an meine unterfunktion void temperatur() weitergegeben.


hier mal mein bisher veränderter code:
Code:
#include <Stepper.h>
int SPMU =32;
Stepper myStepper(SPMU, 2,3,4,5);

#include <LiquidCrystal.h>
LiquidCrystal lcd(39,37,49,47,45,43);

float messwert=0;
float feuchtigkeit1;

int trigger=8;
int echo=9;
long dauer=0;
long entfernung=0;

float TMP36=A1;
float temperatur1=0;
float temp[10];
int time=20;



void setup()
{
lcd.begin(16,2);
Serial.begin(9600);

myStepper.setSpeed(500);

pinMode(21, OUTPUT);

pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
}

void loop()
{
  ultraschall();
  temperatur();
  feuchtigkeit();
  LCDAnzeige();
}

void ultraschall()
{
  digitalWrite(trigger, LOW);
  delay(5);
  digitalWrite(trigger, HIGH);
  delay(10);
  digitalWrite(trigger, LOW);
  dauer=pulseIn(echo, HIGH);
  entfernung=(dauer/2)/29.1;
}

void feuchtigkeit()
{
  messwert=analogRead(A0);
  feuchtigkeit1=messwert/6.75;
}


void temperatur()
{
  temp[0] = map(analogRead(TMP36), 0, 410, -50, 150);
  delay(time);
  temp[1] = map(analogRead(TMP36), 0, 410, -50, 150);
  delay(time);
  temp[2] = map(analogRead(TMP36), 0, 410, -50, 150);
  delay(time);
  temp[3] = map(analogRead(TMP36), 0, 410, -50, 150);
  delay(time);
  temp[4] = map(analogRead(TMP36), 0, 410, -50, 150);
  delay(time);
  temp[5] = map(analogRead(TMP36), 0, 410, -50, 150);
  delay(time);
  temp[6] = map(analogRead(TMP36), 0, 410, -50, 150);
  delay(time);
  temp[7] = map(analogRead(TMP36), 0, 410, -50, 150);
  delay(time);
  temp[8] = map(analogRead(TMP36), 0, 410, -50, 150);
  delay(time);
  temp[9] = map(analogRead(TMP36), 0, 410, -50, 150);

  temperatur1=(temp[0]+temp[1]+temp[2]+temp[3]+temp[4]+temp[5]+temp[6]+temp[7]+temp[8]+temp[9])/10;
}


void LCDAnzeige()
{
  lcd.setCursor(0,0);
  lcd.print("ABS");
  lcd.setCursor(6,0);
  lcd.print("TMP");
  lcd.setCursor(12,0);
  lcd.print("FTK");
  lcd.setCursor(0,1);
  lcd.print(entfernung);
  lcd.setCursor(6,1);
  lcd.print(temperatur1);
  lcd.setCursor(12,1);
  lcd.print(feuchtigkeit1);
}
die anzusprechenden relais bzw Motoren habe ich jetzt erstmal ausser Acht gelassen.

Danke schonmal für die bisherige HilfeSmile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.11.2015, 11:24
Beitrag #7
RE: Gewächshaussteuerung
Warum willst du die delays einsetzen? Diese summieren sich auf.
Das muss unbedingt durch millis ersetzt werden.
Also mach es unbedingt in kleinen Stepps.
Eine Funktion nach der anderen.
Wenn du die einzelnen Funktionen nach einen gewissen Zeit (10 sek.) aufrufen möchtest, dann nimm den "SimpleTimer.h".
Das funktioniert damit prima.
http://playground.arduino.cc/Code/SimpleTimer
Damit kannst du ganz simpel die Startzeit festlegen, wann der jeweilige Sensor ausgelesen werden soll.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.11.2015, 11:24
Beitrag #8
RE: Gewächshaussteuerung
Entschuldigt die an Spam grenzende Anzahl von posts.
das problem hat sich erledigt, ich hatte nur die variablen unterschiedlich benannt. soweit funktioniert jetzt ersmal alles.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste