Куб даже не куб а прямоугольник с шириной и длиной 2 LED, высота 3 LED. Исправленная версия: Ссылка на скетч и схему в Fritzing http://yadi.sk/d/UnpWqJlnHtpks
в функции eff3() уберите последнею строку loop() и зависать перестанет. Вы фактически создаете рекурсивный вызов, а рекурсия вещь настолько же хорошая насколько и опасная требующая четкого понимания где когда и как ее использовать. В данном случае вам не требуется вызывать loop() эта функция по умолчанию повторяется циклично.
loop() для того чтобы вернуться в начало. Без неё функция loop выполняется один раз При зависании зависает на levl2 и led1, led3, led4
Когда функция постоянно вызывает сама себя, происходит переполнение стека и разрушение памяти. Выше все верно сказано. var1, var2 и var3 сами себя не обнулят в начале очередного цикла. loop() вызывается постоянно, но циклы в effX не крутятся. Можете в этом убедиться, поместив в loop() вывод в последовательный порт какой-нибудь строки.
Да, Мегакотейка чуть внимательнее взглянул на ваш код чем я. Ваш код работает так: Выполняется первая функция которая в итоге устанавливает первую переменную в некоторое значение Выполняет вторая функция которая устанавливает вторую переменную в некоторое значение Выполняется третья функция которая устанавливает третью переменную в некоторое значение. В третей функции вызывается loop() * Выполняется первая функция но переменная один уже имеет большое значение и условие не выполняется цикл не срабатывает. Во второй функции та же беда В третьей так же И снова из функции вызывается loop и круг повторяется с места помеченного звездочкой. Но так как вы вызываете looop из функции которая УЖЕ вызвана из loop вы получаете рекурсивный вывоз, который в итоге переполнит стек и даже работай ваши циклы верно, программа бы очень быстро начала "глючить". Что бы решить вопрос ваших переменных не прибегая к кучи всяких ненужных и не красивых обнулений можете сделать более правильнее например вот так: Код (Text): void loop() { rN = random(25); eff1(rN); clear(); eff2(rN); clear(); eff3(rN); clear(); } void eff1(int inputValue) { while(inputValue > 0) { ... ... ... inputValue--; } } Вы передаете так в каждую функцию ваше рандомное значение, в функции передаются КОПИИ этих значений, то есть внутри функции мы его можем менять не опасаясь того что изменится исходное значение сгенерированное в функции loop. Это позволяет избавится от ваших var1,var2,var3 они больше не нужны вовсе, плюс отпадает необходимость что то там обнулять. Так же функцию clear() я убрал в loop так нагляднее "читается" общий алгоритм работы вашей программы. Так же в функции clear() у вас есть две такие строки digitalWrite(led3, LOW); digitalWrite(led3, LOW); Судя по всему тут у вас недочет, видимо вторая строка должна была иметь значение led4, к вопросу зависания это отношения не имеет но так просто на глаза попалось P.s. Учитесь работать с передаваемыми значениями в функции ибо Дорога в ад программирования вымощена глобальными переменными
Вот это как раз вы зря Вот список книг, там есть книга Программирование на С, отличнейшая книга для старта, скачайте или купите, как вам удобнее и читайте, поняв базу сможете легче двигаться дальше. Не хватайтесь вы за С++ сразу, там слишком много того что начинающему как кость в горле, изучите базу в виде С .. все остальное "положите" сверху и все будет шикарно
Попробовал сделать как вы говорили не работает. Сделал по другому("Методом тыка") Код (Text): int levl1 = 2; int levl2 = 3; int levl3 = 4; int led1 = 6; int led2 = 7; int led3 = 8; int led4 = 9; long rN; void setup(){ } void loop(){ rN = random(25); eff1(rN); clear(); eff2(rN); clear(); eff3(rN); clear(); } void clear(){ digitalWrite(levl1, LOW); digitalWrite(levl2, LOW); digitalWrite(levl3, LOW); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); } void eff1(int rN) { while(rN > 0) { clear(); digitalWrite(levl1, HIGH); digitalWrite(led4, HIGH); digitalWrite(led3, HIGH); digitalWrite(led2, HIGH); digitalWrite(led1, HIGH); delay(100); digitalWrite(levl1, LOW); digitalWrite(levl2, HIGH); digitalWrite(led4, HIGH); digitalWrite(led3, HIGH); digitalWrite(led2, HIGH); digitalWrite(led1, HIGH); delay(100); digitalWrite(levl2, LOW); digitalWrite(levl3, HIGH); digitalWrite(led4, HIGH); digitalWrite(led3, HIGH); digitalWrite(led2, HIGH); digitalWrite(led1, HIGH); delay(100); rN--; } } void eff2(int rN) { while(rN > 0){ clear(); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(levl1, HIGH); delay(100); digitalWrite(levl1, LOW); digitalWrite(levl2, HIGH); delay(100); digitalWrite(levl2, LOW); digitalWrite(levl3, HIGH); delay(100); digitalWrite(led1, LOW); digitalWrite(led2, LOW); delay(100); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); delay(100); digitalWrite(levl3, LOW); digitalWrite(levl2, HIGH); delay(100); digitalWrite(levl2, LOW); digitalWrite(levl1, HIGH); delay(100); digitalWrite(levl1, LOW); rN--; } } void eff3(int rN) { while(rN > 0) { clear(); digitalWrite(levl1, HIGH); digitalWrite(levl2, HIGH); digitalWrite(levl3, HIGH); digitalWrite(led1, HIGH); delay(100); digitalWrite(led1, LOW); digitalWrite(led2, HIGH); delay(100); digitalWrite(led2, LOW); digitalWrite(led3, HIGH); delay(100); digitalWrite(led3, LOW); digitalWrite(led4, HIGH); delay(100); digitalWrite(led4, LOW); rN--; } } Работает