Застрял в цикле While!
Я использую 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);
} ```
@Omasín, 👍0
Обсуждение1 ответ
Лучший ответ:
Вы маскируете свою внешнюю переменную dvert
(и, возможно, другие, которые хотите сохранить) локальными переменными внутри цикла:
int dvert = avgtop - avgbot; // проверяем разницу вверх и вниз
Если вы просто присваиваете новое значение существующей переменной, вам не нужно объявлять новую переменную!
Вместо этого должно быть просто:
dvert = avgtop - avgbot; // проверяем разницу вверх и вниз
И то же самое для всего остального внутри цикла, которое вы хотите присвоить переменной, созданной вне цикла.
ты мужчина. Теперь это работает. Я почти начал с нуля, большое спасибо, @Omasín
- Мигните светодиодом 5 раз с помощью цикла for
- Чтение нескольких аналоговых входных контактов
- Как остановить цикл в последовательном мониторе?
- Одновременное чтение кнопки?
- Объектно-ориентированное программирование Arduino
- Как запустить функцию каждый 10-й раз через цикл?
- Реализация циклического буфера и Serial.print()
- Почему циклы Do While не останавливаются?
не используйте цикл 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