Automatisierte Zuchtbox

Hallo zusammen,
In meiner Berufsschule müssen wir ein Projekt realisieren, welches wir selbst wählen durften. Ich und ein Kollege möchten eine Automatisierte Pflanzenzuchtbox bauen, welche über folgende Funktionen verfügt:

  • Automatische Regulierung der Belüftung, abhängig von Temperatur
  • Automatische Beleuchtung
  • Automatische Bewässerung

Da ich weder Erfahrungen mit Arduino, noch Programmierkenntnisse habe, habe ich meinen Code bis jeztt nur mit Proteus 8 simuliert. Allerdings bin ich jetzt an einem Punkt angekommen, an dem mir Beispiele aus dem Internet und Simulationen nicht mehr weiterhelfen. Wen ich die Simulation starte, funktioniert alles bestens, bis der loop teil des Codes zum ersten mal durchlaufen ist. Danach friert die RTC ein und der Code läuft nicht weiter. Nun kann der Fehler, meiner Meinung nach, an drei Orten sein: Der Code ist falsch, die Verdrahtung ist falsch oder Proteus 8 simuliert etwas falsch.
Wen Jemand Zeit hat und mir vielleicht den einen oder anderen Tip geben könnte, wäre ich sehr dankbar :slight_smile:

Das ist mein Code:

#include "Wire.h"                      
#include "LiquidCrystal_I2C.h"         
#include "DHT.h"                       
#include "RTClib.h"                    
#define DHTPIN 2                       
#define DHTTYPE DHT11                  
DHT dht(DHTPIN, DHTTYPE);             
RTC_DS1307 rtc;                        
DateTime now;                          
LiquidCrystal_I2C lcd(0x20, 4, 5, 6, 0, 1, 2, 3, 7, NEGATIVE);  

//---------------------------------------------Temp. / Beleuchtung / Bewässerung

int wTemp = 24;                       //Legt die Wunschtemperatur fest
int lampOn = 10;                      //Einschaltzeit der Lampe (HH)
int lampOff = 21;                     //Ausschaltzeit der Lampe (HH)
int BewOnStd = 21;                    //Einschaltzeit der Pumpe (HH)
int BewOnMin = 00;                    //Einschaltzeit der Pumpe (MM)

//---------------------------------------------Lüfterparameter Abluft

int tempMinA = 10;                    
int tempMaxA = wTemp + 10;            
int fanSpeedA;                        
int fanLCDA;                          
int fanA = 11;                        

//---------------------------------------------Lüfterparameter Zuluft

int tempMinB = 10;                    
int tempMaxB = wTemp + 10;            
int fanSpeedB;                        
int fanLCDB;                          
int fanB = 10;                        



void setup()
{
  Serial.begin(57600);                
  dht.begin();                        
  lcd.begin(20,4);                    
  rtc.begin();                        
  pinMode(fanA, OUTPUT);              //Legt Pin 11 als Ausgang fest (Abluft)
  pinMode(fanB, OUTPUT);              //Legt Pin 10 als Ausgang fest (Zuluft)
  pinMode(7, OUTPUT);                 //Legt Pin 7 als Ausgang fest (Lampe)
  pinMode(6, OUTPUT);                 //Legt Pin 6 als Ausgang fest (Pumpe)

  
  lcd.setCursor(0,0);                 
  lcd.print("Status");                
  lcd.setCursor(0,1);                 
  lcd.print("Feu.");                  
  lcd.setCursor(8,1);                 
  lcd.print("%");                     
  lcd.setCursor(10,1);                
  lcd.print("Temp.");                  
  lcd.setCursor(17,1);                
  lcd.write(0b11011111);              // Grad Zeichen
  lcd.setCursor(0,2);                  
  lcd.print("Zul.");                  
  lcd.setCursor(8,2);                 
  lcd.print("%");                     
  lcd.setCursor(10,2);                
  lcd.print("Bel.");                   
  lcd.setCursor(0,3);                 
  lcd.print("Abl.");                  
  lcd.setCursor(8,3);                  
  lcd.print("%");                     
  lcd.setCursor(10,3);                
  lcd.print("Bew.");                  
  delay(1000);                        
}

void loop()  
{
  
  int h = dht.readHumidity();         
  int t = dht.readTemperature();      
  now = rtc.now();                    
  int st = now.hour();                
  int mi = now.minute();              
  
 //---------------------------------------------Daten anzeigen
 //-----------------------------Zeit
  lcd.setCursor(15,0);                
  if (st<10){                         //Anzeigen der Aktuellen Uhrzeit (Stunden)
  lcd.print(0);                       
  }
  lcd.print(st);
  lcd.setCursor(17,0);                
  lcd.print(":");                     
  lcd.setCursor(18,0);                
  if (mi<10){                         //Anzeigen der Aktuellen Uhrzeit (Minuten)
  lcd.print(0);                       
  }
  lcd.print(mi);
  
//-----------------------------Luftfeuchtigkeit

  lcd.setCursor(6,1);                
  lcd.print(h);                      //Anzeigen der Luftfeuchtigkeit
    
//-----------------------------Temperatur  

  lcd.setCursor(15,1);               
  lcd.print(t);                      //Anzeigen der Temperatur
  
//-----------------------------Abluft

  lcd.setCursor(6,2);                
  lcd.print(fanLCDA);                //Anzeigen der Lüfterauslastung Abluft
  
//-----------------------------Beleuchtung  

  lcd.setCursor(15,2);              
  if (digitalRead(7) == HIGH)       //Status der Lampe.
    lcd.print("Ein");               
  else
    lcd.print("Aus");
    
//-----------------------------Zuluft  

  lcd.setCursor(6,3);              //Cursorposition auf LCD 6,3
  lcd.print(fanLCDB);              //Anzeigen der Lüfterauslastung Zuluft
  
//-----------------------------Pumpe  

  lcd.setCursor(15,3);             //Cursorposition auf LCD 15,3
  if (digitalRead(6) == HIGH)      //Status der Pumpe
     lcd.print("Ein");
  else
     lcd.print("Aus");
  
//---------------------------------------------Steuerung der Beleuchtung
    
   
   if(now.hour() >=lampOn && now.hour() <lampOff)   //Lampe einschalten wen die momentane Stundenzeit gleich oder 
   {                                                //über der Einschaltzeit und unter der Ausschaltzeit ist.
     digitalWrite(7, HIGH);
   }
   else
   {
     digitalWrite(7, LOW);
   }
        
//---------------------------------------------Steuerung der Pumpe
   
  if(now.hour() == BewOnStd && now.minute() == BewOnMin)  //Pumpe einschalten wen die momentane Stunden und Minutenzeit
  {                                                       //gleich der Eincshaltzeit der Pumpe ist. 
    digitalWrite(6, HIGH);
    
  }
  else
  {
    digitalWrite(6, LOW);
  }
//---------------------------------------------Steuerung der Zuluft

  if(t < tempMinA)
  {
    fanSpeedA = 0;
    digitalWrite(fanA, LOW);
  }
  if((t >= wTemp) && (t <= tempMaxA))
  {
    fanSpeedA = map(t, tempMinA, tempMaxA, 32, 255);
    fanLCDA = map(t, tempMinA, tempMaxA, 0, 99);
    analogWrite(fanA, fanSpeedA);
  }
delay(5);  
//---------------------------------------------Steuerung der Abluft
  if(t < tempMinB)
  {
    fanSpeedB = 0;
    digitalWrite(fanB, LOW);
  }
  if((t >= wTemp) && (t <= tempMaxB))
  {
    fanSpeedB = map(t, tempMinB, tempMaxB, 32, 255);
    fanLCDB = map(t, tempMinB, tempMaxB, 0, 99);
    analogWrite(fanB, fanSpeedB);
  }
delay(5);
}

Hier noch ein Screenshot von Proteus 8: Link. Ich bin für jede Hilfe dankbar :slight_smile:

Liebe Grüsse

Adriano

PS: Ich benutze einen Arduino Mega 2560 mit einem I2C 20x4 Display, einen DHT11 Temperatursensor und eine DS1307 RTC, welche ebenfalls per I2C angeschlossen ist.

Ich nehme an es läuft nicht mehr weil der Simulino MEGA schneller durchbrennt als das Arduino MEGA :grinning:
Die Relais kannste so nicht anschließen, da muss ein Brückengleichrichter oder Schottky Dioden hin.

Gleichrichter nicht. Ich nehme an dass soll ein 5V Relais sein, das Wechselstrom schaltet. Aber man braucht genauso wie bei den Lüftern einen Transistor und eine Freilaufdiode. Auf einer fertigen Relais-Platine ist das schon drauf.

Am Code an sich liegt es glaube ich nicht. Da können Logik-Fehler drin sein, aber da ist eigentlich nichts drin das vollständig abstürzen kann soweit ich das richtig sehe.

AcidAssassin:
Der Code ist falsch, die Verdrahtung ist falsch oder Proteus 8 simuliert etwas falsch.

Jede Simulation kann die Wirklichkeit nur annährend wiedergeben.

Und weder an Deinem Code noch an Deinem werbebildverseuchten Schaltbild kann ich genau erkennen, was da eigentlich simuliert wird. Proteus 8 kenne ich nicht.

Wie skorpi08 schon schreibt, wäre die Schaltung Deiner Relias für "allgemeine Relais" falsch, weil Du damit viel zuviel Spulenstrom aus dem Controller ziehst.

Funktionieren könnte es allenfalls, wenn die simulierten Relais "Reed-Relais" sind, die mit einem sehr geringen Spulenstrom arbeiten. Oder wenn es sich um fertig beschaltete Relais-Boards handeln würde, die mit kompletter Beschaltung kommen. Ansonsten müßte die Relaisspule über einen Transistor angesteuert werden. Und die Spulenwicklung braucht auch eine Freilaufdiode.

Die DS1307 wird offenbar völlig unzulänglich simuliert und kann laut Schaltbild gar nicht per I2C ausgelesen werden: Wenn eine DS1307 nur mit VBAT 3.3V versorgt wird, läuft diese im Batterie-Backupbetrieb und das I2C-Interface ist deaktiviert. Erst wenn ein DS1307 Baustein auch mit 5V Betriebsspannung versorgt wird (bzw. einer Spannung, die mindestens um den Faktor 1.25 höher als VBAT ist), wird die I2C-Schnittstelle aktiviert und die Zeit kann per I2C ausgelesen werden.

Außerdem fehlen in Deiner Schaltung sämtliche eigentlich notwendigen PullUp-Widerstände: Zwar aktiviert die Wire-Library und vermutlich auch die DHT11-Library die controllereigenen "internen PullUp" Widerstände des Controllers, aber bist Du Dir sicher, dass auch die internen PullUp-Widerstände korrekt simuliert werden?

Normalerweise brauchen sowohl die I2C-Leitungen SDA und SCL als auch der Daten-Pin des DHT11-Sensors einen 4.7K PullUp-Widerstand in der Schaltung.

Stimmt, hab ich beim erfassen auch dran gedacht, muss ja nur bei meinen Bistabilen Relais.
Er hätte aber trotzdem googlen müssen, wie man es richtig macht, denn ein Tipp hat er ja bekommen dass es so nicht "geht".
http://bildr.org/2012/03/rfp30n06le-arduino/

Wow danke für die Antworten :slight_smile:
Tatsächlich scheint Proteus nicht wirklich geeignet zu sein, um Arduino zu simulieren. Aber ich möchte ja am ende eine reale Schaltung, darum richte ich mich natürlich nach euch^^
Ich habe das Schaltbild aktualisiert und nochmal hier hochgeladen (ich hoffe nicht so werbeverseucht :-[ ).

Ich dachte an folgende Bauelemente:

Relais für Lampe und Pumpe: Link
Als Freilaufdioden diese hier: Link
und Transistoren die: Link

Kann ich die Dioden und Transistoren für die Relais und die Lüfter verwenden?

Vielen dank für eure Unterstützung :slight_smile:

Nimm am besten FETs für die Lüfter. Damit hast du weniger Ärger. Die BD Transistoren machen zwar viel Strom, aber die brauchen auch entsprechend viel Basis-Strom, da die Stromverstärkung nicht allzu hoch ist. Eventuell mehr als der Arduino liefern kann. FETs werden dagegen über die Spannung gesteuert.

IRLZ44

Und für die Relais reicht ein BC337-40

AcidAssassin:
Ich habe das Schaltbild aktualisiert und nochmal hier hochgeladen (ich hoffe nicht so werbeverseucht :-[ ).

Ja, da erscheint das Bild werbefrei.

Du kannst Bilder aber auch immer direkt als Anhang zu einem Posting hier ins Forum hochladen. Dann ist das Bild immer direkt mit Deinem Posting zusammen an einer Stelle gespeichert.

Was mir auffällt:

Deine DS1307-Schaltung kann so immer noch nicht funktionieren. Eine DS1307 benötigt üblicherweise zwei Spannungen, die angeschlossen werden:

  • VBAT als Batterie-Backup (typisch: ca. 3 Volt)
  • VCC als Betriebsspannung bei Benutzung von I2C (typisch: 5 Volt)
    Das sind zwei verschiedene Anschlüsse am DS1307-IC.

Wenn nur die Batteriespannung anliegt, läuft die Uhr im Backup-Batteriebetrieb, also die Zeit läuft intern weiter, aber sie kann von außen nicht abgefragt werden. Wenn nun die 5 Volt Betriebsspannung angelegt wird (diese muß um mindestens den Faktor 1,25 höher sein als die VBAT) springt das I2C-Interface des Uhrenbausteins an und die Uhrzeit kann vom Mikrocontroller abgefragt oder gesetzt werden.

Falls Du schaltungstechnisch überhaupt keine Erfahrung hast, würde ich mir überlegen, die Schaltung nicht aus einzelnen ICs und Einzel-Bauteilen aufzubauen, sondern aus fertigen "Modulen", die bereits für sich mit der grundlegenden Beschaltung kommen. Also statt eines DS1307-IC ein DS1307-Modul, statt eines Relais ein Relais-Modul.

Wenn Du "induktive Lasten" schaltest, entstehen beim Abschalten auch immer EMV-Störungen, die Du durch äußere Beschaltung vermeiden musst. Bei den Relaisspulen hast Du inzwischen Freilaufdioden vorgesehen, das reicht, um beim Schalten der Spulenwicklung EMV-Störungen auf der Spulenseite zu vermeiden.

Allerdings müssen auch EMV-Störungen auf der geschalteten Seite vermieden werden, und wie es aussieht, schaltest Du da Motoren/Pumpen. Mindestens die 230V Wechselstrompumpe ist als induktive Last zu betrachten. Da Wechselstrom fließt, würdest Du einen "Snubber" ("Löschglied") über die Relaiskontakte auf der Pumpenseite benötigen, wenn Du mit mechanischen Relais schaltest.

Tipp: Wenn Du induktive 230V-Lasten wie 230V-Motoren und 230V-Pumpen mit einem Mikrocontroller möglichst störungsfrei mit wenig Schaltungsaufwand schalten möchtest, bietet sich die Verwendung von SSR Relais an. Solid-State-Relais schalten Wechselspannung elektronisch im Nulldurchgang der Spannung und kommen mit eigenem Löschglied im Relaisgehäuse, verursachen dadurch mit geringstem Schaltungsaufwand die geringsten EMV-Störungen und sich daher ohne große Erfahrung bei der Schaltungsentwicklung leicht zu verwenden. Zu beachten wäre nur die Mindest- und Höchstleistung beim Schalten und dass im Eingang ein passender Vorwiderstand für die "Spulenwicklung" verwendet wird. Auch was die Anzahl der möglichen Schaltungen betrifft, sind SSR Halbleiterrelais oft die bessere Wahl, da mechanische Relais in der Schaltungshäufigkeit recht beschränkt sind.

ok ich habe mir nun alle Bauteile besorgt und wollte heute anfangen.
Leider hab ich schon die ersten Schwierigkeiten :cold_sweat:
Wenn ich den LCD testen möchte, funktioniert erst mal gar nichts. Ich schliesse den LCD an SCA/SCL Pin 20 und 21 an und lade den Sketch auf das Board.
Ich bin nach dieser Anleitung vorgegangen: Link
LCD habe ich dieses: Link

Leider passiert nichts auf dem Display egal welche I2C Adresse ich verwende (0x20, 0x27 oder 0x3F (je nach Quelle)).

Mache ich irgendwas falsch? Wnen ich den I2C Scanner verwende findet er auch nichts.
Ich hoffe ihr könnt mir helfen :blush:

Gruss

Foto.JPG

AcidAssassin:
Wnen ich den I2C Scanner verwende findet er auch nichts.

Wenn der I2C Scanner nichts findet, ist das Gerät entweder falsch angeschlossen.
Überprüfe die Verkabelung!

Oder das angeschlossene I2C-Gerät oder das Arduino-Board ist defekt.
Möglicherweise deshalb, weil es vorher schon mal falsch angeschlossen war.

Hast Du den I2C-Scanner mal mit einem anderen I2C-Gerät getestet?
Hast Du die Serial-Baudrate geprüft, dass sie im Serial Monitor auf dieselbe Baudrate eingestellt ist wie im Scanner-Sketch?

Zur Ansteuerung muss natürlich grundsätzlich diejenige I2C-Adresse verwendet werden, auf die das Display konfiguriert ist. Dazu solltest Du die I2C-Adresse aber mit dem I2C-Scanner auslesen können.

Hej danke für die schnelle Antwort :slight_smile:
Also ich habe die RTC mal angeschlossen und den Beispielsketch zum auslesen verwendet. Die Zeit ist zwar noch nicht eingestellt aber es scheint zu funktionieren (siehe Bild).

Auch der Scanner findet die RTC:

Scanning...
I2C device found at address 0x68  !
done

Mit angeschlossenem LCD findet der Scanner jedoch nichts :frowning:

Kann ich daraus schliessen, dass der LCD defekt ist?

RTC.JPG

AcidAssassin:
Mit angeschlossenem LCD findet der Scanner jedoch nichts :frowning:

Kann ich daraus schliessen, dass der LCD defekt ist?

Das LCD an sich scheint dem geposteten Bild nach zu urteilen zu funktionieren.
Hast Du den Kontrastregler mal in die mittlere Position gedreht?

Aber wenn der I2C-Scanner mit einem RTC-I2C-Modul funktioniert und mit dem LCD-I2C-Modul nicht funktioniert, dann steht zu vermuten, dass die hinten aufgelötete I2C-Huckepackplatine auf dem LCD-Modul nicht (bzw. nicht mehr) korrekt funktioniert (falls Du alles richtig angeschlossen hast).

Normalerweise werden solche Geräte einer 100%-Funktionskontrolle unterzogen, bevor sie die Fabrik beim Hersteller verlassen. Das entstehen von Defekten "einfach so" auf dem Transport ist relativ unwahrscheinlich. Module, die "Dead on Arrival" beim Kunden sind, sind daher äußerst unwahrscheinlich. Aber in seltenen Fällen soll das wohl auch vorkommen.

Es soll aber auch vorkommen, dass Leute ihre Module insbesondere während der Heizperiode im Winter selber durch "statische Entladung" verschotten, wenn sie im Zimmer eine extrem niedrige Luftfeuchte haben, eventuell neu verlegten Teppichboden und als Hausschuhe irgendwelche Adiletten mit sich statisch aufladender Sohle, wenn über den Boden geschlurft wird, so dass das Bauteil durch statische Entladung einen Hau wegbekommt, wenn ohne Antistatik-Schutzmaßnahmen gebastelt wird.

Kannst Du denn an den Lötstellen irgendwas erkenn, mit denen die Huckepackplatine an die LCD-Platine gelötet ist? Defekte Lötstellen? Kurzschluss zwischen den Pins? Hat sich da vielleicht eine kleine Perle Lötzinn abgelöst und irgendwo zwischen den Kontakten verklemmt? Oder ein Stückchen Draht?

Bei manchen Hobbybastlern hat man auch schon von dieser Methode gehört, an Bauteilen unbemerkt Kurzschlüsse zu verursachen: Das Bauteil wird aus einer speziellen Antistatik-Bauteiltüte entnommen, die aus einem leitfähigen Kunststoff gefertigt ist, um Schäden durch statische Aufladung während des Transports zu vermeiden. Diese Antistatik-Tüten sind meist an der eingefärbten Folie (grau oder rot) gut zu erkennen. Aber manche Bastler meinen, dieses Plastik "isoliert" und legen Platinen mit der Lötseite darauf, in der Meinung eine "isolierende Unterlage" für ihre Platine beim Basteln zu verwenden, aber tatsächlich liegt die Platine dann mit der Lötseite auf einer Kurzschlussunterlage...

Hallo!

21 und 20 vertauschen und neu scannen ?

mfg Martin