Arduino überspringt manchmal delay

Hallo,

ich sitze gerade an einer Pflanzenbewässerungsanlage. Der Code soll überprüfen ob die Erde genug feucht ist, wenn nicht dann soll gepumpt werden. Das wird auch manchmal korrekt ausgeführt nur alle 5-9 wiederholungen wird der delay in Zeile 24 übersprungen und es wird dadurch nicht gepumpt. ICh kann den Fehler nicht finden.

int counter;
const int moistPin = A2;
const int relayPin = 8;
const int waterLevelPin = A5;
const int indicatorLEDPin = 13;
const int waterLevelLimit = 500;// Sensor delivers an integer between 0 and 1023
const int moistLimit = 500; // Sensor delivers an integer between 0 and 800

void setup() {
  Serial.begin(9600); //Starts the communication
  pinMode(moistPin, INPUT);
  pinMode(waterLevelPin, INPUT);
  pinMode(relayPin, OUTPUT);
  counter = 0;
}

void loop() {
  Serial.print("Counter : "), Serial.println(counter);
  delay(1000);
  Serial.print("Moist: "), Serial.println(analogRead(moistPin));
  if (counter >= 10 && analogRead(moistPin) > moistLimit) {
    digitalWrite(relayPin, HIGH);
    Serial.println("Start watering!");
    delay(3000);
    Serial.println("Stop watering!");
    counter = 0;
  }
  Serial.print("Water level: "), Serial.println(analogRead(waterLevelPin));
  if (analogRead(waterLevelPin) < waterLevelLimit) {
    digitalWrite(indicatorLEDPin, HIGH);
  } else {
    digitalWrite(indicatorLEDPin, LOW);
  }
  if (counter < 30) {
    counter = counter + 1;
  }
  digitalWrite(relayPin, LOW);
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Danke, hab die Funktion nicht mehr gefunden. Big sorry.

Das geht nicht.
Wenn nur die Zeile 24 übersprungen würde, wäre die Pumpe an und sofort wieder aus.
Auf dem Seriellen Monitor wären dann auch die beiden Ausgaben ohne Pause zu sehen.

Ich denke eher, das die Bedingung davor:

Dir einen Streich spielt.

Noch ein Hinweis:
Der anlaogRead() pendelt um ein paar digits. Wenn Du einen Wert mehrfach verwenden willst, speichere ihn zwischen.
Du läufst sonst Gefahr, zwei unterschiedliche Werte zu benutzen.
Beispiel:

Bau dir serielle Ausgaben auf den Monitor ein, dann findest du dein Problem.

Hier dein Code mit einer neu hinzugefügten Variable namens moistValue

int counter;
const int moistPin = A2;
const int relayPin = 8;
const int waterLevelPin = A5;
const int indicatorLEDPin = 13;
const int waterLevelLimit = 500;// Sensor delivers an integer between 0 and 1023
const int moistLimit = 500; // Sensor delivers an integer between 0 and 800

int moistValue; // neu hinzugefügte Variable

void setup() {
  Serial.begin(9600); //Starts the communication
  pinMode(moistPin, INPUT);
  pinMode(waterLevelPin, INPUT);
  pinMode(relayPin, OUTPUT);
  counter = 0;
}

void loop() {
  Serial.print("Counter : ");
  Serial.println(counter);
  delay(1000);
  Serial.print("Moist: ");
  moistValue = analogRead(moistPin); // Messwert speichern
  Serial.println(moistValue);  // gespeicherten Messwert benutzen

  //                   hier den GLEICHEN gespeicherten Messwert benutzen
  if (counter >= 10 && moistValue > moistLimit) {
    digitalWrite(relayPin, HIGH);
    Serial.println("Start watering!");
    delay(3000);
    Serial.println("Stop watering!");
    counter = 0;
  }

  Serial.print("Water level: ");
  Serial.println(analogRead(waterLevelPin));

  if (analogRead(waterLevelPin) < waterLevelLimit) {
    digitalWrite(indicatorLEDPin, HIGH);
  }
  else {
    digitalWrite(indicatorLEDPin, LOW);
  }

  if (counter < 30) {
    counter = counter + 1;
  }
  digitalWrite(relayPin, LOW);
}

und hier dein Code ergänzt um debug-output der sich mit Hilfe von zwei Macros schneller einfügen lässt als mit einzelnen Serial.prints

// MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START *

// a detailed explanation how these macros work is given in this tutorial
// https://forum.arduino.cc/t/comfortable-serial-debug-output-short-to-write-fixed-text-name-and-content-of-any-variable-code-example/888298

#define dbg(myFixedText, variableName) \
  Serial.print( F(#myFixedText " "  #variableName"=") ); \
  Serial.println(variableName);
// usage: dbg("1:my fixed text",myVariable);
// myVariable can be any variable or expression that is defined in scope

#define dbgi(myFixedText, variableName,timeInterval) \
  do { \
    static unsigned long intervalStartTime; \
    if ( millis() - intervalStartTime >= timeInterval ){ \
      intervalStartTime = millis(); \
      Serial.print( F(#myFixedText " "  #variableName"=") ); \
      Serial.println(variableName); \
    } \
  } while (false);
// usage: dbgi("2:my fixed text",myVariable,1000);
// myVariable can be any variable or expression that is defined in scope
// third parameter is the time in milliseconds that must pass by until the next time a
// Serial.print is executed
// end of macros dbg and dbgi
// MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END *


int counter;
const int moistPin = A2;
const int relayPin = 8;
const int waterLevelPin = A5;
const int indicatorLEDPin = 13;
const int waterLevelLimit = 500;// Sensor delivers an integer between 0 and 1023
const int moistLimit = 500; // Sensor delivers an integer between 0 and 800

int moistValue; // neu hinzugefügte Variable

void setup() {
  Serial.begin(9600); //Starts the communication
  pinMode(moistPin, INPUT);
  pinMode(waterLevelPin, INPUT);
  pinMode(relayPin, OUTPUT);
  counter = 0;
}

void loop() {
  dbg("Top of loop",counter);
  //Serial.print("Counter : ");
  //Serial.println(counter);
  delay(1000);
  Serial.print("Moist: ");
  moistValue = analogRead(moistPin); // Messwert speichern
  //Serial.println(moistValue);  // gespeicherten Messwert benutzen
  dbg("2:",moistValue);

  //                   hier den GLEICHEN gespeicherten Messwert benutzen
  if (counter >= 10 && moistValue > moistLimit) {
    dbg("3:counter >= 10 && moistValue > moistLimit)",moistValue);
    digitalWrite(relayPin, HIGH);
    Serial.println("before delay(3000) Start watering!");
    delay(3000);
    Serial.println("after delay(3000) Stop watering!");
    counter = 0;
  }

  //Serial.print("Water level: ");
  //Serial.println(analogRead(waterLevelPin));
  dbg("4:Water level:",analogRead(waterLevelPin) );
  if (analogRead(waterLevelPin) < waterLevelLimit) {
    digitalWrite(indicatorLEDPin, HIGH);
  }
  else {
    digitalWrite(indicatorLEDPin, LOW);
  }

  if (counter < 30) {
    counter = counter + 1;
  }
  digitalWrite(relayPin, LOW);
}

vgs

Beschreibe mal mit Alltagssprache wie die Steuerung funktionierten soll.

Ich verstehe nicht was du mit der variable counter erreichen willst.

vgs