using ulong = unsigned long int;
class TimerBase {
public:
virtual bool operator()(const ulong, bool);
protected:
ulong timeStamp {0};
};
class Interval : public TimerBase {
public:
bool start(bool state = false) {
timeStamp = millis();
return state;
}
virtual bool operator()(const ulong duration, bool state = false) override {
if (false == isStarted) {
isStarted = true; // Set the value to true on the first call
return start(state);
}
return (millis() - timeStamp >= duration) ? start(true) : retFalse();
}
private:
bool retFalse() {
return false;
}
private:
bool isStarted {false}; // Flag = true if the first Operator() call has been made.
};
enum class Status : byte {idle, pumpOn, waitPumpOff};
// constexpr ulong TIME_WAIT {1000 * 60 * 10};
constexpr ulong TIME_WAIT {1000 * 10};
constexpr ulong TIME_PUMP {1000 * 5};
constexpr byte RELAIS_PIN {5};
constexpr byte SENSOR_PIN {A0};
constexpr int MOISTURE_THRESHOLD {260};
Interval wait; // Objekt für Intervalle erzeugen
int soilMoisture {0}; // Schwellenwert für Feuchtigkeit
int soilMoisturePercent; // Variable um in Wert in Prozent anzugeben
void setup() {
Serial.begin(115200);
pinMode(RELAIS_PIN, OUTPUT);
Serial.println("Start...");
}
Status fsm(Status st) {
switch (st) {
case Status::idle:
if (wait(TIME_WAIT) == true) {
soilMoisture = analogRead(SENSOR_PIN);
// soilMoisturePercent = map(soilMoisture, 15, 500, 100, 0);
Serial.print("Messwert: "); Serial.println(soilMoisture);
if (soilMoisture > MOISTURE_THRESHOLD) {
Serial.println("Pumpe für fünf Sekunden starten");
st = Status::pumpOn;
}
}
break;
case Status::pumpOn:
Serial.println("Schalte Pumpe für 5 Sekunden ein");
digitalWrite(RELAIS_PIN,HIGH);
st = Status::waitPumpOff;
break;
case Status::waitPumpOff:
if (wait(TIME_PUMP) == true) {
Serial.println("Schalte Pumpe wieder aus");
digitalWrite(RELAIS_PIN,LOW);
st = Status::idle;
}
break;
}
return st;
}
void loop() {
static Status status {Status::idle};
status = fsm(status);
}
Poti simuliert Feuchtemesser
Startwert 270. Verschieben ändert den Wert.