also mit meiner Testversion des Codes, der um die Funktion muxChannel erweitert wurde habe ich keine Probleme. Hier kann ich mit mux_Channel_() die Kanäle manuell ansteuern und auslesen. Auf die Weise funtkionieren die Sensoren einwandtfrei und reagieren sofort auf Berührung.
//Pinbelegung des Signaleingangs der Feuchtesensoren
//(alle Sensoren laufen über einen Multiplexer + Tiefpass, bevor sie am Pin A0 ausgelesen werden)
const int MuxAD = A0;
//Adressierpins des Multiplexers
const int s0 = 22;
const int s1 = 23;
const int s2 = 24;
const int s3 = 25;
//_________________________________________________________________________________________________________________________________
// ###################### Definition der globalen Variablen ######################
int currVal; // globale Variable für den aktuellen gefilterten AD-Wert
int Sensorwert; // globale Variable für den aktuellen Sensorwert
//_________________________________________________________________________________________________________________________________
// ###################### Definition der globalen Konstanten ######################
const int SensUG = 150; // untere Fehlergrenze für Sensorwert
const int SensOG = 800; // obere Fehlergrenze für Sensorwert
const int Pflanze_trocken = 600; // Wert, ab dem gegossen werden soll
const int Pflanze_nass = 700; // Wert, bis dem gegossen werden soll
const int T_check_Sens_const = 5000; // Abstand für Prüfung ob Sensorwert konstant
const int Sensorgap = 5; // Fenster für Kriterium Sensor ko
const int Bewaesserungsdauer = 5000; // Zeit, die gegossen werden soll (5sec)
static unsigned long Bewaesserungspause = 7200000; // Abstand zwischen Bewässerung (2h)
/*
____________________________________________________________________________________________________________________________________
####################################################################################################################################
##################################################################################################################################*/
//
void setup(){
Serial.begin(115200); // startet serielle Übertragung mit 115200 Baud
Serial.print("Zeit[sek] \t"); // Drucken des Spaltenkopfes
Serial.print("prevVal \t");
Serial.print("currVal \t");
Serial.println("Delta \t");
//_________________________________________________________________________________________________________________________________
// ###################### Deklaration der Pins (Eingang/Ausgang) ######################
pinMode(MuxAD, INPUT); //Sensoreingang
pinMode(s0, OUTPUT); //Ausgang Adressleitung 0
pinMode(s1, OUTPUT); //Ausgang Adressleitung 1
pinMode(s2, OUTPUT); //Ausgang Adressleitung 2
pinMode(s3, OUTPUT); //Ausgang Adressleitung 3
digitalWrite(s0, LOW); //setzt Status der
digitalWrite(s1, LOW); //Adressleitungen standartmäßig
digitalWrite(s2, LOW); //auf LOW
digitalWrite(s3, LOW);
}
// Ende void setup()
/*
____________________________________________________________________________________________________________________________________
####################################################################################################################################
##################################################################################################################################*/
void loop(){
readsensor(MuxAD);
Wertstabil();
/*Bewaessern();
Manuelles_Giessen();
Fensterkontrolle();
Wasseralarm();
Wasserstandskontrolle();*/
}// Ende void loop()
/*************************************************************************************************
** readsensor **
**************************************************************************************************
** liesst alle 100ms einen AD-Wert von SPin. **
** Dieser Wert wird gefiltert (Tiefpaß 1. Ordnung) und in currVal gespeichert **
** **
** Input: SPin **
** Output: Filtwert **
** genutzte Globale Variablen: currVal **
**************************************************************************************************/
void readsensor(int SPin){
muxChannel_3();
static unsigned long lastread = 0;
static float FiltWert;
const float FilterFaktor = 20;
if (millis()-lastread < 100) return; // alle 100ms einen Wert holen.
lastread = millis(); // Zeit des letzten Wertes merken
int AktWert = analogRead(MuxAD);
if (AktWert < SensUG && AktWert > SensOG){ // prüfen ob AD-Wert gültig.
currVal = -99; // fals nicht, Fehlercode -99 zurückgeben
return;
}
FiltWert = ((FiltWert * FilterFaktor) + AktWert) / (FilterFaktor + 1);
currVal = int(FiltWert);
} // End of readsensor
/*************************************************************************************************
** Wertstabil **
**************************************************************************************************
** Prüft, ob der eingelesene Sensorwert hinreichend stabil ist. **
** **
** Input: nix **
** Output: nix **
** genutzte Globale Variablen: currVal, Sensorwert, **
**************************************************************************************************/
void Wertstabil(){
static unsigned long prevTime = 0;
static int prevVal;
if(millis()- prevTime < T_check_Sens_const)return; // prüfen, ob das nächste Prüffenster erreicht ist
prevTime = millis(); // Zeit des letzten Prüfens merken
int delta = abs(currVal-prevVal);
// Ausgabe von Debug-Werten:
Serial.println();
Serial.print(millis()/1000);
Serial.print("\t");
Serial.print(prevVal);
Serial.print("\t");
Serial.print(currVal);
Serial.print("\t");
Serial.print(delta);
// Ende Ausgabe Debugwerte
if( delta <= Sensorgap){ // Wenn Änderung kleiner Gap,
Sensorwert = currVal; // als Sensorwert speichern.
Serial.print(" gueltiger Sensorwert = ");
Serial.println(Sensorwert);
}
prevVal = currVal; // aktuelle Wert als letzten Wert merken.
}
// End of wertstabil
int muxChannel_1(){
digitalWrite(s0, HIGH);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
}
int muxChannel_2(){
digitalWrite(s0, LOW);
digitalWrite(s1, HIGH);
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
}
int muxChannel_3(){
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
}
int muxChannel_4(){
digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, HIGH);
digitalWrite(s3, LOW);
}
int muxChannel_5(){
digitalWrite(s0, HIGH);
digitalWrite(s1, LOW);
digitalWrite(s2, HIGH);
digitalWrite(s3, LOW);
}
int muxChannel_6(){
digitalWrite(s0, LOW);
digitalWrite(s1, HIGH);
digitalWrite(s2, HIGH);
digitalWrite(s3, LOW);
}
int muxChannel_7(){
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
digitalWrite(s2, HIGH);
digitalWrite(s3, LOW);
}
int muxChannel_8(){
digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
}
int muxChannel_9(){
digitalWrite(s0, HIGH);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
}
int muxChannel_10(){
digitalWrite(s0, LOW);
digitalWrite(s1, HIGH);
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
}
// Ende Adressierung des analogen/digitalen Multiplexers
Kann man das jetzt nicht ein wenig eleganter machen und dann irgendwie in den Code mit einbauen??
Irgendwie so:
int controlPin[] = {s0, s1, s2, s3};
int muxChannel[10] [4]={
{1,0,0,0}, //channel 1
{0,1,0,0}, //channel 2
{1,1,0,0}, //channel 3
{0,0,1,0}, //channel 4
{1,0,1,0}, //channel 5
{0,1,1,0}, //channel 6
{1,1,1,0}, //channel 7
{0,0,0,1}, //channel 8
{1,0,0,1}, //channel 9
{0,1,0,1}, //channel 10