Ошибка в коде, написанном на сайте Амперки?

Тема в разделе "Arduino & Shields", создана пользователем Vasiliy Shuyskiy, 17 июл 2018.

  1. Всем привет! Возник такой вопрос:

    Вот ссылка на страницу
    http://wiki.amperka.ru/программирование:константы-переменные-арифметика

    Далее: Пульсирующий маячок.
    Код с сайта:

    Код (C++):
    #define LED_PIN  5
    int step = 0;
    int brightness = 0;
    int sign;
    void setup()
    {
        pinMode(LED_PIN, OUTPUT);
    }
    void loop()
    {
        analogWrite(LED_PIN, brightness);
        step++;
        sign = (step / 256) % 2;
        brightness = sign ? brightness + 1 : brightness - 1;
        delay(5);
    }
    Вроде все в порядке, но если прочитать статью, что я и сделал, то может возникнуть вопрос.

    В статье говорится, что для
    Код (C++):
    analogWrite();
    вторая переменная должна быть 0-255
    тогда зачем здесь:
    Код (C++):
    sign = (step / 256) % 2;
    стоит 256 ???

    Заранее спасибо за ответы:)
     
  2. Mitrandir

    Mitrandir Гуру

    Всю статью читали?
    Делит переменную степ на 256
    Т.е любое число от 0 до 255 даст 0 так как оперируем в целых числах.
    256/ 256 даст 1

    От 256 до 511 / 256 будет давать 1
    От 512 до 765 будет 2
    И тд
     
    arkadyf, Tomasina и Vasiliy Shuyskiy нравится это.
  3. Mitrandir

    Mitrandir Гуру

    Хитрый способ осчитывать интервалы в 256 шагов

    256 потому что в интервале 0-255 256 чисел
     
    arkadyf и Vasiliy Shuyskiy нравится это.
  4. ostrov

    ostrov Гуру

    Удобный так же оператор для отделения единиц, десятков, сотен и тд.
     
    arkadyf и Vasiliy Shuyskiy нравится это.
  5. parovoZZ

    parovoZZ Гуру

    Код явно для школоты. Ибо для МК сдвинуть на байт быстрее, чем делить.
     
    Vasiliy Shuyskiy нравится это.
  6. Mitrandir

    Mitrandir Гуру

    С такой задачей и с делением МК справится не напрягаясь.
     
    Vasiliy Shuyskiy нравится это.
  7. parovoZZ

    parovoZZ Гуру

    К хорошему надо прививать с децтва.
     
  8. Mitrandir

    Mitrandir Гуру

    Овероптимизация тоже не есть гуд.
    Статья явно для новичков, показывающая операторы
     
    Последнее редактирование: 18 июл 2018
    arkadyf нравится это.
  9. Atavizm

    Atavizm Нуб

    Добрый день.
    Только начал изучение Ардуинку и споткнулся на этом-же скетче, в начале поста.
    Помогите, пожалуйста разобраться:

    sign = (step / 256) % 2;
    brightness = sign ? brightness + 1 : brightness - 1;

    если переменная step принимает значение 0 - 255, то и sign принимает значение 0 , и тогда переменная brightness принимает значение brightness -1. И получается, параметр, задающий яркость светодиода принимает отрицательное значение?

    Спасибо за ответ
     
  10. Mitrandir

    Mitrandir Гуру




    конструкция brightness = sign ? brightness + 1 : brightness - 1;
    это то же самое что и

    Код (C++):

    if (  sign == 1 )
    {
        brightness = brightness +1;
    }
    else {
       brightness = brightness -1;
    }
    так что да ошибка есть.

    мы начинаем с sign = 0

    правильнее будет brightness = sign ? brightness 1 : brightness + 1;
     
  11. Atavizm

    Atavizm Нуб

    Огромное спасибо! А то мозг кипит уже)
     
  12. Atavizm

    Atavizm Нуб

    В кусочке кода :? brightness 1 : между brightness и 1 разве допустим пробел? Получается и переменная и единичка в воздухе "висят" без привязки
     
  13. Mitrandir

    Mitrandir Гуру

    Минус там должен быть
     
  14. Atavizm

    Atavizm Нуб

    Точно! Благодарю!