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);
}
}