Цикл While не прекращается

Тема в разделе "Arduino & Shields", создана пользователем M0ln1a, 22 окт 2016.

  1. M0ln1a

    M0ln1a Гик

    Здравствуйте! Столкнулся с проблемой, цикл While бесконечен даже после выполнения условий.
    Вот код:
    Код (C++):
    #define BUTTON_PIN1  A0 // Кнопки на режим №1...
    #define BUTTON_PIN2  A1 // и режим №2
    #define Led1     8  // Светодиоды
    #define Led2     11 //

    boolean L1 = false;  // Сами режим №1
    boolean L2 = false;  // и №2

    boolean buttonIsUp1 = digitalRead(BUTTON_PIN1);
    boolean buttonIsUp2 = digitalRead(BUTTON_PIN2);

    void setup()
    {
      pinMode(Led1, OUTPUT);               // Вход/Выход
      pinMode(Led2, OUTPUT);               //
      pinMode(BUTTON_PIN1, INPUT_PULLUP);  //
      pinMode(BUTTON_PIN2, INPUT_PULLUP);  //
    }

    void loop()
    {
      buttonIsUp1 = digitalRead(BUTTON_PIN1); // Проверки на нажатие клавиш
      buttonIsUp2 = digitalRead(BUTTON_PIN2); //

      if (buttonIsUp1 = true) // Если кнопка №1 нажата...
      {
        delay(100);          // Включается "Антидребезг"
        L2 = false;          // Если Вы перешли с режима №2 на №1, №2 выключается
        L1 = !L1;            // Режим менят свой статус (ВКЛ/ВЫКЛ), при втором нажатие светодиоды выключаются
      }

      if (buttonIsUp2 = true) // По аналогии
      {
        delay(100);          //
        L1 = false;          //
        L2 = !L2;            //
      }

      while (L1 = true) // Режим №1
      {
        digitalWrite(Led2, LOW);  // 2 секунды один светодиод, 0.1 секунда второй
        digitalWrite(Led1, HIGH); //
        delay(2000);              //
        digitalWrite(Led1, LOW);  //
        digitalWrite(Led2, HIGH); //
        delay(100);               //
      }
      while (L2 = true) // Режим №2
      {
        digitalWrite(Led2, LOW);  // 5 секунд первый, 2 секунды - второй
        digitalWrite(Led1, HIGH); //
        delay(5000);              //
        digitalWrite(Led1, LOW);  //
        digitalWrite(Led2, HIGH); //
        delay(2000);              //
      }
    }
    За основу кода взят урок с "Амперка ВИКИ" : http://wiki.amperka.ru/конспект-arduino:кнопочный-переключатель

    Цель работы: Светодиоды должны мигать с паузой, продолжительность которой изменяется в связи с выбранным режимом (на ВИКИ предоставляется обычный светильник с положениями ВКЛ/ВЫКЛ)

    Что происходит: при включении устройства светодиоды начинают мигать, не дождавшись включения с кнопки, работает лишь один режим, его нельзя выключить или переключиться на режим №2

    Вид устройства:

    6ой цифровой пин -> кнопка "Тройка" №1
    7ой цифровой пин -> кнопка "Тройка" №2
    8ой цифр. пин -> резистор 220 Ом -> Светодиод №1 -> GND
    11ый цифр. пин -> резистор 220 Ом -> Светодиод №2 -> GND
    Плата - Arduino Due

    Заранее спасибо!
     
  2. rkit

    rkit Гуру

    "=" это присвоение
    а проверка на равенство это "=="
     
    M0ln1a нравится это.
  3. M0ln1a

    M0ln1a Гик

    Код (C++):
    if (buttonIsUp2 = true)
    А здесь так же ставить "=="?
     
  4. M0ln1a

    M0ln1a Гик

    Код (C++):
    if (buttonIsUp1 == true) // Если кнопка №1 нажата...
      {
        delay(100);          // Включается "Антидребезг"
        L2 = false;          // Если Вы перешли с режима №2 на №1, №2 выключается
        L1 = !L1;            // Режим менят свой статус (ВКЛ/ВЫКЛ), при втором нажатие светодиоды выключаются
      }

      if (buttonIsUp2 == true) // По аналогии
      {
        delay(100);          //
        L1 = false;          //
        L2 = !L2;            //
      }

      while (L1 == true) // Режим №1
      {
        digitalWrite(Led2, LOW);  // 2 секунды один светодиод, 0.1 секунда второй
        digitalWrite(Led1, HIGH); //
        delay(2000);              //
        digitalWrite(Led1, LOW);  //
        digitalWrite(Led2, HIGH); //
        delay(100);               //
      }
      while (L2 == true) // Режим №2
      {
        digitalWrite(Led2, LOW);  // 5 секунд первый, 2 секунды - второй
        digitalWrite(Led1, HIGH); //
        delay(5000);              //
        digitalWrite(Led1, LOW);  //
        digitalWrite(Led2, HIGH); //
        delay(2000);              //
      }
    Проблема осталась, изменился лишь режим, сначала первый "крутился", теперь второй...
     
  5. rkit

    rkit Гуру

    А где тут L1 изменяется, чтобы цикл прервался?
     
  6. M0ln1a

    M0ln1a Гик

    Код (C++):
    if (buttonIsUp1 = true) // Если кнопка №1 нажата...
      {
        delay(100);          // Включается "Антидребезг"
        L2 = false;          // Если Вы перешли с режима №2 на №1, №2 выключается
        L1 = !L1;            // Режим менят свой статус (ВКЛ/ВЫКЛ), при втором нажатие светодиоды выключаются
      }
    Здесь, по крайней мере я думаю, что он так изменяется
     
  7. rkit

    rkit Гуру

    Как программа. застрявшая во while-цикле, доберется до этого места?
     
  8. M0ln1a

    M0ln1a Гик

    Ладно, тогда как это можно исправить? Попытка вставить его в "if" ни к чему не привела
     
  9. rkit

    rkit Гуру

    Ну а какой смысл вставить его в if? Наоборот надо.
     
  10. M0ln1a

    M0ln1a Гик

    Спасибо
     
  11. ostrov

    ostrov Гуру

    Замените оба while на один if...else.
     
  12. fogary

    fogary Гик

    В догонку. Антидребизг работает не так. Внимательнее изучите пример из урока.