Застрял в цикле While!

loop

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

Мой код застревает в этом цикле while, как только входит в него, даже если условия изменены, чтобы разорвать цикл. Я хочу, чтобы двигатели работали в одном направлении, пока «dvert» = вертикальная разница не станет меньше, чем «tol» = допуск. таких петель 4. перед каждым стоит условие if. поэтому корректировка не выполняется, если она уже находится в допуске.

Сегмент кода

  if (avgtop > avgbot)
  {  Serial.println("enter avgtop > avgbot");
    Serial.println( "");

   while (abs(dvert) > tol)
     {
      Serial.println("Enter While loop vert up....");
      Serial.println("Moving Vertical Axis begin...Moving UP  ");

                   digitalWrite(vrelay1, HIGH);              // Установка кадра вниз
                   digitalWrite(vrelay2, LOW);              // Установка кадра вниз
      delay(200);
      int topl = analogRead(ldrtopl);
      int topr = analogRead(ldrtopr);
      int botl = analogRead(ldrbotl);
      int botr = analogRead(ldrbotr);
      int avgtop = (topl + topr) / 2; //среднее значение лучших LDR
      int avgbot = (botl + botr) / 2; //среднее значение нижних LDR
      int dvert = avgtop - avgbot; // проверяем разницу вверх и вниз

      Serial.print("NEW DVERT:"  );
      Serial.println(dvert);



  }  ```

, 👍0

Обсуждение

не используйте цикл while... используйте блок if... функция loop() в скетче уже зацикливается, @jsotola

К сожалению, по причинам задержки мне нужно использовать цикл while. Я хочу, чтобы система задерживалась в конце большого цикла после того, как все выровнено, @Omasín

зачем тебе отсрочка? .... если вам действительно нужна задержка, делайте задержку только тогда, когда нет обновляемой позиции двигателя .... это легко сделать с помощью переменной «флаг», @jsotola

Задержка позволит системе заснуть в течение установленного времени, чтобы позволить солнцу сместиться на разумное расстояние, прежде чем снова отслеживать., @Omasín

просто сделайте что-то вроде этого псевдокода if (идите влево) {runMotor(left); moving = true;} else {moving = false;} ... if (направо) {runMotor(направо); moving = true;} .... if (!moving) { пауза 10 секунд} else {пауза 1 секунда}, @jsotola

Спасибо может попробовать., @Omasín

Но все еще не понимаю, почему цикл while не завершается, @Omasín

Ваш вывод dvert должен показать вам, *почему* цикл не завершается., @the busybee

Выходное значение dvert изначально равно >толерантности, но значение изменяется на <толерантность, но цикл продолжает зацикливаться. Я заблудился., @Omasín

>"задержка позволит системе заснуть" НЕПРАВИЛЬНО. delay скорее только блокирует систему и хороша для быстрого и грязного демонстрационного кода. Поскольку loop() зацикливается, просто дайте ему зациклиться без действий, если никаких действий не требуется., @DataFiddler


1 ответ


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

1

Вы маскируете свою внешнюю переменную dvert (и, возможно, другие, которые хотите сохранить) локальными переменными внутри цикла:

  int dvert = avgtop - avgbot; // проверяем разницу вверх и вниз

Если вы просто присваиваете новое значение существующей переменной, вам не нужно объявлять новую переменную!

Вместо этого должно быть просто:

  dvert = avgtop - avgbot; // проверяем разницу вверх и вниз

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

,

ты мужчина. Теперь это работает. Я почти начал с нуля, большое спасибо, @Omasín