Оптимальное и экономичное управление водяным насосом

relay loop

Я использую микроконтроллер Arduino, водяной насос 12 В и реле печати для полива растений.

Переключатель уровня воды контролирует резервуар для воды, чтобы убедиться, что водяной насос не пересыхает.

Я попробовал различное время полива и понял, что при использовании более длительного времени полива 90 000 миллисекунд и дольше. Реле иногда переключается неправильно, и насосы продолжают работать. Я не уверен, что мой код оптимален для таких целей:

const int Power_Water = 3; // Pin to turn the Pump On and Off via relay
const int Watering_Time = 90000; // Time the water's supposed to run
const int Water_Tank = 10; // Water Level Switch


void setup() {
  Serial.begin(9600);
  pinMode(Power_Water,OUTPUT); // Pin that triggers the Relay as Output
  pinMode (Water_Tank,INPUT_PULLUP); // Pin of Water_Level Sensor as internal pullup
}

void loop (){
  unsigned long watering_Start = millis();

  while (millis() - watering_Start <= Watering_Time && (digitalRead (Water_Tank) == LOW)){
    digitalWrite(Power_Water,HIGH); // Water Pump goes ON
    Serial.println(millis() - watering_Start);
  }

  if (millis() - watering_Start > Watering_Time || (digitalRead (Water_Tank) == HIGH)){
    Serial.println("Pump OFF"); 
    digitalWrite(Power_Water,LOW);// Water Pump OFF
  }
  delay(100000000); // example "sleep" time the system is not supposed to water
}

Любые предложения приветствуются.

Я изменился

const int Power_Water = 3; // Pin to turn the Pump On and Off via relay
const long Watering_Time = 90000; // Time the water's supposed to run
const long Water_Tank = 10; // Water Level Switch


void setup() {
  Serial.begin(9600);
  pinMode(Power_Water,OUTPUT); // Pin that triggers the Relay as Output
  pinMode (Water_Tank,INPUT_PULLUP); // Pin of Water_Level Sensor as internal pullup
}

void loop (){
  unsigned long watering_Start = millis();
  digitalWrite(Power_Water,HIGH);
while (digitalRead(Power_Water) == HIGH){
Serial.println(millis() - watering_Start);
if (millis() - watering_Start > Watering_Time || (digitalRead (Water_Tank) == HIGH)){
    Serial.println("Pump OFF");
    digitalWrite(Power_Water,LOW);
}
}
delay(100000000); // example "sleep" time the system is not supposed to water
}

, 👍0

Обсуждение

вы определили watering_time как целое число .... прочтите это ... https://www.arduino.cc/reference/en/language/variables/data-types/int/ ........ тогда прочтите это ... https://www.arduino.cc/reference/en/language/variables/data-types/long/, @jsotola

используйте unsigned long Watering_Time. максимальное значение для signed int-32 767, @Juraj


1 ответ


1

Это заявление о задержке полностью противоречит целям вашего кода millis. Если вы хотите обеспечить минимальное свободное время, вам придется сделать это и с миллисом. Использование millis таким образом требует, чтобы вы позволяли функции цикла повторяться много тысяч раз в секунду. Как написано, вы разрешаете выполнять функцию цикла только один раз в одиннадцать с половиной дней.

,

спасибо за ввод... вот пример, и здесь я хочу, чтобы код повторялся каждые 100000000 мс, но когда насос запускается, я хочу контролировать его с помощью millis.. часть полива-это важная часть для меня.. Я думаю, что нашел правильный код для своих нужд и добавил его к своему вопросу, @Peter S

Правильный код для вас не будет иметь никакого использования функции задержки. Использование функции задержки нарушает ваше использование millis. Использование millis требует, чтобы цикл был свободен для запуска. Вы не можете использовать блокирующие вызовы, такие как delay, в то же время вы используете millis для синхронизации и ожидаете, что что-то получится., @Delta_G