Как остановить реле после его включения и дать датчику получить результат

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

void loop() {
  //-------------Fungsi Read sensor----------- 
  // sensorAll();

  hasilec = (ppmcensor - inputec);
  ph = (phcensor - inputph);
  
  //  hasilec = random(-200, 0) / 100.0;
  //  ph = random(-200, 200) / 100.0;

  //  ph = -180/100.0;
  //  hasilec = -1.2;
  
  unsigned long now = millis();
  
  Serial.print("pH    ");
  Serial.print(ph);
  Serial.print("  ");
  Serial.print("EC ");
  Serial.print(hasilec);
  Serial.println("");
  Serial.print(ph); Serial.print(" ");
  Serial.print(hasilec); Serial.print(" ");
  Serial.println(" ");

  //  delay (500000);
  
  fuzzy->setInput(2, hasilec);
  fuzzy->setInput(1, ph);  
  fuzzy->fuzzify();

  float pompa01 = fuzzy->defuzzify(1);//pHDOWN
  float pompa02 = fuzzy->defuzzify(2);//pHUP
  float pompa03 = fuzzy->defuzzify(3);//ABMIX
  
  Serial.println("Result= ");
  Serial.println("");
  Serial.print(" Pompa1 pHDOWN: ");
  Serial.println(pompa01);
  Serial.print(" pompa2 phUP  : ");
  Serial.println(pompa02);
  Serial.print(" pompa3 ABMIX : ");
  Serial.println(pompa03);
  Serial.println("");
  Serial.println("");
  Serial.println("");
  
  delay (2000);
  
  long int pompa1 = pompa01 * 1000;
  long int pompa2 = pompa02 * 1000;
  long int pompa3 = pompa03 * 1000;
  
  pump_periods[0] = pompa1; //PHdown
  pump_periods[1] = pompa2; //PHup
  pump_periods[2] = pompa3; //ABMIX
  
  for (int i = 0; i < jml_pump; i++) {
    if (now - pump_last_actuations[i] >= pump_periods[i]) {
      pump_states[i] = (pump_states[i] == LOW) ? HIGH : LOW;
      digitalWrite(pump_pins[i], pump_states[i]);
      pump_last_actuations[i] = now;
    }    
  }   
}

Если я ставлю задержку после миллисекундной итерации, это приводит к тому, что насос включается только на основе задержки, а не на миллисекундах таймера. Что же мне делать?

, 👍0

Обсуждение

Извините, я не понимаю вашего вопроса. Что именно продолжает зацикливаться? Функция loop() всегда выполняет цикл, для чего и предназначена. Или что вы имеете в виду? И что означает "не создавать пространство для стабилизации моего окружения"?, @chrisl

почему вы используете нечеткую логику?, @jsotola

Я имею в виду, пусть волновой насос смешает всю смесь Ph и AB, а fet стабилизируется на заданном значении, потому что я пытаюсь использовать для этого fuzzy, @daffa faiz

извините, я понятия не имею, что вы сказали, @jsotola

Пожалуйста, [отредактируйте] ваш вопрос и предоставьте некоторый контекст. If поможет, если вы тоже переведете свои переменные и тексты., @the busybee

Вы не можете поместить большую задержку () в любом месте цикла, не испортив синхронизацию millis(), которую вы используете в цикле for, когда pump_periods[i] меньше, чем ваша задержка. Пожалуйста, объясните, чего нужно ждать; какой датчик считывает какое состояние; что заставляет насос запускаться и где в коде это происходит., @ocrdu

я хочу подождать пару минут, пока жидкость смешается после того, как я добавлю немного pH вверх или вниз и AB-mix, датчик считывает промилле и pH, и я получаю их значение, запуск насоса основан на моих нечетких правилах., @daffa faiz


1 ответ


Лучший ответ:

0

Если все насосы должны работать в течение времени pump_periods[i] в каждом цикле, и у вас все равно будет длинная задержка (), вы можете заменить цикл for на:

for (int i = 0; i < jml_pump; i++) { // Для каждого насоса:
  digitalWrite(pump_pins[i], 1);     // Задержка запуска насоса i
  delay(pump_periods[i]);            // Ожидание pump_periods[i] ms
  digitalWrite(pump_pins[i], 0);     // Остановка насоса i
}
delay(120000);                       // Подождите 2 минуты до смешивания

Это заблокирует цикл, но в любом случае у вас будет длительная задержка. Насосы будут работать последовательно, а не одновременно.

Это то, чего ты хочешь?

,