Giesomat 16 Sensoren 16 Relais Anfänger

Dann gleich weiter:

  1. Pinnummern größer 255 gibt es in diesem Umfeld nicht, daher Typ byte oder uint8_t verwenden.
  2. Das gilt auch für MV_pin[ ], auch const.
  3. Wieso [17], es sind doch nur 16, oder?
  4. Vermeide "magische" Nummern, besser const byte TOPFZAHL = 16; const byte MV_pin[TOPFZAHL] = {...}; const byte MV_SensVals[TOPFZAHL] = {...}; und so weiter.

erledigt.
aber das verstehe ich nicht. wo muß das hin?

  1. Vermeide “magische” Nummern, besser const byte TOPFZAHL = 16; const byte MV_pin[TOPFZAHL] = {…}; const byte MV_SensVals[TOPFZAHL] = {…}; und so weiter.
/*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)//
  byte MV_pin[] = {24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39};
  byte MV_SensVals[16] = {0};
  
   //Feuchtesensoren definieren//
  byte Feuchtesensor[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  byte Feuchtesensor_SensVals[16] = {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[16]; //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);
  }

}

Man sollte keine festen Zahlen verwenden, um z.B. die Arrayröße festzulegen. Wenn sich das mal ändert, änderst Du an werweis nicht wieviel Stellen im Code, und vergisst bestimmt irgendwo eine Stelle.
Deshalb definiert man einmal eine Konstante - hier also wieviel Topfe zu gießen sind - und verwendet im Code dann nur noch den Konstantennamen. Dann kann man das im Bedarfsfall ein einer einzigen Stelle ändern.
Das gilt an sich für alle 'magischen Zahlen' ( z.B. auch bei den Pinnummern) . Immer am Anfang einem Namen zuweisen, und im Sketch nur diesen Namen verwenden. Dann tut man sich bei Änderungen wesentlich leichter.

Bei MV_SensVals habe ich mich vertan, sorry.

Eventuell so:

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

//Magnetventile definieren (Digital-Pin 24-39)//
const byte TOPFZAHL = 16;
const byte MV_pin[TOPFZAHL] = {24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39};
unsigned int MV_SensVals[TOPFZAHL] = {0};

Hast Du Dich schon mal mit Strukturen, Klassen oder OOP beschäftigt?

Quasi so?
ich habe es mal beim Feuchtesensor versucht umzusetzen.

/*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 byte MultiplexPinA = 8;
const byte MultiplexPinB = 9;
const byte MultiplexPinC = 10;
const byte MultiplexPinD = 11;

//Magnetventile definieren (Digital-Pin 24-39)//
const byte TOPFZAHL = 16;
const byte MV_pin[TOPFZAHL] = {24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39};
unsigned int MV_SensVals[TOPFZAHL] = {0};

//Feuchtesensoren definieren//
const byte SENSORZAHL = 16;
const byte Sensor_pin[SENSORZAHL] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
unsigned int SENSOR_SensVals[TOPFZAHL] = {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[16]; //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);
    }

  }

Müssen die unterschieden werden?

Da sehe ich noch eine magische Nummer.

Wobei mir die letzten beiden Zeilen etwas merkwürdig vorkommen.

ja wäre schön wenn ich mal mehrere Sensoren pro Topf haben will

Wie das mit dem Sensor richtig funktioniert habe ich noch nicht richtig begriffen.
Irgendwie muß man ja die verschiedenen Sensoren selektieren und zuweißen.

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
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.