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

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

  1. 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  // термометр

    boolean cancel;

    void setup() {  // задаём пины
      pinMode(MOTOR_PIN, OUTPUT);

      pinMode(FIRST_BUTTON, INPUT_PULLUP);
      pinMode(SECOND_BUTTON, INPUT_PULLUP);
      pinMode(THERD_BUTTON, INPUT_PULLUP);
    }

    void loop() {

      Serial.begin(9600);
     
      firstB();  //вызов первой кнопки


      // место для кнопок 2, 3


      cleverB();  //вызов умного режима
    }

    void firstB() {  //избавляемся от дребезга и задаём параметры первой кнопки
      boolean buttonWasUp = true;
      boolean buttonIsUp = digitalRead(FIRST_BUTTON);
      if (buttonWasUp && !buttonIsUp) {
        delay(10);
        buttonIsUp = digitalRead(FIRST_BUTTON);
       
        val = false;  // пытаюсь выключить "умную" кнопку
       
        if (!buttonIsUp) {
          analogWrite(MOTOR_PIN, 255);  //мотор на полную
        }
      }
      buttonWasUp = buttonIsUp;
    }


    // место для кнопок 2, 3



    void cleverB() {  //избавляемся от дребезга и задаём параметры "умной" кнопки

      float temp;
     
      boolean buttonWasUp = true;
      boolean buttonIsUp = digitalRead(CLEVER_BUTTON);
      if (buttonWasUp && !buttonIsUp) {
        delay(10);
        buttonIsUp = digitalRead(CLEVER_BUTTON);
        if (!buttonIsUp) {

          val = true;  // вроде как включаю "умную" кнопку
          while (val) {
         
            temp = analogRead(TEMP_PIN);      ///////////
            temp = temp * 0.48828125;
            Serial.print("TEMPRATURE = ");
            Serial.print(temp);                       ///////////   термометр
            Serial.print("*C");
            Serial.println();
            delay(1000);                     //////////////////

            if (temp > 30) {
              analogWrite(MOTOR_PIN, 255);
            }                              // параметры для кулера при определённой температура
            if (temp < 25) {
              analogWrite(MOTOR_PIN, 0);
            }
          }
        }
      }
      buttonWasUp = buttonIsUp;
    }
     
    P.S. Не судите строго я только начинающий:3
     
  2. ostrov

    ostrov Гуру

    Первое что в глаза бросилось - delay(1000), надо бы от него избавиться. И еще, переменная val где проверяется? Или я слепой.
     
  3. Tomasina

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

    Код (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(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;
      }
    }
     
     
    Последнее редактирование: 9 май 2016
    cody_c++, ostrov и Benny_Ray нравится это.
  4. fogary

    fogary Гик

    Это же бесконечный цикл?
     
  5. Antoha96

    Antoha96 Нуб

    delay я пока оставлю так при проверки значений меньше в глазах рябит, а значение val пытаюсь проверить тут
    Код (C++):
     val = true;  // вроде как включаю "умную" кнопку
          while (val) {
       
            temp = analogRead(TEMP_PIN);      ///////////
            temp = temp * 0.48828125;
            Serial.print("TEMPRATURE = ");
            Serial.print(temp);                       ///////////   термометр
            Serial.print("*C");
            Serial.println();
    не уверен что я делаю это правильно...
     
  6. Antoha96

    Antoha96 Нуб

    не вышло, всё равно кулер продолжает работать от температуры
     
  7. Antoha96

    Antoha96 Нуб

    вроде бесконечный, а как его можно остановить хотя бы пока работают другие кнопки?
     
  8. Tomasina

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

    а режимы переключаются? Может там подтяжка не так как у меня расписано.
     
  9. ostrov

    ostrov Гуру

    сделать
    Код (C++):
    val = false;
     
  10. Antoha96

    Antoha96 Нуб

    Ну кнопки работают, но допустим если термометр показывает меньше 25 градусов тогда при отпуске кнопки кулер перестаёт крутится...
     
  11. fogary

    fogary Гик

    Antoha96
    У Вас, в исходном коде, объявлена глобальная переменная cancel, но нигде не используется. Переменная val, в каждой функции обработки кнопок, объявлена как локальная, т. е. при выходе из функции значение этой переменной теряется. Возможно, вместо переменной val Вы планировали использовать переменную cancel?

    У Вас не был предусмотрен выход из бесконечного цыкла, по этому нажатие других кнопок и не обрабатывалось.

    Tomasina
    У автора, в коде, было предусмотрено подавление дребезга контактов. В вашем примере этого нет, плюс пропущена обработка кнопки принудительного выключения кулера (Mode = STOP).
     
  12. fogary

    fogary Гик

    Если Вы про "умную" кнопку, то в условиях же прописано, что при температуре меньше 25° - остановить кулер.
     
  13. Antoha96

    Antoha96 Нуб

    Да я экспериментировал с cancel и val
    А как можно прописать выход из цикла при нажатии на другую кнопку? Извиняюсь если тупой вопрос я только начинающий...
    Я наверное плохо объяснил, я хочу сделать так чтобы при нажатии на кнопку допустим с полной скоростью analogWrite(MOTOR_PIN, 255); кулер не перестовал работать при температуре меньше 25 а продолжал крутиться... так же с кнопкой остановки если температура больше 30 то кулер не должен работать так как прописано в умном режиме.
     
  14. fogary

    fogary Гик

    Попробуйте для начала дополнить функцию readButtons():
    Код (C++):
    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;
    }
    Если не заработает, опишите подробнее - что происходит при нажатии каждой кнопки.
     
  15. Tomasina

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

    в данной задаче дребезг не влияет на работу, ведь неважно один раз нажали кнопку CLEVER или 7 раз за 0,2 сек - режим выбран и дальнейшее многократное "нажатие" той же кнопки (тот самый дребезг) режим не меняет, это не счетчик.
    У автора нет кнопки STOP, зачем мне вносить свои сущности?
    Архитектура построения скетча дана, пусть самостоятельно допишет, надо мозги развивать, а не ждать полностью готового решения.
     
    Последнее редактирование: 11 май 2016
    Benny_Ray и ostrov нравится это.
  16. fogary

    fogary Гик

    Код (C++):
    #define FIRST_BUTTON 4    //                  \  мотор работает в полную силу
    #define SECOND_BUTTON 6  //  КНОПКИ С РЕЖИМАМИ > мотор работает в пол силы
    #define THERD_BUTTON 7  //                    /  мотор не работает

    #define CLEVER_BUTTON 3  // умный режим > мотор работает взависимости от термометра
    Если не ошибаюсь, кнопка THERD_BUTTON - выполняет именно эту функцию.
     
  17. Benny_Ray

    Benny_Ray Нерд

    так в том скетче что Вам скинули так и реализовано насколько я вижу, остановка и и запуск автоматически работает только при нажатии умной кнопки в остальных случаях он либо крутится на 100% либо на 50% либо стоит, кстати кнопка STOP насколько я вижу реализована вроде бы
     
  18. Antoha96

    Antoha96 Нуб

    Дополнил, но проблема осталась. Как я понял умная кнопка работает вообще всегда и не важно нажали ли её до этого или нет. Так что при температуре больше 25 и меньше 30 остальные кнопки работают, но как только температура допустим понизилось меньше 25 то можно нажимать хоть на какую кнопку как только отпустишь кнопку кулер перестаёт крутится, то же самое с температурой больше 30 кулер нельзя выключить или включить в пол мощности, только если давить на ту кнопку которая нужна.
     
  19. Antoha96

    Antoha96 Нуб

    Про дребезг понял действительно если вдуматься то можно его не прописывать.
    Я специально в первоначальном скетче не стал писать кнопку STOP и HALF чтобы в скетче было легче забираться... Тем более до этого я убирал там дребезг
     
  20. Antoha96

    Antoha96 Нуб

    Я когда просмотрел скетч тоже так думал но кажется умный режим работает без остановки