Во время выполнения дополнительных заданий в эксперименте 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); } }
К сожалению, авторы статей не совсем понимают новичков и коды пишут уже на более проф. уровне, используют конструкции, до которых ещё очень многие не дошли и вряд ли вообще дойдут. Пояснения да, классно написаны. На мой взгляд, код для начинающего должен быть как в примере IDE Blink - всё просто и понятно. Кто хочет расти, тот и будет расти, а для кого только хобби - он заморачиваться и не будет.
кажется с первым вопросом стало понятно, у нас из-за INPUT_PULLUP в объявлении кнопки, возвращается HIGH а не LOW (т.е. когда кнопка отпущена, то у нас HIGH)
Я уже разобрался сам с проблемой, забыл отписать. Конечно, дело каждого отвечать как угодно в теме, но все же если не хочется помогать, то лучше пройти мимо. Все в чем-то были новичками, да кто-то бросает, кто-то добивается много. P.S. Моя проблема была в том, что я не знал как правильно обозначить глобальные переменные, которые бы менялись потом в цикле (есть опыт только на питоне), сейчас, когда разобрался, стало понятно в чем ошибка.
Я хотя и не программист, а в принципе чайник, но убеждён, что сразу давать полный ответ на любой вопрос новичка не правильно. Направить, подсказать - да. Пусть растёт и развивается. Сам перед тем как задать вопрос, сначала пороюсь и покавыряюсь, только потом за помощью. А то что разобрался с глобальными переменными - это гуд.
Очень много нюансов. И тем более, если речь идет о разделе, с гордым названием Вики. Иногда это просто прикалывает. Вот возьмем "игрушку", с названием "Аудиоинформер скорости ветра". Сначала цена развлечения (по сайту Амперки): Анемометр 4990 Arduino Uno 1790 MP3-плеер 890 Breadboard Half 290 Клеммник нажимной х 3 90 Соединительные провода 290 Батарейка Крона 190 Кабель питания от батарейки Крона 90 Резисторы 30 microSD объемом ≤32 ГБ (прибл.) 1000 Динамик или колонка ??? Итого: 9650 ... (тут меня как то за дорогой проект ругали... )... Ок, наверно Амперке виднее, и такие "игрушки" разлетаются как горячие пирожки - не зря же на съемку видео и описание этой приблуды тратили рабочее время и немного денег. Я не попадаю в число вышеуказанных игроков и приобрел анемометр по прямому назначению - измерять скорость ветра в цифрах. Конечно, обратился к источнику за помощью в решении своей, как покупателя, проблемы (а она заключается в том, стоит ли, например, усреднять показания анемометра, на каком интервале, считать средне значение или еще как-то). И что за чудо-код я увидел? А вот он, без всяких пояснений там на сайте: Код (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 тысяч за то, чтобы разбираться в этой "прелести". З.Ы. Я ничуть не хаю этот код и преклоняюсь перед мастерством автора. ... как и мастерством того доктора, что гланды вырезал.