Terrarium Steuerung für Noob ;-)

Hallo Ardiuno Pros!

Meine Terrarium braucht undbedingt etwas Hilfe von einem Computer!

Angeschlossen werden soll 1xWärmelampe,1xLicht,1xRegenanlage.

Habe meine Arduino uno fertig verkabelt.
Mit meinem Test Sketch was ich mit copy und paste gemacht habe funzt alles Super !
Leider scheitere ich an dem fertigen Sketch da ich ein C++ noob bin.
Währe echt nett wenn mir jemand Helfen könnte!

zum Setup:
Arduino Uno
LCD Display
DHT 22
DS 1307RTC
Relaiskarte mit 4 Relais (1,2,3,4)

Ich hoffe das wird nicht zu Kompliziert!

Nun sollte das Sketch so geschrieben werden:

  1. Relais 1+2 auf eine bestimmte Uhrzeit ein und ausschalten .
  2. Zudem soll Relais 1 bei einer bestimmten Feuchtigkeit einschalten und wieder aus!
  3. Relais 3 soll bei einer bestimmten Temperatur einschalten aber auch nur in einem Bestimmten Zeitrahmen( zwischen 08:00-21:00)!
  4. Relais 4 weiss ich noch keine verwendung!

meine TestSketch :

#include "DHT.h"
#include <LiquidCrystal.h>
#include <DS1307.h>

// Init the DS1307
DS1307 rtc(A4, A5);

#define DHTPIN 8     // what pin we're connected to
#define DHTTYPE DHT22 

const int led =  1;      // the number of the light pin
int ledState = LOW;



DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Relais
const int RELAIS1 = 6; 
const int RELAIS2 = 7;
const int RELAIS3 = 9;
const int RELAIS4 = 10;

void setup() {
 // set up the LCD's number of columns and rows: 
 lcd.begin(16,2);
 lcd.setCursor(3,0);
 lcd.print("Please wait!");
 lcd.setCursor(0,1);
 lcd.print("................");
 delay(5000);
 lcd.clear();
 dht.begin();
 //relaisPin
 pinMode(RELAIS1, OUTPUT);
 pinMode(RELAIS2, OUTPUT);
 pinMode(RELAIS3, OUTPUT);
 pinMode(RELAIS4, OUTPUT);
}

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();
 // Read temperature as Celsius
 float t = dht.readTemperature();
 // Read temperature as Fahrenheit
 float f = dht.readTemperature(true);
   // Compute heat index
 // Must send in temp in Fahrenheit!

 lcd.setCursor(0,0);
 lcd.print("Luft:"); 
 lcd.print(h);
 lcd.print(" %");
 lcd.setCursor(0,1);
 lcd.print("Temp:"); 
 lcd.print(t);
 lcd.print(" C");
 
 // Relais 1
 digitalWrite(RELAIS1, HIGH); // RELAIS anschalten
 digitalWrite(RELAIS2, HIGH); // RELAIS anschalten
 digitalWrite(RELAIS3, HIGH); // RELAIS anschalten
 digitalWrite(RELAIS4, HIGH); // RELAIS anschalten
 delay(5000); // 5s warten
 digitalWrite(RELAIS1, LOW); // RELAIS ausschalten
 digitalWrite(RELAIS2, LOW); // RELAIS ausschalten
 digitalWrite(RELAIS3, LOW); // RELAIS ausschalten
 digitalWrite(RELAIS4, LOW); // RELAIS ausschalten
 delay(5000); // 5 Sekunden warten
 
 // Check if any reads failed and exit early (to try again).
 if (isnan(h) || isnan(t) || isnan(f)) {
   lcd.println("Failed to read from DHT sensor!");
   return; }
 
}

Leider habe ich null Plan wie ich das schreiben muss :-[ kann mir jemand Helfen?

Ich Danke schon im voraus für eure Bemühungen!

Gruss Roy Hawk

Sketche bitte in Code Tags posten [code]...[/code*] ohne *

Und was geht nun nicht? Der Sketch ist im übrigen absolut nicht zu empfehlen. Lerne bitte die Basics. Das sind einfache Anwendungen. Das bekommt man auch als Anfänger hin.

Wie du in jedem zweiten Anfängerthread lesen kannst, führt die Verwendung von delay() nur zu Problemen. Natürlich erscheint diese Pause sehr hilfreich, der Mikrocontroller kann derweil aber keine anderen Dinge übernehmen. Wenn dir also die “Basics” (wie ich das Wort hasse…) empfohlen werden, solltest du dir das Verständnis für folgende Dinge aneignen:

  • Verwendung von millis statt delay - gut gemacht im BlinkWithoutDelay-Beispiel und in vielen Threads hier
  • Strukturierung des Codes in Funktionen und EVA-Prinzip
  • logische Verknüpfungen (AND, OR, XOR)

Ein kleiner Tipp zu den Schaltzeiten: Statt in Stunden und Minuten zu rechnen, rechne nur in Minuten seit Mitternacht. Das vereinfacht die Programmierung.

Danke für die Antworten wo kann ich denn DIE Basics lernen? Habe mein Sketch nur per COPY and PASTE gebastelt da ich leider null C++ kann ! zudem hier : "Strukturierung des Codes in Funktionen und EVA-Prinzip logische Verknüpfungen (AND, OR, XOR)" Hää verstehe ich nur Bahnhof! ;-(

http://playground.arduino.cc/ http://openbook.galileo-press.de/c_von_a_bis_z/

und diverse Bücher eignen sich da eigentlich von noch besser. Zum Beispiel die gebundene Variante von der oben verlinkten openbook Variante (online sind nicht alle Themen zu 100% gelistet) oder Bücher von Erik Bartman

Danke dir werde ich mal lesen ! was mir aber immer wieder auffällt ist das nie die werte stehen und ich kein Plan habe was eingeben zum Bsp. hier :

if (millis() - previousMillis > interval) {
    previousMillis = millis();

Muss ich jetzt da Werte eingeben ? Sorry bin echt voll auf dem Schlauch ! :disappointed_relieved:

Du musst Dir wirklich die Basics anlesen! Zu Deiner Frage: Duz musst noicht eingeben. Die Funktion millis() liefert die Anzahl der Millisekunden seit dem Start Deines Arduinos zurück. Also, 200ms nach dem der Arduino gebootet hat steht da 200 und 5832ms nach dem boot steht da 5832 Interval wird irgendwo weiter oben mit einem Wert versorgt. Wenn der Intervall 2000ms lang sein soll, dann enthält diese Variable den Wert 2000. Durch die if Anweisung wird die Zeile

  previousMillis = millis();

nur ausgeführt, wenn die Bedingung wahr ist, also wenn aktuelleMillisekunden minus vorherigemillisekunden größer als Dein vorgegebens intervall ist. ist dies der Fall, werden die aktuellen ms auf die Variable previousMillis geschrieben.

Grüße,

Sven

Ja werde ich machen ist für ein Laien nicht ganz so einfach zu verstehen ! Es macht mir aber Sau Spass damit rumzuwerkeln !

Ah dann wäre allso :

unsigned long interval = 60000;

für die länge des intervals. Währe dann jetzt eine Minute!

Genau. Und wie Du siehst wird der Wert bei einigen Sekunden schon ganz schön groß, deshalb ist die Variable als unsigned long definiert. Die kann Werte von 0 bis 4,294,967,295 aufnehmen.

wie wäre dann einfach eine Pause ohne wenn und aber?

Ich verstehe die Frage nicht.

ich hab ja hier in meinem Sketch:

 lcd.print("................");
 delay(5000);
 lcd.clear();
 dht.begin();

eine Pause von 5 sekunden !

Wie mach ich dass da ? Ist ja nicht im Loop kann man das auch lassen mit delay?

Das setup wird ja nur am Anfang einmal ausgeführt. Das heißt er schreibt "bitte warten" und wartet dann fünf Sekunden wo er sonst nichts tut. Hmmm, ob das so sein muss? Braucht man einen Begrüßungstext, der nichts anderes tut als den Start zu verzögern? Bin mir da nicht so sicher. Das sit doch nur den Benutzer verarscht. Oder übersehe ich was. habe mir den Sketch jetzt nicht in aller Ausführlichkeit angeschauen, weil er mih nicht wirklich interessiert. Generell gilt zu sagen, dass man eigentloch generell versucht ein delay() zu vermeiden! Wenn man aber das setup verzögern will, evtl damit sich irgendwas einschwingen kann oder so, dann kann man auch delay verwenden.

Hast du hier schon geschrieben ;) Es wird die Zeit von interval gewartet, ehe die Stelle erneut ausgeführt wird. Eine loop kann und sollte wenn möglich so schnell wie möglich durchlaufen werden um alles mitzubekommen (Tastendruck etc). Wenn in der loop nichts gemacht wird, weil die millis noch nicht abgelaufen sind, ist das keinesfalls schlimm ;)

[/code]

RoyHawk: Danke dir werde ich mal lesen ! was mir aber immer wieder auffällt ist das nie die werte stehen und ich kein Plan habe was eingeben zum Bsp. hier :

if (millis() - previousMillis > interval) {
    previousMillis = millis();

Muss ich jetzt da Werte eingeben ? Sorry bin echt voll auf dem Schlauch ! :disappointed_relieved:

Hmmm ja ist nur damits schöne aussieht hast recht Sven, bringt null nutzen! Habe es selber zu Lernzwecken reingemacht, um die Codesache zu verstehen.

Danke an euch das Ihr mir so tolle helfen tut echt Danke ! ;-)

Bin mir echt nicht sicher ob ich das hinbekomme, sieht für mich als Handwerker nur nach Hyroglyphen aus ! Obwohl ich eigentlich nicht so ein Noob bin habe auch ein gutes Wissen über Html und Java was sich aber doch recht Unterscheidet. Leider fehlt mir ein riesen Schritt zwischen dem was ich im Kopf habe und der umsetzung. Respektive am coden.

Zum Thema Handwerker: Bin ich auch. Habe zwar die Gesellenprüfung vor der IHK und nicht der HK abgelegt, aber in meinem Beruf hatten wir eh zusammen dieselbe Prüfung. Bin zwar nicht der Spitzenprogrammierer, aber man bekommt es meistens schon hin was man will. Der Weg dahin ist nicht allzu steinig, wenn man nicht zu schnell los will. Mal als Beispiel, wenn Du jonglieren lernen willst, fängst Du ja auch nicht mit acht laufenden Kettensägen an, sondern versuchst erst mal drei Bälle in der Luft zu halten. Schnapp Dir ein paar LEDs, Wiederstände, Drucktaster, etc und fange mit kleinen Aufgaben an. Zur Not kannst auch nur mit der LED an PIN 13 anfangen. Lasse sie blinken, das erste mal vieleicht noch mit delay, dann mit blinkwithoutdelay. Dann lasse sie morphen, also langsam an und aus gehen mit heller und dunkler werden usw. Stück für Stück kommt man so vorwärts, und nach wenigen Tagen/Wochen ist dann auch die Terariensteuerung mit LCD Display gar kein Problem mehr.

Grüße,

Sven