Эксперимент 9. Задание №2

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

  1. Oleg_duino

    Oleg_duino Нерд

    Помогите, пожалуйста! С 2-м заданием: перепишите программу без использования инструкции continue.
    Дана программа:
    #define MOTOR_PIN 9
    #define FIRST_BUTTON_PIN 5
    #define BUTTON_COUNT 3
    #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);
    }
    }

    Первым делом, мне как новичку, пришла мысль расписать действие на поступление сигнала для каждой кнопки, например:

    Для второй кнопки:
    if (digitalRead(6))
    analogWrite(MOTOR_PIN, 127);

    Для третей кнопки:
    if (digitalRead(7))
    analogWrite(MOTOR_PIN, 255); и т.д

    Но я считаю, что это громоздко! И наверное не праильно, не этого хотят от меня авторы. Читал вот эту тему:
    http://forum.amperka.ru/threads/Эксперимент-9.4437/#post-35200

    Поэтому же и вопросу, так и не понял, что там хотели сказать. Что значит глобальные переменные? И с использованием их нужно решать это задание, или есть решение которое не выходит за рамки программиста-новичка дошедшего до 9 эксперимента?Программист я очень начинающий, поэтому прошу не судить строго!
     
  2. Unixon

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

    Изучайте C++. http://forum.amperka.ru/threads/Книги-для-начинающих.2344/

    Глобальные переменные объявляются вне функций и доступны в любом месте программы, каждый блок от "{" до "}" создает новую область видимости, внутри которой переменные недоступны коду снаружи, т.е. они существуют только между "{" и "}". Блоки могут быть вложенными, соответственно и области видимости переменных.

    Вам намекают на использование if () { ... } else {... } вместо continue;
     
  3. Oleg_duino

    Oleg_duino Нерд

    Ух, еле-еле разобрался! Оказывается меня сбивало с толку функция INPUT_PULLUP! Посему на выходе пинов кнопок весит постоянный HIGH, я то думал наоборот мы HIGH подаём с кнопки(хотя и по схеме подключения можно было догадаться!!!). Поэтому всё очень просто организовываем счётчик, организовываем проверку " равен ли сигнал "LOW" на каком-нибудь пине кнопок". Если да, считаем скорость, согласно номеру кнопки, включаем моторчик с этой скоростью. Даже конструкция "else{}" - тут не нужна, только " if{}".
    Код выглядит так(кому-нибудь на будушее!):

    void loop()
    {
    for (int i = 0; i < BUTTON_COUNT; ++i)
    {
    if (digitalRead(i + FIRST_BUTTON_PIN) == LOW)
    {
    int speed = i * SPEED_STEP;
    analogWrite(MOTOR_PIN, speed);

    И не каких глобальных переменных здесь не надо. Зациклился на них и упустил главное!!!

    Спасибо Unixon, за совет - будем изучать!!!
     
    acos нравится это.