Бесконечный цикл.

Тема в разделе "Arduino & Shields", создана пользователем Lagvin, 24 фев 2015.

  1. Lagvin

    Lagvin Нерд

    Не получилось, посижу пару часов, может придумаю.
    #define BUTTON_PIN 2
    #define LED_PIN 10
    #define LEDD_PIN 13
    #define BLINK_DELAY1 500
    #define BLINK_DELAY2 50

    bool Button, Button_old;
    bool mer = false;

    void setup() {
    pinMode(BUTTON_PIN, INPUT_PULLUP);
    pinMode(LED_PIN, OUTPUT);
    pinMode(LEDD_PIN, OUTPUT);
    Button = !digitalRead(BUTTON_PIN);
    if (Button){
    while(Button==true){digitalWrite(LEDD_PIN, Button);// Где-то тут косяк.
    }
    }
    }


    void loop()
    {
    Button = !digitalRead(BUTTON_PIN); //считываем и нормализуем кнопку
    digitalWrite(LEDD_PIN, Button); //Если нажата кнопка, то светится светодиод LEDD
    // устанавливаем mer по изменению состояния клавиши
    if ((Button && !Button_old) || (!Button && Button_old)) mer = true;
    Button_old = Button;
    digitalWrite(LED_PIN, (((millis()/BLINK_DELAY1)%2) && mer && !Button) ||
    (((millis()/BLINK_DELAY2)%2) && mer && Button));
    }
     
  2. Lagvin

    Lagvin Нерд

    Нашел ошибку
    Код (Text):

     #define BUTTON_PIN 2
     #define LED_PIN 10
     #define LEDD_PIN 13
     #define BLINK_DELAY1 500
     #define BLINK_DELAY2 50

     bool Button, Button_old;
     bool mer = false;

     void setup() {
     pinMode(BUTTON_PIN, INPUT_PULLUP);
     pinMode(LED_PIN, OUTPUT);
     pinMode(LEDD_PIN, OUTPUT);
     Button = !digitalRead(BUTTON_PIN);
     if (Button){
     while(Button==true){digitalWrite(LEDD_PIN, Button);
     Button = !digitalRead(BUTTON_PIN);// нужно повторно считать данные
     }
     }
     }

     void loop()
     {
     Button = !digitalRead(BUTTON_PIN); //считываем и нормализуем кнопку
     digitalWrite(LEDD_PIN, Button); //Если нажата кнопка, то светится светодиод LEDD
     // устанавливаем mer по изменению состояния клавиши
     if ((Button && !Button_old) || (!Button && Button_old)) mer = true;
     Button_old = Button;
     digitalWrite(LED_PIN, (((millis()/BLINK_DELAY1)%2) && mer && !Button) ||
     (((millis()/BLINK_DELAY2)%2) && mer && Button));
     }

     
     
  3. Lagvin

    Lagvin Нерд

    Объясните пожалуйста какие значения присваиваются переменным в этом случаи
    bool Button, Button_old;
    Спасибо
     
    Последнее редактирование: 28 фев 2015
  4. X-Dron

    X-Dron Гик

    Не понял вопрос.
    Button это состояние клавиши в цикле loop, Button_old это состояние в предыдущий цикл выполнения.
    Условие Button && !Button_old это фронт нажатия клавиши, переход с 1 в 0,
    !Button && Button_old это фронт отпускания клавиши, переход с 0 в 1.
    Попробуй такой setup(), он покороче, без лишних условий и с правильной инициализацией Button_old для loop.
    Код (Text):
     void setup() {
      pinMode(BUTTON_PIN, INPUT_PULLUP);
      pinMode(LED_PIN, OUTPUT);
      pinMode(LEDD_PIN, OUTPUT);
      while(!digitalRead(BUTTON_PIN)) digitalWrite(LEDD_PIN, HIGH);
      Button_old = !digitalRead(BUTTON_PIN);
    }
     
  5. Lagvin

    Lagvin Нерд

    Всем спасибо, все получилось, тема закрыта.
    Код (Text):

     #define BUTTON_PIN 2
     #define LED_PIN 8
     #define LED1_PIN 13
     #define LED2_PIN 9
     #define BLINK_DELAY1 500
     #define BLINK_DELAY2 50
     #define BUZZER 7

     bool Button, Button_old;
     bool mer = false;

     void setup() {
     pinMode(BUTTON_PIN, INPUT_PULLUP);
     pinMode(LED_PIN, OUTPUT);
     pinMode(LED1_PIN, OUTPUT);
     pinMode(LED2_PIN, OUTPUT);
     pinMode(BUZZER, OUTPUT);
     Button = !digitalRead(BUTTON_PIN);
     if (Button){
     while(Button==true){
     digitalWrite(LED2_PIN, Button);
     int t=1;
     for (int a=0;a>-1;a=a+t){
     int f=a*400;
     tone (BUZZER,f,50);
     if (a==10)t=-1;
     delay (10);
     }
     Button = !digitalRead(BUTTON_PIN);
     }
     }
     digitalWrite(LED2_PIN, Button);
     noTone;
     delay (100);
    }

     void loop()
     {
     Button = !digitalRead(BUTTON_PIN);
     digitalWrite(LED1_PIN, Button);
     if ((Button && !Button_old) || (!Button && Button_old)) mer = true;
     Button_old = Button;
     digitalWrite(LED_PIN, (((millis()/BLINK_DELAY1)%2) && mer && !Button) ||
     (((millis()/BLINK_DELAY2)%2) && mer && Button));
     }