Inkrementalgeber von Megatron


Google-Suche auf MEINE-SCHALTUNG.de :





Dauerkalender


Pflanzen Bewässerung


Mit „Pflanzen Bewässerung“ konstruieren wir eine Schaltung, die vollständig aus fertigen elektronischen Modulen aufgebaut ist. Bei solcher Vorgehensweise ist es lediglich wichtig, die Betriebsspannungen und Stromaufnahmen der einzelnen Teile zu kennen. Ein Taschenrechner und diverse Berechnungen von Widerständen und anderen elektronischen Teilen entfallen. Fertige Module sind mittlerweile in der Welt der Experimente (und nicht nur) weit verbreitet und auch zu äußerst attraktiven Preises erhältlich.
Die Bewässerung von Pflanzen ist nur eine mögliche Anwendung dieser Schaltung. Dosierungsaufgaben müssen auch in vielen anderen Bereichen erledigt werden. An diesem Beispiel schauen wir uns vor allem die Möglichkeiten, die uns ein einfacher Inkrementalgeber bei Einstellungen diversen Werten zur Verfügung stellt, an.
Die Schaltung arbeitet mit einem Spannungsregler, Arduino Nano, Inkrementalgeber, einem Relais, Feuchtigkeitssensor, Wasserpumpe und LCD-Display mit I2C Anbindung. Alle Teile und Module können problemlos im Handel erworben werden, ein Beispielprogramm (Sketch) kann von dieser Seite kopiert werden. Schauen wir uns zunächst die Komponenten an:

Spannungsregler

Der Spannungsregler ist für die Spannungsversorgung der Schaltung verantwortlich. In diesem Beispiel kommt ein auf dem IC LM2596 basierende Spannungsregler zur Anwendung. Am Eingang des Reglers (IN+ / IN-) kann eine Spannung von 7-12 V angelegt werden. Diese Spannung dient gleichzeitig als Spannungsversorgung für Arduino. Der Spannungsregler kann in Wirklichkeit am Eingang eine Spannung bis zu 40 V vertragen. Doch damit würden wir Arduino zerstören. Arduino verwandelt intern die externe Spannung am Pin Vin (7 bis 12V) in seine eigentliche Betriebsspannung von 5 V um. Am Ausgang liefert der Spannungsregler 5 V. Das ist die Betriebsspannung aller anderen Komponenten, die in der Schaltung mitwirken.
Natürlich kann hier jeder andere Spannungsregler eingesetzt werden. Es ist lediglich darauf zu achten, dass er genügend Strom liefert. In diesem Fall sind die Hauptlasten das Relais (30 mA), das Display (40 mA) und die Wasserpumpe (bis 200 mA).


Relais

Das Modul VMA406 mit dem Relais enthält das Mini-Relais SRD-05VDC-SL-C, einen Schalttransistor und eine Freilaufdiode. Mit einem HIGH-Signal (5 V), das direkt von Arduino kommt, wird das Relais eingeschaltet. Mit seinem Wechsler, der eine Last bis zu 10A schalten kann, wird in unserer Schaltung die kleine Wasserpumpe eingeschaltet. Mit einer Leuchtdiode auf dem Modul wird der Schaltzustand des Relais angezeigt.


LCD-Display

Bei dem LCD-Display handelt es sich um ein Display mit 2 Zeilen je 16 Zeichen. Das Display wird hier zur Anzeige der eingestellten Werte verwendet. Es ist mit einer Schnittstelle für die I2C Kommunikation ausgestattet. Das I2C-Modul ist in diesem Fall direkt an das Display angelötet. Man kann beide Teile auch separat verwenden, dann erhöht sich allerdings der Verdrahtungsaufwand. Die Betriebsspannung des Displays beträgt 5 VDC.


I2C - Interface

Das kleine Modul kann direkt an das Display angelötet werden. Bei Einsatz von z.B. Arduino Nano, wo die Anzahl der zur Verfügung stehenden Pins doch begrenzt ist, ist die Verwendung dieses Moduls sehr sinnvoll. Für Kommunikation mit dem Display werden dank ihm nur zwei Arduino-Pins gebraucht. Das Modul trägt die Bezeichnung FC-113.

Schnittstelle


Arduino

Die kleine Mikrokontroller-Platine fällt mit dem Preis nicht aus der Reihe. Arduino Nano (Original oder Nachbauten) ist ähnlich wie die hier vorgestellten Module überall erhältlich. Mit dem unten vorgestellten Programm (Sketch) wird der kleine „Computer“ die Funktionalität der Schaltung sicherstellen. In dem Beispiel wird Arduino mit 9 VDC versorgt. Diese Spannung wird intern auf 5 VDC Betriebsspannung runtergeregelt.


Feuchtigkeitssensor

Der ermittelte Feuchtigkeitswert wird als analoges Signal 0 bis 5V Arduino zugeführt. Das Signal von diesem Sensor pendelt im Bereich von 1,3 bis 2,8 V. Wird ein Sensor eingesetzt, der z.B. einen Wert von 0 bis 10V liefert, muss das Signal alternativ mit einem Spannungsteiler halbiert werden.


Wasserpumpe

Die kleine Wasserpumpe ist für eine Betriebsspannung von 5V ausgelegt. Sie kann trotzdem nicht direkt an Arduino angeschlossen werden. Ihr Stromverbrauch liegt im Bereich von 200 mA. Um die Ausgänge des Arduino zu schützen, wird sie über das oben erwähnte Relais geschaltet.


Inkrementalgeber

Die besonders auffallende Eigenschaft eines Inkrementalgebers ist die Tatsache, dass er endlos in eine Richtung gedreht werden kann. Anders als z.B. bei einem Potenziometer gibt es keine Endlage. Während der Bewegung sendet der Geber elektrische Signale (Impulse). Die Anzahl der Impulse pro Umdrehung (Inkremente) ist eindeutig festgelegt. Durch Zählung der Impulse kann z.B. festgestellt werden, dass der Geber um 360° gedreht wurde. Bei Gebern, die parallele Signale zur Verfügung stellen (Spuren), kann zusätzlich erkannt werden, in welche Richtung sie gedreht wurden. Der hier eingesetzte Geber liefert 20 Impulse pro Umdrehung und stellt zwei Spuren zur Verfügung. Damit kann die Drehrichtung des Gebers festgestellt werden. Zusätzlich verfügt der Geber über einen Taster, der durch Drücken des Gebers geschaltet wird.
Mit dem Geber erledigen wir die gesamte Menü-Navigation und alle Einstellungsaufgaben.


Die Schaltung

Am Anwendungsbeispiel eines Inkrementalgebers konstruieren wir eine Schaltung, die für Pflanzenbewässerung geeignet wäre. Mit dem Drehgeber werden alle verfügbaren Menüpunkte aufgerufen und alle notwendigen Einstellungen durchgeführt.
Folgende Haupt-Variablen werden im Programm bearbeitet:

Feuchtigkeitsschwelle: Bestimmt, ab welchen Feuchtigkeitswert bewässert werden muss.
Mess_Wartezeit: Gibt an, nach welcher Zeit Feuchtigkeit gemessen werden soll. Die Pflanzen sollen nicht kontinuierlich bewässert werden. In der natürlichen Umgebung (Garten) wechseln sich die Wetterbedingungen dauernd ab. Auch Zimmerpflanzen werden meist nur einmal täglich gegossen.
Zeit_Pumpe_ EIN: Die Zeit für eigentliche Bewässerung. Die Pflanze soll bei fallender Feuchtigkeit nicht plötzlich mit Wasser überflutet werden. Die Wasserdosierung soll möglichst „Tröpfchenweise“ erfolgen.
Zeit_Pumpe_AUS: Nach der Dosierung muss abgewartet werden, bis das Wasser im Erdboden versickert und Feuchtigkeitssensor neue Werte liefern kann. Die Dosierung erfolgt durch gleichmäßiges Ein- und Ausschalten der Wasserpumpe.

Um die Funktionalität der Schaltung mit einem Video zu demonstrieren, werden alle Zeiten in Sekunden eingegeben. Sie können bei Bedarf im Programm passend erhöht werden.

Schaltplan

Schaltplan

Schaltplan

Testschaltung

Testschaltung

Testschaltung

Komplette Testeinrichtung

Testeinrichtung

Komplette Testeinrichtung mit Wasser-Vorratsbehälter und "Blumentopf". Der Schalter und zweite Pumpe "Blume trinkt" gehören nicht zu der eigentlichen Schaltung.

Das Programm

// *******************************************************************************
// Pflanzen - Bewässerung
// mit Arduino und Inkrementalgeber
// Arduino Nano, IDE 1.8.13
// *******************************************************************************

#include <LiquidCrystal_I2C.h>     // Display Bibliothek .........................
LiquidCrystal_I2C lcd(0x27,16,2);

                                   // Pins .......................................
  int Menue_Schalter = 5;
  int Pumpe_Ein = 2;
  int CLK = 3;                     // Inkrementalgeber Spur A
  int DT = 4;                      // Inkrementalgeber Spur B
  
                                   // Hauptvariablen, Zeiten in Sekunden .........
  int Feuchtigkeitsschwelle = 50;
  int Mess_Wartezeit = 8;
  int Zeit_Pumpe_EIN = 3;
  int Zeit_Pumpe_AUS = 7;

                                   // Variablen ..................................
  int Menue = 1;
  int Menue_alt = 0;
  String Menue_Text1;
  String Menue_Text2;
  int Anzeigewert;
  char datestring[3];
  int Zeit_Zaehler = 0;
  int Betrieb_Phase = 1;           // 1-Warten, 2-Ein, 3-Aus
  unsigned long MillisAktuell = 0; 
  unsigned long MillisHalten = 0;
  int Geber_Stellung = 0;
  bool Neue_Einstellung = false;
  int Summand = 0;


void setup() {                     // Set Up .....................................

    lcd.init();                    // Display initialisieren 
    lcd.backlight();               // Hintergrundbeleuchtung
    lcd.clear();
    pinMode (Menue_Schalter, INPUT_PULLUP);
    pinMode (DT, INPUT_PULLUP);
    pinMode (CLK, INPUT_PULLUP);
    pinMode (Pumpe_Ein, OUTPUT);
    MillisHalten = millis();
}

void loop() {
                                   // Menue Wechsel ..............................
    if (digitalRead(Menue_Schalter) == LOW) {
      Menue_alt = Menue;
      Menue++;
      if (Menue > 5) { Menue = 1; } 
      delay (200);  }

                                   // Menue Anzeige ..............................
     switch (Menue) {
        case 1: {
            Menue_Text1 = "BETRIEB          ";
            Menue_Text2 = "   ";
            break; }      
        case 2: {
            Menue_Text1 = "Feuchtigkeit     ";
            Menue_Text2 = " % ";
            Feuchtigkeitsschwelle = Feuchtigkeitsschwelle + (Summand * 5);
            Anzeigewert = Feuchtigkeitsschwelle;
            Summand = 0;
            break; }
        case 3: {
            Menue_Text1 = "Mess-Wartezeit   ";
            Menue_Text2 = "Sek";
            Mess_Wartezeit = Mess_Wartezeit + Summand;
            Anzeigewert = Mess_Wartezeit;
            Summand = 0;
            break; }
        case 4: {
            Menue_Text1 = "Zeit Pumpe-EIN   ";
            Menue_Text2 = "Sek";
            Zeit_Pumpe_EIN = Zeit_Pumpe_EIN + Summand;
            Anzeigewert = Zeit_Pumpe_EIN;
            Summand = 0;
            break; }
        case 5: {
            Menue_Text1 = "Zeit Pumpe-AUS   ";
            Menue_Text2 = "Sek";
            Zeit_Pumpe_AUS = Zeit_Pumpe_AUS + Summand;
            Anzeigewert = Zeit_Pumpe_AUS;
            Summand = 0;
            break; }            
     }

                                   // Display Ausgabe ............................
     if (Menue != Menue_alt) {
         lcd.clear();
         lcd.setCursor(0,0);
         lcd.print(Menue_Text1);
         lcd.setCursor(8,1);
         lcd.print(Menue_Text2);
         Menue_alt = Menue;
         }
     if ((Menue != 1) || (Neue_Einstellung == true)) {
         lcd.setCursor(3,1);
         sprintf(datestring,"%3u", Anzeigewert);
         lcd.print(datestring);
         Neue_Einstellung = false;
     }
         
                                   // Zeit Zählung + Anzeige .....................
     MillisAktuell = millis();
     if ( MillisAktuell > (MillisHalten + 1000)) {
         Zeit_Zaehler++;
         MillisHalten = MillisAktuell;
         if (Menue == 1) {
             lcd.setCursor(13,1);
             sprintf(datestring,"%3u", Zeit_Zaehler);
             lcd.print(datestring); } }

                                   // Betrieb ....................................                               
    if (Menue == 1) {
    switch (Betrieb_Phase) {
        case 1: {                  // Wartezeit
            lcd.setCursor(2,1);
            lcd.print("Wartezeit    ");  
            if (Zeit_Zaehler >= Mess_Wartezeit) {
                Betrieb_Phase = 2;
                Zeit_Zaehler = 0; }
            break; }     
        case 2: {                  // Pumpe Einschalten
            lcd.setCursor(2,1);
            lcd.print("Pumpe EIN    ");
            int Schwelle = (100 - Feuchtigkeitsschwelle) * 3 + 270;
            if (analogRead(A7) >= Schwelle) {
                digitalWrite (Pumpe_Ein, HIGH); }    
            if (Zeit_Zaehler >= Zeit_Pumpe_EIN) {
                digitalWrite (Pumpe_Ein, LOW);
                Betrieb_Phase = 3;
                Zeit_Zaehler = 0; }
            if (analogRead(A7) < Schwelle) {
                digitalWrite (Pumpe_Ein, LOW);
                Betrieb_Phase = 1;
                Zeit_Zaehler = 0; }                
            break; }
        case 3: {                  // Pumpe Ausschalten
            lcd.setCursor(2,1);
            lcd.print("Pumpe AUS    "); 
            digitalWrite (Pumpe_Ein, LOW);
            if (Zeit_Zaehler >= Zeit_Pumpe_AUS) {
                Betrieb_Phase = 2;
                Zeit_Zaehler = 0; }
            break; }            
    }}
                                   // Einstellungen mit Inkrementalgeber .........
    if (Menue > 1) {
        if ((Geber_Stellung == 0) && (digitalRead(CLK) != digitalRead(DT)))  {
            Geber_Stellung = 1;  }
        if ((Geber_Stellung == 1) && (digitalRead(CLK) == LOW) && (digitalRead(DT) == LOW))  {
            Geber_Stellung = 2; }
        if ((Geber_Stellung == 2) && (digitalRead(CLK) == HIGH) && (digitalRead(DT) == LOW))  {
            Geber_Stellung = 3;
            Summand = 1; }
        if ((Geber_Stellung == 2) && (digitalRead(CLK) == LOW) && (digitalRead(DT) == HIGH))  {
            Geber_Stellung = 3;
            Summand = -1; }    
        if ((Geber_Stellung == 3) && (digitalRead(CLK) == HIGH) && (digitalRead(DT) == HIGH)) {
            Geber_Stellung = 0;
            Neue_Einstellung = true;
    } }
}
// -----------------------------------------------------------
    

Kurzvideo

Kurzvideo: Pflanzen-Bewässerung


Google-Suche auf MEINE-SCHALTUNG.de :


Home Impressum Datenschutz