Как завершить процесс при нажатии кнопки

Тема в разделе "Arduino & Shields", создана пользователем Antoha96, 9 май 2016.

  1. Benny_Ray

    Benny_Ray Нерд

    Покажите свой скетч еще раз, такое подозрение что Вы взяли пример и неправильно его применили.
     
    Antoha96 нравится это.
  2. Antoha96

    Antoha96 Нуб

    Код (C++):
    #define MOTOR_PIN     9  //кулер
    #define FIRST_BUTTON  4    //                  \  мотор работает в полную силу
    #define SECOND_BUTTON 6  //  КНОПКИ С РЕЖИМАМИ > мотор работает в пол силы
    #define THERD_BUTTON  7  //                    /  мотор не работает
    #define CLEVER_BUTTON 3  // умный режим > мотор работает взависимости от термометра
    #define TEMP_PIN      A1  // термометр
    enum {STOP, FULL, HALF, CLEVER} Mode; // возможные режимы работы
    float temp;

    void setup()
    {
      pinMode(MOTOR_PIN, OUTPUT);
      pinMode(FIRST_BUTTON, INPUT_PULLUP);
      pinMode(SECOND_BUTTON, INPUT_PULLUP);
      pinMode(THERD_BUTTON, INPUT_PULLUP);
      Serial.begin(9600);
    }

    void loop()
    {
      readButtons();      // функция-обработчик кнопок
      getTemperature();  // функция чтения температуры
      stateManager();     // обработчик текущего режима работы
    }


    void readButtons()
    {
      if (!digitalRead(FIRST_BUTTON)) Mode = FULL;
      else if (!digitalRead(SECOND_BUTTON)) Mode = HALF;
      else if (!digitalRead(THERD_BUTTON)) Mode = STOP;
      else if (!digitalRead(CLEVER_BUTTON)) Mode = CLEVER;
    }

    void getTemperature()
    {
      static unsigned long timeStamp = 0;
      if (millis() - timeStamp > 1000)
      {
        temp = analogRead(TEMP_PIN);
        temp = temp * 0.48828125;
        Serial.print("TEMPRATURE = ");
        Serial.print(temp);
        Serial.print("*C");
        Serial.println();
        timeStamp = millis();
      }
    }

    void stateManager()
    {
      switch (Mode)       // смотрим какой сейчас режим работы и переходим на нужную ветку
      {
        case STOP:
          analogWrite(MOTOR_PIN, 0);
          break;

        case FULL:
          analogWrite(MOTOR_PIN, 255);
          break;

        case HALF:
          analogWrite(MOTOR_PIN, 127);
          break;

        case CLEVER:
          {
            if (temp > 30) analogWrite(MOTOR_PIN, 255);
            else if (temp < 25) analogWrite(MOTOR_PIN, 0);
          }
          break;
      }
    }
     
  3. Antoha96

    Antoha96 Нуб

    Ура! Я понял в чём беда. Забыл прописать в setup умную кнопку что в своём первом скетче так же когда мне помогли... Из за этого она работала в постоянном режиме. Вот какой получился скетч
    Код (C++):
    #define MOTOR_PIN     9  //кулер
    #define FIRST_BUTTON  4    //                  \  мотор работает в полную силу
    #define SECOND_BUTTON 6  //  КНОПКИ С РЕЖИМАМИ > мотор работает в пол силы
    #define THERD_BUTTON  7  //                    /  мотор не работает
    #define CLEVER_BUTTON 3  // умный режим > мотор работает взависимости от термометра
    #define TEMP_PIN      A1  // термометр
    enum {STOP, FULL, HALF, CLEVER} Mode; // возможные режимы работы
    float temp;

    void setup()
    {
      pinMode(MOTOR_PIN, OUTPUT);
      pinMode(FIRST_BUTTON, INPUT_PULLUP);
      pinMode(SECOND_BUTTON, INPUT_PULLUP);
      pinMode(THERD_BUTTON, INPUT_PULLUP);
      pinMode(CLEVER_BUTTON, INPUT_PULLUP);
      Serial.begin(9600);
    }

    void loop()
    {
      readButtons();      // функция-обработчик кнопок
      getTemperature();  // функция чтения температуры
      stateManager();     // обработчик текущего режима работы
    }


    void readButtons()
    {
      if (!digitalRead(FIRST_BUTTON)) Mode = FULL;
      else if (!digitalRead(SECOND_BUTTON)) Mode = HALF;
      else if (!digitalRead(THERD_BUTTON)) Mode = STOP;
      else if (!digitalRead(CLEVER_BUTTON)) Mode = CLEVER;
    }

    void getTemperature()
    {
      static unsigned long timeStamp = 0;
      if (millis() - timeStamp > 1000)
      {
        temp = analogRead(TEMP_PIN);
        temp = temp * 0.48828125;
        Serial.print("TEMPRATURE = ");
        Serial.print(temp);
        Serial.print("*C");
        Serial.println();
        timeStamp = millis();
      }
    }

    void stateManager()
    {
      switch (Mode)       // смотрим какой сейчас режим работы и переходим на нужную ветку
      {
        case STOP:
          analogWrite(MOTOR_PIN, 0);
          break;

        case FULL:
          analogWrite(MOTOR_PIN, 255);
          break;

        case HALF:
          analogWrite(MOTOR_PIN, 127);
          break;

        case CLEVER:
          {
            if (temp > 30) analogWrite(MOTOR_PIN, 255);
            else if (temp < 25) analogWrite(MOTOR_PIN, 0);
          }
          break;
      }
    }
    Всем спасибо за помощь)
     
  4. andrzej_net

    andrzej_net Нуб

    Добрый день
    Скажите как прервать выполение в цикле по нажатию кнопки.
    Код (C++):
    void mode_8_loop() {
      Serial.println("leds_88");  // Для отладки
      // Змінні для Режима-8;
      byte red = 0;
      byte green = 0;
      byte blue = 255;
      int pixel_size = 20;

      //bool buttonPressed=0;

      //while (buttonPressed==0) {

      for(int i = 0; i < max_led - pixel_size - 2; i++) {
        for(int i = 0; i < max_led; i++ ) {
          pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        }
       
        pixels.setPixelColor(i, pixels.Color(red, green, blue));
        pixels.show();

        for(int k = 1; k <= pixel_size; k++) {
          pixels.setPixelColor(i+k, pixels.Color(red, green, blue));
        }
       
        pixels.setPixelColor(i + pixel_size + 1, pixels.Color(red, green, blue));
        pixels.show();
        delay(1);
      }

      for(int i = max_led - pixel_size - 2; i > 0; i--) {
        for(int i = 0; i < max_led; i++ ) {
          pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        }
       
        pixels.setPixelColor(i, pixels.Color(red, green, blue));
        pixels.show();

        for(int k = 1; k <= pixel_size; k++) {
          pixels.setPixelColor(i+k, pixels.Color(red, green, blue));
        }
         
          pixels.setPixelColor(i + pixel_size + 1, pixels.Color(red, green, blue));
          pixels.show();
          delay(1);
        }
    //if(key_pin==1) buttonPressed=1;

      //}
    }
     
  5. DetSimen

    DetSimen Guest

    Tomasina нравится это.
  6. andrzej_net

    andrzej_net Нуб

    Извините, неправильно поставлен был вопрос,
    как прервать выполение подпрограммы по нажатию кнопки.
     
  7. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):

    boolean checkButton(byte pin)
    {
      boolean state = digitalRead(pin);  // если кнопка подключена через INPUT_PULLUP, то return !digitalRead(pin);
      return state;
    }

    void mode_8_loop()
    {
      Serial.println("leds_88");  // Для отладки
      // Змінні для Режима-8;
      const byte red = 0;
      const byte green = 0;
      const byte blue = 255;
      const int pixel_size = 20;

      for (int i = 0; i < max_led - pixel_size - 2; i++)
      {
        for (int i = 0; i < max_led; i++ )
        {
          pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        }

        pixels.setPixelColor(i, pixels.Color(red, green, blue));
        if (!checkButton(BUTTON_PIN)) pixels.show();
        else return;
       
        for (int k = 1; k <= pixel_size; k++)
        {
          pixels.setPixelColor(i + k, pixels.Color(red, green, blue));
        }

        pixels.setPixelColor(i + pixel_size + 1, pixels.Color(red, green, blue));
        if (!checkButton(BUTTON_PIN)) pixels.show();
        else return;
        delay(1);
      }


      for (int i = max_led - pixel_size - 2; i > 0; i--)
      {
        for (int i = 0; i < max_led; i++ )
        {
          pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        }

        pixels.setPixelColor(i, pixels.Color(red, green, blue));
        if (!checkButton(BUTTON_PIN) pixels.show();
            else return;

              for (int k = 1; k <= pixel_size; k++)
          {
            pixels.setPixelColor(i + k, pixels.Color(red, green, blue));
            }

        pixels.setPixelColor(i + pixel_size + 1, pixels.Color(red, green, blue));
        {
          if (!checkButton(BUTTON_PIN)) pixels.show();
          else return;
          delay(1);
        }
      }
    }
     
  8. DetSimen

    DetSimen Guest

    лишнее поудалять, останется return digitalRead(pin);
     
  9. Tomasina

    Tomasina Сушитель лампочек Модератор

    избыточно сделано умышленно, для наглядности процессов.
     
  10. DetSimen

    DetSimen Guest

    ну прашу пращенья, что не по делу влез.
     
  11. andrzej_net

    andrzej_net Нуб

    При нажатии на кнопку - возвращается на начало подпрогрвммы mode_8_loop
     
  12. Tomasina

    Tomasina Сушитель лампочек Модератор

    а исходно и не было указано что должна останавливаться, было только про выход из подпрограммы, это условие выполняется, и программа входит в следующую подпрограмму, а, так как кнопка все еще нажата (по меркам процессора это долгий процесс), то вылетает и из этой и т.д.
     
    Последнее редактирование: 6 июн 2017
  13. andrzej_net

    andrzej_net Нуб

    Есть код, см. ниже (сбброшу весь код, для наглядности). Множество эфектов на RGB ленте, по нажатию кнопки включается слежующий эфект.
    Работают все, кроме эфета-8, не выходи по нажатию кнопки.
     

    Вложения:

  14. Tomasina

    Tomasina Сушитель лампочек Модератор

    там кнопка сделана через одно место класс Cl_Btn, я даже влезать в это не стану :cool:
     
  15. andrzej_net

    andrzej_net Нуб

    Взял готовый пример. То может подкажете вы как сделать
     
  16. andrzej_net

    andrzej_net Нуб

    Я не профи, я только начал работать с ардуино