Giesomat 16 Sensoren 16 Relais Anfänger

Hallo zusammen,
ich habe mich nun schon durch alle möglichen Foren gelesen aber bin nun komplett verwirrt.
Was möchte ich?
Ich habe 16 Giesomat Sensoren von Ramser.
Dazu ein Arduino Mega 2560
Damit möchte ich ein 16 Channel Relaisboard ansteuern das wiederum 16 Ventile schalten soll.
Da ich ein Anfänger bin möchte ich ohne Multiplexer arbeiten sondern nur mit den einzelnen Pins.
Hat jemand eine Idee wo so etwas oder etwas vergleichbares schon einmal gemacht wurde?

Gruß Dirk

Wo ist dein Problem ?
Der Mega hat doch genügend Pins für deine 16 Sensoren und 16 Relais ?
Also jeweils einen Pin verwenden und gut ists.

Poste mal einen Link zu dem Sensor, den Du da hast. Es gibt auch Sensoren,, die eine Frequenz proportional zur Feuchtigkei ausgeben. Da ist das mit der Auswertung nicht ganz so einfach.

Möglicherweise anregende Themen: Wieder Bewässerung und Information aus “struct” und Anfänger mit Bewässerunsproblem

Nicht nur gelesen!

(crossposting)

https://www.ramser-elektro.at/shop/bausaetze-und-platinen/giesomat-kapazitiver-bodenfeuchtesensor-erdfeuchtesensor-mit-beschichtung/

Danke für die Infos. Werde mich mal durchackern und schauen was ich verwenden kann.

In dem Link ist das ja nur eine Leerplatine zum Selberbauen, Hast Du das schon gemacht, und auch sichergestellt, dass sie funktionieren?

Da das ein Sensor ist, der eine Frequenz ausgibt die gemessen werden muss, wird das mit einfachen Pins wohl nicht funktionieren. Ich vermute bei 16 Sensoren wirst Du um den Multiplexer nicht herumkommen. In den Codebeispielen wird auch immer ein Timer zum Pulsezählen verwendet.

ja ich habe schon einen Sensor hier liegen ....und an der originalen
https://www.ramser-elektro.at/der-gies-o-shield-fuer-den-arduino/
getestet ...natürlich vorher bestückt... :grinning: geht.
Da ich so viele Sensoren brauche dachte ich das es sinnvoller wäre alles an ein Arduino zu hängen und mittels Relais zu schalten. Da ist es vielleicht geschickter den originalen Sketch umzubauen. Dafür müßte meiner Meinung nach ein MCP 23017 gehen. Aber wie baut man den ein und den Sketch um?

#include <EEPROM.h>
/*F.R. 18.06.28
  R.3
  Sketch to reading out 4 Giesomatesensoren,
  connected to the GiesOmat Shield.
  The sensors are read in using a multiplexer,
  because the Giesomat Sensors giving out very high frequency,
  and the Arduino has only two timer count registers.
  The input of the multplexer is connected to timer counter register 1 (DI 5).

  CONSOLEMODE:
  In the Serial Consolemode (GeneralRunmode = 1 ) a menue appears in the console.
  Everytime a key is pressed, the menue is displayed

  Changelog R0 to R1:
  Make all a little bit simpler and fix many bugs

  Changelog R1 to R2:
  CLI Interface for Terminalmode is integrated.

  Changelog R2 to R3:
  Seriel Console is integrated.
*/

const int MultiplexPinA = 8;
const int MultiplexPinB = 9;
const int OutputPin1 = 13;
const int OutputPin2 = 12;

byte GeneralRunmode; // 0 = CLI Terminalmode, 1 = Serial Monitormode
byte Reserved;  //Reserved. Maybe for transmit time, .....
String TerminalModeCommand;
String TerminalModeValue;
byte ConsoleMenue;

byte CurrSensor; //Counter for the loop
unsigned int FreqSensor[4]; //Actual read in frequencies of sensors

unsigned int RunmodeOutput1;
unsigned int UsedSensorForOutput1;
unsigned int SetpointOutput1On;
unsigned int SetpointOutput1Off;
unsigned int MinOnTimeOutput1;
unsigned int MinOffTimeOutput1;
unsigned int MinOnTimeOutput1Actual;
unsigned int MinOffTimeOutput1Actual;

unsigned int RunmodeOutput2;
unsigned int UsedSensorForOutput2;
unsigned int SetpointOutput2On;
unsigned int SetpointOutput2Off;
unsigned int MinOnTimeOutput2;
unsigned int MinOffTimeOutput2;
unsigned int MinOnTimeOutput2Actual;
unsigned int MinOffTimeOutput2Actual;

unsigned long MillisNow;
unsigned long MillisLast;

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(100);
  pinMode(MultiplexPinA, OUTPUT);
  pinMode(MultiplexPinB, OUTPUT);
  pinMode(OutputPin1, OUTPUT);
  pinMode(OutputPin2, OUTPUT);
  TCCR1A = 0; //Reset timer 1
  ReadSettings();
}

void loop() {
  MillisNow = millis();
  if (MillisNow - MillisLast >= 1000) { //One second elapsed. Read the sensors,.......
    for (CurrSensor = 1; CurrSensor < 5; CurrSensor++) {
      SelectSensor(CurrSensor);
      CountFrequency();
      AssignToSensor(CurrSensor);
      if (GeneralRunmode == 0) { //Send to PC in CLI Terminalmode
        SendSensorFreqOverUart(CurrSensor);
      }
    }
    CheckLockTimes();
    CheckOutputs();
    if (GeneralRunmode == 0) { //Send to PC in CLI Terminalmode
      SendOutputStatesOverUart();
    }
    MillisLast = MillisNow;
  }
  if (Serial.available() > 0) { //Read in command and value from PC
    TerminalModeCommand = Serial.readStringUntil(';');
    Serial.read();
    TerminalModeValue = Serial.readStringUntil(';');
    Serial.read();
    if (GeneralRunmode == 0) {
      ParseTerminalMode();
    }    
     if (GeneralRunmode == 1){
      ParseConsoleMode();
    }

  }
}
void SelectSensor(byte SensorToSelect) {
  SensorToSelect--;
  digitalWrite(MultiplexPinA, (bitRead(SensorToSelect, 0)));
  digitalWrite(MultiplexPinB, (bitRead(SensorToSelect, 1)));
}

void CountFrequency() {
  TCNT1 = 0; //Reset Counter
  delay(10);            //Delay for stable channel selection
  bitSet(TCCR1B, CS12); //Select counter clock
  bitSet(TCCR1B, CS11); //Count on rising edge
  delay(50);            //Count for 50mS
  TCCR1B = 0;           //Stop counting
}

void AssignToSensor(int SelectedSensor) {
  FreqSensor[SelectedSensor - 1] = TCNT1 / 5; //Counts per 10mS
}

Kompletter Sketch:
https://www.ramser-elektro.at/wp-content/uploads/2018/06/GiesOshield-R3.rar

Das glaube ich nicht. Der MCP23017 wird dir nicht helfen. Die Frequenz wird in dem Sketch mitels eines HW-Timers bestimmt. Da musst Du mit deinem Sensorsignal schon direkt an den entsprechendn Pin ran. Du wirst um einen Multiplexer, der die die Ausgänge der Sensoren an den Zählpin schaltet nicht herumkommen.

und was kann man da nehmen? Mit genügend Ausgängen?

Ausgänge brauchst Du nur einen :wink:
Der 74HC4067 wäre eine Möglichkeit. Gibts auch als BreakoutBoard, z.B. bei ebay.

super...habe ich sogar hier.Na mal sehen ob ich das hinbekomme mit dem anschließen.

so hab mich mal etwas eingelesen.
ist das so richtig wie das hier angeschlossen ist?

Ich hab' zwar selbst noch nichts damit gemacht, aber müsste so passen.

ok soweit so gut..
aber der Code...
kannst Du mir dabei helfen erst einmal einen Sensor und ein Relais anzusteuern ?
Wie gesagt ich bin Anfänger...

/*Werte vom Bodenfeuchtigkeitssensor:
  0~300    Zu trockene Erde, giessen.
  300~700  Erde in Ordnung, nicht giessen.
  700~950  Erde nass.*/

//Inkludiere DHT-Sensor-Library:
//#include 

//Temparatur & Feuchtigkeitssensor Pin sowie Sensortyp definieren
#define DHTPIN A4
#define DHTTYPE DHT22
//Pin für normalen Arduino (Mega) definieren
//DHT dht (DHTPIN, DHTTYPE);

const int MultiplexPinA = 8;
const int MultiplexPinB = 9;
const int MultiplexPinC = 10;
const int MultiplexPinD = 11;

//Magnetventile definieren (Digital-Pin 24-39)//
#define MV_1Pin 24
#define MV_2Pin 25
#define MV_3Pin 26
#define MV_4Pin 27
#define MV_5Pin 28
#define MV_6Pin 29
#define MV_7Pin 30
#define MV_8Pin 31
#define MV_9Pin 32
#define MV_10Pin 33
#define MV_11Pin 34
#define MV_12Pin 35
#define MV_13Pin 36
#define MV_14Pin 37
#define MV_15Pin 38
#define MV_16Pin 39

//Pumpe-Relais definieren (Digital-Pin 40)//
#define Pumpe 40

unsigned long MillisNow;
unsigned long MillisLast;

byte CurrSensor; //Counter for the loop
unsigned int FreqSensor[4]; //Actual read in frequencies of sensors

const byte Pins[] = { Pumpe, MV_1Pin, MV_2Pin, MV_3Pin, MV_4Pin, MV_5Pin, MV_6Pin, MV_7Pin, MV_8Pin, MV_9Pin, MV_10Pin, MV_11Pin, MV_12Pin, MV_13Pin, MV_14Pin, MV_15Pin, MV_16Pin};
byte MV_active = 16; //welches MV ist gerade an?

const unsigned int GIESSINTERVALL = 5000; //jedes MV bleibt fuer 30 Sekunden an, bevor es aus- und das naechste einschaltet
unsigned int intervall = 0;
unsigned long previousMillis = 0;

//Taster definieren (Digital-Pin 22-27)//
#define Taster_3 41
#define Taster_4 42
#define Taster_5 43
#define Taster_6 44

//Feuchtesensoren definieren//
int FeuchteSensor1 = 1;
int FeuchteSensor1_val;
int FeuchteSensor2 = 1;
int FeuchteSensor2_val;
int FeuchteSensor3 = 1;
int FeuchteSensor3_val;
int FeuchteSensor4 = 1;
int FeuchteSensor4_val;
int FeuchteSensor5 = 1;
int FeuchteSensor5_val;
int FeuchteSensor6 = 1;
int FeuchteSensor6_val;
int FeuchteSensor7 = 1;
int FeuchteSensor7_val;
int FeuchteSensor8 = 1;
int FeuchteSensor8_val;
int FeuchteSensor9 = 1;
int FeuchteSensor9_val;
int FeuchteSensor10 = 1;
int FeuchteSensor10_val;
int FeuchteSensor11 = 1;
int FeuchteSensor11_val;
int FeuchteSensor12 = 1;
int FeuchteSensor12_val;
int FeuchteSensor13 = 1;
int FeuchteSensor13_val;
int FeuchteSensor14 = 1;
int FeuchteSensor14_val;
int FeuchteSensor15 = 1;
int FeuchteSensor15_val;
int FeuchteSensor16 = 1;
int FeuchteSensor16_val;
int FeuchteSensor17 = 1;
int FeuchteSensor17_val;


void setup() {
  for (const byte p : Pins) {
    pinMode (p, INPUT_PULLUP);
    pinMode (p, OUTPUT);  //Anfangszustand
  }
  pinMode(MultiplexPinA, OUTPUT);
  pinMode(MultiplexPinB, OUTPUT);
  pinMode(MultiplexPinC, OUTPUT);
  pinMode(MultiplexPinD, OUTPUT);
  
  pinMode (Taster_3, INPUT_PULLUP);//Taster_3-Pin//
  pinMode (Taster_4, INPUT_PULLUP);//Taster_4-Pin//
  pinMode (Taster_5, INPUT_PULLUP);//Taster_5-Pin//
  pinMode (Taster_6, INPUT_PULLUP);//Taster_6-Pin//

  Serial.begin (9600);//Serial-Begin
  //dht.begin();

  TCCR1A = 0; //Reset timer 1
}

void loop() {
    //Erdmessung starten

  MillisNow = millis();
  if (MillisNow - MillisLast >= 1000) { //One second elapsed. Read the sensors,.......
    for (CurrSensor = 1; CurrSensor < 15; CurrSensor++) {
      SelectSensor(CurrSensor);
      CountFrequency();
      AssignToSensor(CurrSensor);
      if (GeneralRunmode == 0) { //Send to PC in CLI Terminalmode
        SendSensorFreqOverUart(CurrSensor);
      }
    }
    CheckLockTimes();
    CheckOutputs();
   
    MillisLast = MillisNow;

  FeuchteSensor1_val = analogRead(FeuchteSensor1); //Feuchtesensor-Wert 1 auslesen
  Serial.print("Lese Feuchtesensor 1 - Daten aus: ");
  Serial.println(FeuchteSensor1_val);
  //PUMPE anhand von Messergebnissen an / oder ausschalten//

  //Wenn Sensor1 Wert unter 350 - Starte Bewässerung!

  if (FeuchteSensor1_val < 400) {
    Serial.println("Erde zu trocken, Giessvorgang!");

    digitalWrite (Pumpe, LOW); //PUMPE Starten

    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= intervall) {
      intervall = GIESSINTERVALL;
      previousMillis = currentMillis;
      //MV1 bis MV6 so lange umschalten, bis der Sensor "zu nass" misst
      switch (MV_active) {
        case 1 ... 15:
          digitalWrite (Pins[MV_active], HIGH); //MV_x aus
          MV_active++;
          digitalWrite (Pins[MV_active], LOW); //MV_x an
          break;
        case 16:
          digitalWrite (Pins[MV_active], HIGH); //MV_6 aus
          MV_active = 1;
          digitalWrite (Pins[MV_active], LOW); //MV_1 an
          break;
      }
      Serial.print("Magnetventil ");
      Serial.println(MV_active);
    }
  delay(100); // dient nur der lesbaren Anzeige, kann raus!
  }

  //Wenn Sensor1 Wert gleich oder über 350 - Keine Bewässerung!
  if (FeuchteSensor1_val >= 350) {
    Serial.println("Erde in Ordnung, keine Bewaesserung noetig!");
    for (byte j = 0; j < 17; j++) {
      digitalWrite (Pins[j], HIGH); // Pumpe und MV_x aus
    }
    delay(5000);
  }

}

SensorRead

void SelectSensor(byte SensorToSelect) {
  SensorToSelect--;
  digitalWrite(MultiplexPinA, (bitRead(SensorToSelect, 0)));
  digitalWrite(MultiplexPinB, (bitRead(SensorToSelect, 1)));
   digitalWrite(MultiplexPinC, (bitRead(SensorToSelect, 2)));
  digitalWrite(MultiplexPinD, (bitRead(SensorToSelect, 3)));
}

void CountFrequency() {
  TCNT1 = 0; //Reset Counter
  delay(10);            //Delay for stable channel selection
  bitSet(TCCR1B, CS12); //Select counter clock
  bitSet(TCCR1B, CS11); //Count on rising edge
  delay(50);            //Count for 50mS
  TCCR1B = 0;           //Stop counting
}

void AssignToSensor(int SelectedSensor) {
  FreqSensor[SelectedSensor - 1] = TCNT1 / 16; //Counts per 10mS
}

EIn allererster Tip: Lerne was Arrays sind.

so erledigt:

/*Werte vom Bodenfeuchtigkeitssensor:
  0~300    Zu trockene Erde, giessen.
  300~700  Erde in Ordnung, nicht giessen.
  700~950  Erde nass.*/

//Inkludiere DHT-Sensor-Library:
//#include 

//Temparatur & Feuchtigkeitssensor Pin sowie Sensortyp definieren
#define DHTPIN A4
#define DHTTYPE DHT22
//Pin für normalen Arduino (Mega) definieren
//DHT dht (DHTPIN, DHTTYPE);

const int MultiplexPinA = 8;
const int MultiplexPinB = 9;
const int MultiplexPinC = 10;
const int MultiplexPinD = 11;

//Magnetventile definieren (Digital-Pin 24-39)//
//#define MV_1Pin 24
//#define MV_2Pin 25
//#define MV_3Pin 26
//#define MV_4Pin 27
//#define MV_5Pin 28
//#define MV_6Pin 29
//#define MV_7Pin 30
//#define MV_8Pin 31
//#define MV_9Pin 32
//#define MV_10Pin 33
//#define MV_11Pin 34
//#define MV_12Pin 35
//#define MV_13Pin 36
//#define MV_14Pin 37
//#define MV_15Pin 38
//#define MV_16Pin 39

  int MV_pin_Array[17];
  int MV_pin[] = {24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39};
  int MV_SensVals[17] = {0};

//Pumpe-Relais definieren (Digital-Pin 40)//
#define Pumpe 40

unsigned long MillisNow;
unsigned long MillisLast;

byte CurrSensor; //Counter for the loop
unsigned int FreqSensor[4]; //Actual read in frequencies of sensors

const byte Pins[] = { Pumpe, MV_SensVals[16] };
byte MV_active = 16; //welches MV ist gerade an?

const unsigned int GIESSINTERVALL = 5000; //jedes MV bleibt fuer 30 Sekunden an, bevor es aus- und das naechste einschaltet
unsigned int intervall = 0;
unsigned long previousMillis = 0;

//Taster definieren (Digital-Pin 22-27)//
#define Taster_3 41
#define Taster_4 42
#define Taster_5 43
#define Taster_6 44

//Feuchtesensoren definieren//
int FeuchteSensor1 = 1;
int FeuchteSensor1_val;
int FeuchteSensor2 = 1;
int FeuchteSensor2_val;
int FeuchteSensor3 = 1;
int FeuchteSensor3_val;
int FeuchteSensor4 = 1;
int FeuchteSensor4_val;
int FeuchteSensor5 = 1;
int FeuchteSensor5_val;
int FeuchteSensor6 = 1;
int FeuchteSensor6_val;
int FeuchteSensor7 = 1;
int FeuchteSensor7_val;
int FeuchteSensor8 = 1;
int FeuchteSensor8_val;
int FeuchteSensor9 = 1;
int FeuchteSensor9_val;
int FeuchteSensor10 = 1;
int FeuchteSensor10_val;
int FeuchteSensor11 = 1;
int FeuchteSensor11_val;
int FeuchteSensor12 = 1;
int FeuchteSensor12_val;
int FeuchteSensor13 = 1;
int FeuchteSensor13_val;
int FeuchteSensor14 = 1;
int FeuchteSensor14_val;
int FeuchteSensor15 = 1;
int FeuchteSensor15_val;
int FeuchteSensor16 = 1;
int FeuchteSensor16_val;
int FeuchteSensor17 = 1;
int FeuchteSensor17_val;


void setup() {
  for (const byte p : Pins) {
    pinMode (p, INPUT_PULLUP);
    pinMode (p, OUTPUT);  //Anfangszustand
  }
  pinMode(MultiplexPinA, OUTPUT);
  pinMode(MultiplexPinB, OUTPUT);
  pinMode(MultiplexPinC, OUTPUT);
  pinMode(MultiplexPinD, OUTPUT);
  
  pinMode (Taster_3, INPUT_PULLUP);//Taster_3-Pin//
  pinMode (Taster_4, INPUT_PULLUP);//Taster_4-Pin//
  pinMode (Taster_5, INPUT_PULLUP);//Taster_5-Pin//
  pinMode (Taster_6, INPUT_PULLUP);//Taster_6-Pin//

  Serial.begin (9600);//Serial-Begin
  //dht.begin();

  TCCR1A = 0; //Reset timer 1
}

void loop() {
    //Erdmessung starten

  MillisNow = millis();
  if (MillisNow - MillisLast >= 1000) { //One second elapsed. Read the sensors,.......
    for (CurrSensor = 1; CurrSensor < 15; CurrSensor++) {
      SelectSensor(CurrSensor);
      CountFrequency();
      AssignToSensor(CurrSensor);
      if (GeneralRunmode == 0) { //Send to PC in CLI Terminalmode
        SendSensorFreqOverUart(CurrSensor);
      }
    }
    CheckLockTimes();
    CheckOutputs();
   
    MillisLast = MillisNow;

  FeuchteSensor1_val = analogRead(FeuchteSensor1); //Feuchtesensor-Wert 1 auslesen
  Serial.print("Lese Feuchtesensor 1 - Daten aus: ");
  Serial.println(FeuchteSensor1_val);
  //PUMPE anhand von Messergebnissen an / oder ausschalten//

  //Wenn Sensor1 Wert unter 350 - Starte Bewässerung!

  if (FeuchteSensor1_val < 400) {
    Serial.println("Erde zu trocken, Giessvorgang!");

    digitalWrite (Pumpe, LOW); //PUMPE Starten

    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= intervall) {
      intervall = GIESSINTERVALL;
      previousMillis = currentMillis;
      //MV1 bis MV6 so lange umschalten, bis der Sensor "zu nass" misst
      switch (MV_active) {
        case 1 ... 15:
          digitalWrite (Pins[MV_active], HIGH); //MV_x aus
          MV_active++;
          digitalWrite (Pins[MV_active], LOW); //MV_x an
          break;
        case 16:
          digitalWrite (Pins[MV_active], HIGH); //MV_6 aus
          MV_active = 1;
          digitalWrite (Pins[MV_active], LOW); //MV_1 an
          break;
      }
      Serial.print("Magnetventil ");
      Serial.println(MV_active);
    }
  delay(100); // dient nur der lesbaren Anzeige, kann raus!
  }

  //Wenn Sensor1 Wert gleich oder über 350 - Keine Bewässerung!
  if (FeuchteSensor1_val >= 350) {
    Serial.println("Erde in Ordnung, keine Bewaesserung noetig!");
    for (byte j = 0; j < 17; j++) {
      digitalWrite (Pins[j], HIGH); // Pumpe und MV_x aus
    }
    delay(5000);
  }

}

Das MV_Pin_Array brauchst Du nicht, mit MV_pin hast Du doch schon das Array mit den Pinnummern. Oder wozu war das erste gedacht?

Da geht's dann aber weiter :wink:

aber jetzt...
so lernt man das wenigstens mal...auch noch im hohen Alter...

/*Werte vom Bodenfeuchtigkeitssensor:
  0~300    Zu trockene Erde, giessen.
  300~700  Erde in Ordnung, nicht giessen.
  700~950  Erde nass.*/

//Inkludiere DHT-Sensor-Library:
//#include 

//Temparatur & Feuchtigkeitssensor Pin sowie Sensortyp definieren
#define DHTPIN A4
#define DHTTYPE DHT22
//Pin für normalen Arduino (Mega) definieren
//DHT dht (DHTPIN, DHTTYPE);

const int MultiplexPinA = 8;
const int MultiplexPinB = 9;
const int MultiplexPinC = 10;
const int MultiplexPinD = 11;

//Magnetventile definieren (Digital-Pin 24-39)//
  int MV_pin[] = {24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39};
  int MV_SensVals[17] = {0};
  
   //Feuchtesensoren definieren//
  int Feuchtesensor[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  int Feuchtesensor_SensVals[17] = {0};
  
//Pumpe-Relais definieren (Digital-Pin 40)//
#define Pumpe 40

unsigned long MillisNow;
unsigned long MillisLast;

byte CurrSensor; //Counter for the loop
unsigned int FreqSensor[4]; //Actual read in frequencies of sensors

const byte Pins[] = { Pumpe, MV_SensVals[16] };
byte MV_active = 16; //welches MV ist gerade an?

const unsigned int GIESSINTERVALL = 5000; //jedes MV bleibt fuer 30 Sekunden an, bevor es aus- und das naechste einschaltet
unsigned int intervall = 0;
unsigned long previousMillis = 0;

//Taster definieren (Digital-Pin 22-27)//
#define Taster_3 41
#define Taster_4 42
#define Taster_5 43
#define Taster_6 44






void setup() {
  for (const byte p : Pins) {
    pinMode (p, INPUT_PULLUP);
    pinMode (p, OUTPUT);  //Anfangszustand
  }
  pinMode(MultiplexPinA, OUTPUT);
  pinMode(MultiplexPinB, OUTPUT);
  pinMode(MultiplexPinC, OUTPUT);
  pinMode(MultiplexPinD, OUTPUT);
  
  pinMode (Taster_3, INPUT_PULLUP);//Taster_3-Pin//
  pinMode (Taster_4, INPUT_PULLUP);//Taster_4-Pin//
  pinMode (Taster_5, INPUT_PULLUP);//Taster_5-Pin//
  pinMode (Taster_6, INPUT_PULLUP);//Taster_6-Pin//

  Serial.begin (9600);//Serial-Begin
  //dht.begin();

  TCCR1A = 0; //Reset timer 1
}

void loop() {
    //Erdmessung starten

  MillisNow = millis();
  if (MillisNow - MillisLast >= 1000) { //One second elapsed. Read the sensors,.......
    for (CurrSensor = 1; CurrSensor < 15; CurrSensor++) {
      SelectSensor(CurrSensor);
      CountFrequency();
      AssignToSensor(CurrSensor);
      if (GeneralRunmode == 0) { //Send to PC in CLI Terminalmode
        SendSensorFreqOverUart(CurrSensor);
      }
    }
    CheckLockTimes();
    CheckOutputs();
   
    MillisLast = MillisNow;

  FeuchteSensor1_val = analogRead(FeuchteSensor1); //Feuchtesensor-Wert 1 auslesen
  Serial.print("Lese Feuchtesensor 1 - Daten aus: ");
  Serial.println(FeuchteSensor1_val);
  //PUMPE anhand von Messergebnissen an / oder ausschalten//

  //Wenn Sensor1 Wert unter 350 - Starte Bewässerung!

  if (FeuchteSensor1_val < 400) {
    Serial.println("Erde zu trocken, Giessvorgang!");

    digitalWrite (Pumpe, LOW); //PUMPE Starten

    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= intervall) {
      intervall = GIESSINTERVALL;
      previousMillis = currentMillis;
      //MV1 bis MV6 so lange umschalten, bis der Sensor "zu nass" misst
      switch (MV_active) {
        case 1 ... 15:
          digitalWrite (Pins[MV_active], HIGH); //MV_x aus
          MV_active++;
          digitalWrite (Pins[MV_active], LOW); //MV_x an
          break;
        case 16:
          digitalWrite (Pins[MV_active], HIGH); //MV_6 aus
          MV_active = 1;
          digitalWrite (Pins[MV_active], LOW); //MV_1 an
          break;
      }
      Serial.print("Magnetventil ");
      Serial.println(MV_active);
    }
  delay(100); // dient nur der lesbaren Anzeige, kann raus!
  }

  //Wenn Sensor1 Wert gleich oder über 350 - Keine Bewässerung!
  if (FeuchteSensor1_val >= 350) {
    Serial.println("Erde in Ordnung, keine Bewaesserung noetig!");
    for (byte j = 0; j < 17; j++) {
      digitalWrite (Pins[j], HIGH); // Pumpe und MV_x aus
    }
    delay(5000);
  }

}