Подскажите куда копать. Не как не могу решить данный ребус. Имеется линейный привод который нужно открыть и закрыть определенное количество раз. Почитал и понимаю что нужно использовать циклы 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); } }
А вести пальцем по строкам и рассуждать пробовал? Давай, ставь палец на строку "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 никогда уже меньше трёх не станет. Приплыли.
Понятно что я написал чушь, проблема в условии. Тогда подскажите как откорректировать код, а то мне самому походу не осилить. Или как его переделать что бы условие выполнялось несколько раз подряд
Ну, тут надо либо надеть трусы, либо снять крестик использовать millis без циклов, либо цикл без millis (с delay). Если в это время должно ещё что-то делаться и delay нежелателен, надо убирать цикл (loop сам по себе в бесконечном цикле вызывается) и просто считать какой-нибудь переменной-счётчиком сколько раз тело if выполнилось.
Asper Daffy, Спасибо за ваш ответ. В принципе я так и думал что работать не будет, когда игрался с разными вариантами кода. И тоже склонялся к вашему ответу. Но вам спасибо большое за ответ и разъяснение.