Повтор цикла работы линейного привода заданного кол-ва раз

Тема в разделе "Arduino & Shields", создана пользователем Mifodiay, 27 ноя 2021.

  1. Mifodiay

    Mifodiay Нуб

    Подскажите куда копать. Не как не могу решить данный ребус. Имеется линейный привод который нужно открыть и закрыть определенное количество раз. Почитал и понимаю что нужно использовать циклы FOR или WHILE. Я их подставлял в свой код но цикла не происходит. Сам цикл построен на счетчике который протекает один раз оканчиваясь поднятым флагом


    Код (C++):
    const int actuator_OP = 35;  //назначаем контакт для открытия
    const int actuator_CL = 44;  //назначаем контакт для закрытия
    byte operating=0; //  переменную  цикла

    static byte cleaning; // счётчик переменную до цикла
    unsigned long tmr = 0;
    boolean opening; //флаг



    void setup() {
    pinMode(actuator_OP, OUTPUT);
    pinMode(actuator_CL, OUTPUT);
    Serial.begin(9600);
    }

    void extendActuator() {
        digitalWrite(actuator_OP, HIGH);
        digitalWrite(actuator_CL, LOW);
    }

    void retractActuator() {
        digitalWrite(actuator_OP, LOW);
        digitalWrite(actuator_CL, HIGH);
    }

    void stopActuator() {
        digitalWrite(actuator_OP, LOW);
        digitalWrite(actuator_CL, LOW);
    }
    void loop() {
     
    while (operating<3){
     
    if (!opening && millis() - tmr >= 1000) {// начало пауза, а потом работа
        cleaning++;
         Serial.println(cleaning);
              Serial.print("counter");
        if (cleaning >= 5) { //interval *5 этап 1
         extendActuator();
       
         Serial.print("OPEN");}
       
      if(cleaning >= 7 ) {//interval +5 +2 этап 2
         stopActuator();
       
         Serial.print("STOP");}  
      if (cleaning >= 12) {//interval +5 +2+5 этап 3 (этап 1= этап 3)
         retractActuator();
         Serial.print("CLOSE");
         opening = 1;
        cleaning =0; }    
        tmr = millis();
       
        }
       operating++;
       Serial.print( operating);
    }
    }
     
     
  2. Asper Daffy

    Asper Daffy Иксперд

    А вести пальцем по строкам и рассуждать пробовал?

    Давай, ставь палец на строку "while (operating < 3)" и рассуждай.

    1. operating пока 0, так что входим в цикл
    2. палец на строку "if (!opening && millis() - tmr >= 1000) {" -- условие неверно, пропускаем тело if
    4. палец на строку "operating++;" -- ага, стало 1
    5. строка "Serial.print( operating);" должно напечататься
    6. строка "while (operating < 3)" -- operating - 1 -- d[jlbv d wbrk
    ....

    Далее три раза повторяется ничего не делание и цикл заканчивается, т.к. operating стало равным 3.

    После этого в цикл программ никогда не входит, т.к. operating никогда уже меньше трёх не станет.

    Приплыли.
     
    Последнее редактирование: 28 ноя 2021
    DetSimen, Рокки1945 и Andrey12 нравится это.
  3. Mifodiay

    Mifodiay Нуб

    Понятно что я написал чушь, проблема в условии. Тогда подскажите как откорректировать код, а то мне самому походу не осилить. Или как его переделать что бы условие выполнялось несколько раз подряд
     
    Последнее редактирование: 28 ноя 2021
  4. Asper Daffy

    Asper Daffy Иксперд

    Ну, тут надо либо надеть трусы, либо снять крестик использовать millis без циклов, либо цикл без millis (с delay). Если в это время должно ещё что-то делаться и delay нежелателен, надо убирать цикл (loop сам по себе в бесконечном цикле вызывается) и просто считать какой-нибудь переменной-счётчиком сколько раз тело if выполнилось.
     
    DetSimen нравится это.
  5. Mifodiay

    Mifodiay Нуб

    Asper Daffy,
    Спасибо за ваш ответ. В принципе я так и думал что работать не будет, когда игрался с разными вариантами кода. И тоже склонялся к вашему ответу. Но вам спасибо большое за ответ и разъяснение.