Куб 2x2x3

Тема в разделе "Глядите, что я сделал", создана пользователем BAit, 13 фев 2014.

  1. BAit

    BAit Нерд

    Куб даже не куб а прямоугольник с шириной и длиной 2 LED, высота 3 LED.

    Исправленная версия:

    [​IMG]
    Ссылка на скетч и схему в Fritzing
    http://yadi.sk/d/UnpWqJlnHtpks

     
    Последнее редактирование: 14 фев 2014
    SerRay нравится это.
  2. NR55RU

    NR55RU Гик

    в функции eff3() уберите последнею строку loop() и зависать перестанет.
    Вы фактически создаете рекурсивный вызов, а рекурсия вещь настолько же хорошая насколько и опасная требующая четкого понимания где когда и как ее использовать.
    В данном случае вам не требуется вызывать loop() эта функция по умолчанию повторяется циклично.
     
    Megakoteyka нравится это.
  3. BAit

    BAit Нерд

    loop() для того чтобы вернуться в начало. Без неё функция loop выполняется один раз
    При зависании зависает на levl2 и led1, led3, led4
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Когда функция постоянно вызывает сама себя, происходит переполнение стека и разрушение памяти. Выше все верно сказано.
    var1, var2 и var3 сами себя не обнулят в начале очередного цикла.
    loop() вызывается постоянно, но циклы в effX не крутятся. Можете в этом убедиться, поместив в loop() вывод в последовательный порт какой-нибудь строки.
     
    BAit нравится это.
  5. NR55RU

    NR55RU Гик

    Да, Мегакотейка чуть внимательнее взглянул на ваш код чем я.
    Ваш код работает так:
    Выполняется первая функция которая в итоге устанавливает первую переменную в некоторое значение
    Выполняет вторая функция которая устанавливает вторую переменную в некоторое значение
    Выполняется третья функция которая устанавливает третью переменную в некоторое значение.
    В третей функции вызывается 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. Учитесь работать с передаваемыми значениями в функции ибо Дорога в ад программирования вымощена глобальными переменными :)
     
    BAit и Megakoteyka нравится это.
  6. BAit

    BAit Нерд

    Чесно говоря дальше 3 урока C# C++ не залезал
    Видео уроки смотрел до 3 части:oops:
     
  7. NR55RU

    NR55RU Гик

    Вот это как раз вы зря :)
    Вот список книг, там есть книга Программирование на С, отличнейшая книга для старта, скачайте или купите, как вам удобнее и читайте, поняв базу сможете легче двигаться дальше.
    Не хватайтесь вы за С++ сразу, там слишком много того что начинающему как кость в горле, изучите базу в виде С .. все остальное "положите" сверху и все будет шикарно :)
     
    BAit нравится это.
  8. BAit

    BAit Нерд

    Спасибо.
     
  9. BAit

    BAit Нерд

    Попробовал сделать как вы говорили не работает.
    Сделал по другому("Методом тыка")
    Код (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--;
    }
    }
     
    Работает