While или не while ?
- Войдите на сайт для отправки комментариев
Пт, 16/11/2018 - 15:03
Простой скетч , писал сам и запутался потому что не хочет работать правильно.
Бегущий огонек , должен остановиться в случайном месте и мигать.
Но всегда останавливается на 10 . Если поменять while на if то все значения правильные . Но мне нужен while .
Где ошибка ?
int duration; int startled; int l1 = 18; int l2 = 3; int l3 = 4; int l4 = 5; int l5 = 6; int l6 = 7; int l7 = 8; int l8 = 9; int l9 = 10; int l10 = 11; int l11 = 12; int l12 = 13; int l13 = 14; int l14 = 15; int l15 = 16; int l16 = 17; int lp[] = {l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16}; //int pin = 2; void setup() { Serial.begin(9600); for (int i = 0; i < 16; i++) { pinMode(lp[i], OUTPUT); digitalWrite(lp[i], LOW); } } void loop() { duration = random(16); digitalWrite(lp[startled], HIGH); delay(150); digitalWrite(lp[startled], LOW); startled ++; if ( startled > 15 ) { startled = 0; } while (duration == 0 ) { Serial.print("startled "); Serial.println(startled); digitalWrite(lp[startled], HIGH); delay(50); digitalWrite(lp[startled], LOW); delay(50); } }
может дело в том, что random(x) при постоянном x всегда выдает одну и ту же последовательность
Попробуйте вывести значение duration в Сериал на каждом цикле
Так и задумано. Вам это нужно: http://arduino.ru/Reference/RandomSeed
может дело в том, что random(x) при постоянном x всегда выдает одну и ту же последовательность
Попробуйте вывести значение duration в Сериал на каждом цикле
Если смотреть перед while то всегда 10. Стоит заменить while на if - значения случайные.
Так и задумано. Вам это нужно: http://arduino.ru/Reference/RandomSeed
С RandomSeed тоже самое .
С того if...else if...else это проверка условие
while это цикл и проверка условие
duration в while не имеет возможность получить новое значение от функция random. если duration == 0, то выполняется в while
С того if...else if...else это проверка условие
while это цикл и проверка условие
duration в while не имеет возможность получить новое значение от функция random. если duration == 0, то выполняется в while
Спасибо! Как же мне поступить в моем случае ?
Зачем вам этот while-то?
Зачем вам этот while-то?
Для того чтобы остановить все и моргать последним светодиодом .
Больше никакие действия не нужны.
С того if...else if...else это проверка условие
while это цикл и проверка условие
duration в while не имеет возможность получить новое значение от функция random. если duration == 0, то выполняется в while
Вы правы ! Спасибо еще раз!
Вот так работает почти как нужно. Буду доделывать . Главное помогли вычислить ошибку.
Ну, если надо, то...
Sadman41, Спасибо большое !
Уменя еще 2 вопроса по вашему коду.
Строка 29 randomSeed(A0) ,у меня это 14 нога и она настроена на выход . Зто никак не влияет на работу ?
И второе -
while
(
true
) . Можете объяснить что это значит , как работает.
Ваш код в работе не проверял , смогу только завтра.
Уменя еще 2 вопроса по вашему коду.
Строка 29 randomSeed(A0) ,у меня это 14 нога и она настроена на выход . Зто никак не влияет на работу ?
И второе -
while
(
true
) . Можете объяснить что это значит , как работает.
Возьмите другую ногу, которая болтается в воздухе. Главное - чтобы в randomSeed прилетело более-менее случайное число. Тогда random() будет ходить разнообразней.
while (true) - бесконечный цикл. while работает пока условие выполняется, т.е. равно true.
Я тоже не проверял, но теоретически работать должно. Хотя я не особо понял, зачем вы завели кучу переменных, потом сослались на них в массиве...
Я тоже не проверял, но теоретически работать должно.
И снова здравствуйте !
Sadman41, по вашему коду - если randomSeed(A5); огонек всегда останавливается на l6,если randomSeed(A6) огонек всегда останавливается на l13 ,если randomSeed(A7) огонек всегда останавливается на l4.
Входы A5,A6,A7 висят в воздухе .
Ну... придется какой-то проводок ко входу приделать, чтобы лучше фонило ))
Можете просто в setup пустого скетча вставить randomSeed, и печать random(). Без randomSeed на каждом ребуте должно одно и то же печататься. С randomSeed(какой-то аналоговый выход) - разное. Подберите вход и проводок, чтобы разброс был по числам.
Ну... придется какой-то проводок ко входу приделать, чтобы лучше фонило ))
Можете просто в setup пустого скетча вставить randomSeed, и печать random(). Без randomSeed на каждом ребуте должно одно и то же печататься. С randomSeed(какой-то аналоговый выход) - разное. Подберите вход и проводок, чтобы разброс был по числам.
Запустил это
С randomSeed имеем это
Без него это
Все в точности как вы сказали . Никаких проводков не паял .
Как до ардуины доберусь - проверю свой скетч на терминальном выводе.
Ну, вобщем, проблемы две:
1) в randomSeed(A0) я почему-то забыл analogRead();
2) вызывать randomSeed с чтением аналогового пина после перевода его в OUTPUT (в массиве пины 14...17 - A0-A3) не слишком хорошая идея ;) Нужно делать это до данной процедуры - где-то прямо на 22-й строке.
После вышеуказанных исправлений всё бегает от нулевого элемента массива до случайного.
Ну, вобщем, проблемы две:
1) в randomSeed(A0) я почему-то забыл analogRead();
2) вызывать randomSeed с чтением аналогового пина после перевода его в OUTPUT (в массиве пины 14...17 - A0-A3) не слишком хорошая идея ;) Нужно делать это до данной процедуры - где-то прямо на 22-й строке.
После вышеуказанных исправлений всё бегает от нулевого элемента массива до случайного.
sadman41, еще раз благодарю за помощь.