логические задачи на ардуино

Тема в разделе "Arduino & Shields", создана пользователем Nikita, 3 окт 2013.

  1. Nikita

    Nikita Гик

    как составлять как составлять логические задачи на ардуино?
     
  2. Megakoteyka

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

    Вы о чем? Какого рода задачи? Распишите подробней.
     
  3. Nikita

    Nikita Гик

    Например если при увеличении яркости дошло до конца, а потом начать уменьшать яркость, то просто после функции увеличения яркости (прибавлял по 51) , начинай вычитать по 51 и проверем дошло ли до 0-ля.
     
  4. Megakoteyka

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

    Код (Text):
    int sign = 1;
    int value = 0;

    void loop()
    {
        // если случилось событие
        if(some_event)
        {
            // прибавить к переменной нечто, умноженное на знак.
            // (если знак == -1, то вычтем нечто)
            value += 10 * sign;
            // если дошли до границ диапазона - меняем знак на противоположный
            if(value >= 100 || value <= 0)
                sign = sign * -1;
        }
    }
    Будет бегать от 0 до 100 туда и обратно. Вы это имели ввиду?
     
  5. Megakoteyka

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

    Нужно всего лишь изложить задачу максимально формализованно, после этого слова довольно легко переводятся в код.
     
  6. Nikita

    Nikita Гик

    Код (Text):
    void loop()
    {

      // Управление красным цветом светодиода.
      currentbuttonR = debounceR(lastbuttonR);            // проферяеям при помощи функции debounceR состояние кнопки.
      if (lastbuttonR == LOW && currentbuttonR == HIGH )  // Если предыдущее значение было ноль, а текущее единица.
      {
        ledonR = ledonR + 51 ;                            // Тогда увеличиваем яркость светодиода на 51
        if ( ledonR > 255) ledonR = 0 ;    // Если значении становится больше 255, то гасим светодиод
      }
      lastbuttonR = currentbuttonR;                      // Запоминамем текущее состояние кнопки
      analogWrite(pinR, ledonR);                          // Передаем измененное значение яркости на вывод Ардуино.
     

    }
     
  7. Nikita

    Nikita Гик

    типо того
     
  8. Megakoteyka

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

    Код (Text):
    int sign = 1;
    void loop()
    {
      currentbuttonR = debounceR(lastbuttonR);кнопки.
      if (lastbuttonR == LOW && currentbuttonR == HIGH )
      {
        ledonR = ledonR + 51 * sign;
        if (ledonR >= 255 || ledonR <= 0)
          sign *= -1;
      }
      lastbuttonR = currentbuttonR;
      analogWrite(pinR, ledonR);
    }
    Так правильно работает?
     
  9. Nikita

    Nikita Гик

    да спасибо!
     
  10. Nikita

    Nikita Гик

    а если управлять яркостью одним светодиодом с двух кнопок получается так?



    Код (Text):
    /Объявляем переменные.

    int pinR = 11;    // RED    Контакты для управления цветами светодиода
    int pin13 = 13;  // Для управления контактом 13, чтоб погасить светодиод на плате.

    int buttonR = A1; // Для считывания значений с кнопок.
    int buttonB = A5;

    // Этот раздел переменных используется для корректного получения значений с кнопок.
    // RED
    boolean lastbuttonR = LOW;    // последнее значение кнопки
    boolean currentbuttonR = LOW; // текущее значение кнопки
    int ledonR = 0;              // яркость светодиода


    // RED
    boolean lastbuttonB = LOW;
    boolean currentbuttonB = LOW;
    int ledonB = 0;


    // Функция Setup выполняется Ардуино только один раз при включении.
    // данная функция используется для установки параметров микроконтрллера.
    void setup()
    {
      //pinMode установка параметров контактов I/O
      // OUTPUT - выход.
      // INPUT - вход.
      pinMode(pin13, OUTPUT);
      pinMode(pinR, OUTPUT);
      pinMode(buttonR, INPUT);
      pinMode(buttonB, INPUT);

      digitalWrite(pin13, LOW); // установка 13 контакта в 0. Светодиод на 13 контакте гаснет. По-умолчанию он горит.
    }

    // Булевая функция для определения состояний кнопок.
    // Кнопка прибавления яркости
    boolean debounceR(boolean last) // Переменная last принимает значение, переданное функции
    {
      boolean current = digitalRead(buttonR); // Объявляем переменную current и считываем в нее значение кнопки
      if (last != current)                    // Если текущее значение кнопки отличается от переданной в функцию ( != - не равно )
      {
        delay(5);                            // тогда ждем 5 милисекунд. Это необходимо чтоб избавиться от колебаний напряжения поступающих с кнопки и получить точное значение.
        current = digitalRead(buttonR);      // повторно считвыаем значение с кнопки. Уже без шумов.
      }
      return current;                        // Возвращаем значение полученное логическое значение.
                                            // last и current доступны только в пределах данной функции.
    }

    // Кнопка уменьшения яркости
    boolean debounceB(boolean last)
    {
      boolean current = digitalRead(buttonB);
      if (last != current)
      {
        delay(5);
        current = digitalRead(buttonB);
      }
      return current;
    }

    // Бесконечный цикл, повоторяющийся на микроконтроллере, пока он включен.
    void loop()
    {

      // прибавления яркости светодиода.
      currentbuttonR = debounceR(lastbuttonR);            // проферяеям при помощи функции debounceR состояние кнопки.
      if (lastbuttonR == LOW && currentbuttonR == HIGH )  // Если предыдущее значение было ноль, а текущее единица.
      {
        ledonR = ledonR + 51 ;                            // Тогда увеличиваем яркость светодиода на 51
        if ( ledonR > 255) ledonR=255;                    
      }
      lastbuttonR = currentbuttonR;                      // Запоминамем текущее состояние кнопки
      analogWrite(pinR, ledonR);                          // Передаем измененное значение яркости на вывод Ардуино.

    //уменьшение яркост светодиода.
    currentbuttonB = debounceB(lastbuttonB);
      if (lastbuttonB == LOW && currentbuttonB == HIGH )
      {
        ledonB = ledonB - 51 ;
        if ( ledonB > 255) ledonB=0;
      }
      lastbuttonB = currentbuttonB;
      analogWrite(pinR, ledonR);



    }
     
     
    Последнее редактирование: 3 окт 2013