Эксперимент 9

Тема в разделе "Флудилка", создана пользователем AntonEryomin, 14 фев 2015.

  1. AntonEryomin

    AntonEryomin Нуб

    Во время выполнения дополнительных заданий в эксперименте 9 возникло 2 вопроса:

    1) Почему такой блок
    if (digitalRead(i + FIRST_BUTTON_PIN))
    continue;
    не вызывает обратного действия? Т.е. если к нас кнопка отпущена (т.е. digitalRead вернет нам LOW), то получается что мы как бы пропускаем блок if, так как он не срабатывает и идем на создание переменной
    int speed = i * SPEED_STEP;
    analogWrite(MOTOR_PIN, speed);
    ну и собственно выводом напряжения на моторчик. Поясните почем этого не происходит, а код таки работает верно.

    2) Как же все-таки переписать этот код, без использования continue?


    #define MOTOR_PIN 9
    #define FIRST_BUTTON_PIN 5
    #define BUTTON_COUNT 4
    #define SPEED_STEP (255 / (BUTTON_COUNT - 1))

    void setup()
    {
    pinMode(MOTOR_PIN, OUTPUT);
    for (int i = 0; i < BUTTON_COUNT; ++i)
    pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
    }

    void loop()
    {
    for (int i = 0; i < BUTTON_COUNT; ++i) {
    if (digitalRead(i + FIRST_BUTTON_PIN))
    continue;

    int speed = i * SPEED_STEP;

    analogWrite(MOTOR_PIN, speed);
    }
    }
     
  2. vvr

    vvr Инженерище

    К сожалению, авторы статей не совсем понимают новичков и коды пишут уже на более проф. уровне, используют конструкции, до которых ещё очень многие не дошли и вряд ли вообще дойдут.
    Пояснения да, классно написаны.
    На мой взгляд, код для начинающего должен быть как в примере IDE Blink - всё просто и понятно.
    Кто хочет расти, тот и будет расти, а для кого только хобби - он заморачиваться и не будет.
     
    ИгорьК нравится это.
  3. AntonEryomin

    AntonEryomin Нуб

    кажется с первым вопросом стало понятно, у нас из-за INPUT_PULLUP в объявлении кнопки, возвращается HIGH а не LOW (т.е. когда кнопка отпущена, то у нас HIGH)
     
  4. ИгорьК

    ИгорьК Давно здесь

    ... чем, в некотором смысле, дискердитируют идею Ардуино...
     
  5. vvr

    vvr Инженерище

  6. AntonEryomin

    AntonEryomin Нуб

    Я уже разобрался сам с проблемой, забыл отписать. Конечно, дело каждого отвечать как угодно в теме, но все же если не хочется помогать, то лучше пройти мимо. Все в чем-то были новичками, да кто-то бросает, кто-то добивается много.

    P.S. Моя проблема была в том, что я не знал как правильно обозначить глобальные переменные, которые бы менялись потом в цикле (есть опыт только на питоне), сейчас, когда разобрался, стало понятно в чем ошибка.
     
  7. vvr

    vvr Инженерище

    Я хотя и не программист, а в принципе чайник:), но убеждён, что сразу давать полный ответ на любой вопрос новичка не правильно. Направить, подсказать - да. Пусть растёт и развивается. Сам перед тем как задать вопрос, сначала пороюсь и покавыряюсь, только потом за помощью.
    А то что разобрался с глобальными переменными - это гуд.
     
  8. ИгорьК

    ИгорьК Давно здесь

    Очень много нюансов. И тем более, если речь идет о разделе, с гордым названием Вики.
    Иногда это просто прикалывает. Вот возьмем "игрушку", с названием "Аудиоинформер скорости ветра".
    Сначала цена развлечения (по сайту Амперки):

    Анемометр 4990
    Arduino Uno 1790
    MP3-плеер 890
    Breadboard Half 290
    Клеммник нажимной х 3 90
    Соединительные провода 290
    Батарейка Крона 190
    Кабель питания от батарейки Крона 90
    Резисторы 30
    microSD объемом ≤32 ГБ (прибл.) 1000
    Динамик или колонка ???
    Итого: 9650

    ... (тут меня как то за дорогой проект ругали... :eek:)...
    Ок, наверно Амперке виднее, и такие "игрушки" разлетаются как горячие пирожки - не зря же на съемку видео и описание этой приблуды тратили рабочее время и немного денег.
    Я не попадаю в число вышеуказанных игроков и приобрел анемометр по прямому назначению - измерять скорость ветра в цифрах. Конечно, обратился к источнику за помощью в решении своей, как покупателя, проблемы (а она заключается в том, стоит ли, например, усреднять показания анемометра, на каком интервале, считать средне значение или еще как-то). И что за чудо-код я увидел? А вот он, без всяких пояснений там на сайте:
    Код (C):
    speed = measureSpeed();
        if (abs(speed-prev_speed) > 40 && speed/40 != prev_speed/40) {
            speed_change_counter = 0;
            speed_changed = true;
            prev_speed = speed;
        }
        else {
            if(speed_changed) {
                if(++speed_change_counter == 10) {
                    speed_changed = false;
                    saySpeed();
                }
            }
        }
    Вы считаете этот код для покупателя анемометра?
    В общем, хотелось бы, чтобы ребята не только Страуструпа и Шилда почитывали, но и Котлера иногда.
    Похоже, у авторов сложилось впечатление, что люди желают платить 9,5 тысяч за то, чтобы разбираться в этой "прелести".
    З.Ы. Я ничуть не хаю этот код и преклоняюсь перед мастерством автора. ... как и мастерством того доктора, что гланды вырезал.
     
    Последнее редактирование: 17 фев 2015
    vvr нравится это.