Запуск режима

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

  1. lerik2703

    lerik2703 Гик

    если проще разве что так
    Код (C++):
    #define upPin 2
    int m = 1;
    int p1 = 0;

    void setup()
      {
      Serial.begin(115200);
      pinMode(upPin, INPUT_PULLUP); // подключаем кнопку через внутренний резистор

       }

    void loop()
    {
      const int  longTimeClick = 500;
      static  unsigned long previous_millis;
      static  unsigned long lastSwitchTime;
      static  bool Click_One     =  false;


      bool buttonUpWas = true;
      bool  buttonUpIs = digitalRead(upPin);

      // Обработка нажатия для параметра p1 +
      if (buttonUpWas && !buttonUpIs)
      {
        delay(10);
        buttonUpIs = digitalRead(upPin);
        if (!buttonUpIs && m == 1)
        {
          if  (Click_One == buttonUpIs) {
            lastSwitchTime = millis();
            Click_One = !buttonUpIs;
            p1++;
          }
          //        lcd.backlight();
          //        TimeLCDOff = currentTime;
          if ((millis() - lastSwitchTime) >= longTimeClick) {
            p1++;
            delay (100);
          }
          if (p1 > 100)
          {
            p1 = 0;
          }
          //   delay (100);
          // lcd.setCursor(5, 1);//очистка предыдущего параметра
          //  lcd.print("  ");
          //   menu();
        }
        else
          Click_One = !buttonUpIs;
      }

      Serial.println(p1) ;

    }
     
    sanik нравится это.
  2. sanik

    sanik Гик

    Вот теперь понятно! Теперь понял почему у меня не получалось втиснуть таймер. Спасибо вам огромное!
     
  3. lerik2703

    lerik2703 Гик

    внесите изменения во весь код где требуется сея таймер ,меня смущает переменная Click_One как она себя будет вести возможен конфликт ...
     
  4. sanik

    sanik Гик

    На текущий момент разбираюсь где что происходит так как кнопка снова работает наоборот
     
  5. sanik

    sanik Гик

    Опять переменная как самостоятельная растет сама пока кнопку не нажмешь вроде по логике инвертирование стоит как надо?
     
  6. lerik2703

    lerik2703 Гик

    в распределении памяти, обычная переменяя объявленная внутри функции каждый раз при вызове последней будет занимать новую ячейку памяти и при выходе будет уничтожена ,статическая переменная будет помечена как глобальная но видна будет только там где её объявили!
    я вроде постарался под ваш проект подстроиться !у вас при нажатии 0 возвращаеться?
     
  7. sanik

    sanik Гик

    Странно мой код в Serial.println(p1) ; выдает то же самое но переменная меняется при отпускании кнопки а в вашем варианте переменная наоборот пока держишь кнопку зажатой все нормально как только отпускаешь начинает прибавляться
     
  8. sanik

    sanik Гик

    Что интересно он и параметр p2 меняет так же хотя я прописал в одной кнопке которая на параметр p1
     
  9. lerik2703

    lerik2703 Гик

    давайте код
     
  10. sanik

    sanik Гик

    Уже решил вставить ту часть кода которая работает с меню
    Код (C++):
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    #define autoOFF 10  // кол-во секунд через которое выключается подсветка дисплея при бездействии

    LiquidCrystal_I2C lcd(0x20, 16, 2);  // установка I2C адреса LCD в 0x27, а также указываем что 16 символов, 2 строки
    //int pos = 0;                         // текущая позиция (0 - установка, 1 - работа)
    int interval = 0;
    unsigned long currentTime;
    unsigned long TimeLCDOff;
    unsigned long flagTime;

    int m = 0; // переменная для экранов меню
    int p1 = 0;
    int p2 = 0;
    int p3 = 0;

    #define BL 3
    #define plusPin 6
    #define minusPin 10
    #define upPin 8
    #define downPin 7
    #define EterPin 12
    #define ledPin 13

    boolean buttonPlusWas = true;
    boolean buttonMinusWas = true;
    //boolean buttonUpWas = true;
    boolean buttonDownWas = true;
    boolean buttonEterWas = true;
    boolean working = false;
    //boolean ledEnabled = false;

    void setup()
    {
      pinMode(plusPin, INPUT);
      pinMode(minusPin, INPUT);
      pinMode(upPin, INPUT);
      pinMode(downPin, INPUT);
      pinMode(EterPin, INPUT);
      pinMode(BL, OUTPUT);
      pinMode(ledPin, OUTPUT);

      lcd.init();            // инициализация LCD
      lcd.backlight();        // включаем подсветку
      for (int i = 0; i <= 255; i++)
      {
        analogWrite(BL, i);
        delay(5);
      }
      delay (500);
    }

    void loop()
    {
      const int  longTimeClick = 500;
      static  unsigned long previous_millis;
      static  unsigned long lastSwitchTime;
      static  bool Click_One  =  true;
     
      bool buttonUpWas = true;
    //  bool  buttonUpIs = digitalRead(upPin);
      boolean buttonPlusIs = digitalRead(plusPin);
      boolean buttonMinusIs = digitalRead(minusPin);
      boolean buttonUpIs = digitalRead(upPin);
      boolean buttonDownIs = digitalRead(downPin);
      boolean buttonEterIs = digitalRead(EterPin);

      //================================================
      if (working == false)
      {
        if (buttonEterWas && !buttonEterIs)
        {
          delay(10);
          buttonEterIs = digitalRead(EterPin);
          if (!buttonEterIs && m == 0)
          {
            lcd.backlight();
            TimeLCDOff = currentTime;
            working = true;
          }
        }
        //Обработка нажатия кнопки меню
        if (buttonPlusWas && !buttonPlusIs)
        {
          delay(10);
          buttonPlusIs = digitalRead(plusPin);
          if (!buttonPlusIs)
          {
            lcd.backlight();
            TimeLCDOff = currentTime;
            m++;
            if (m > 3)
            {
              m = 0;
            }
            delay(100);
            lcd.clear();
            menu();
          }
        }
        //Обработка нажатия кнопки назад
        if (buttonMinusWas && !buttonMinusIs)
        {
          delay(10);
          buttonMinusIs = digitalRead(minusPin);
          if (!buttonMinusIs)
          {
            lcd.backlight();
            TimeLCDOff = currentTime;
            m--;
            if (m < 0)
            {
              m = 3;
            }
            delay(100);
            lcd.clear();
            menu();
          }
        }

       // Обработка нажатия для параметра p1 +
      if (buttonUpWas && !buttonUpIs)
      {
        delay(10);
        buttonUpIs = digitalRead(upPin);
        if (!buttonUpIs && m == 1)
        {
          if  (Click_One == buttonUpIs)
          {
            lastSwitchTime = millis();
            Click_One = !buttonUpIs;
            p1++;
          }
                  lcd.backlight();
                 TimeLCDOff = currentTime;
          if ((millis() - lastSwitchTime) >= longTimeClick)
          {
            p1++;
           // delay (100);
          }
          if (p1 > 100)
          {
            p1 = 0;
          }
             delay (100);
           lcd.setCursor(5, 1);//очистка предыдущего параметра
            lcd.print("  ");
             menu();
        }
        else
          Click_One = !buttonUpIs;
      }


        // Обработка нажатия для параметра p1 -
        if (buttonDownWas && !buttonDownIs)
        {
          delay(10);
          buttonDownIs = digitalRead(downPin);
          if (!buttonDownIs && m == 1)
          {
            lcd.backlight();
            TimeLCDOff = currentTime;
            p1--;
            if (p1 < 0)
            {
              p1 = 100;
            }
            delay (100);
            lcd.setCursor(5, 1);//очистка предыдущего параметра
            lcd.print("   ");
            menu();
          }
        }
        // Обработка нажатия для параметра р2 +
        if (buttonUpWas && !buttonUpIs)
        {
          delay(10);
          buttonUpIs = digitalRead(upPin);
          if (!buttonUpIs && m == 2)
          {
            lcd.backlight();
            TimeLCDOff = currentTime;
            p2++;
            if (p2 > 10)
            {
              p2 = 0;
            }
            delay (100);
            lcd.setCursor(5, 1);//очистка предыдущего параметра
            lcd.print("  ");
            menu();
          }
        }
        // Обработка нажатия для параметра р2 -
        if (buttonDownWas && !buttonDownIs)
        {
          delay(10);
          buttonDownIs = digitalRead(downPin);
          if (!buttonDownIs && m == 2)
          {
            lcd.backlight();
            TimeLCDOff = currentTime;
            p2--;
            if (p2 < 0)
            {
              p2 = 10;
            }
            delay (100);
            lcd.setCursor(5, 1);
            lcd.print("  ");
            menu();
          }
        }

        // Обработка нажатия для параметра р3 +
        if (buttonUpWas && !buttonUpIs)
        {
          delay(10);
          buttonUpIs = digitalRead(upPin);
          if (!buttonUpIs && m == 3)
          {
            lcd.backlight();
            TimeLCDOff = currentTime;
            // ledEnabled = !ledEnabled;
            // digitalWrite(ledPin, ledEnabled);
            // p3 = ledEnabled;
            menu();
          }
        }


        // Обработка нажатия для параметра р3 -
        if (buttonDownWas && !buttonDownIs)
        {
          delay(10);
          buttonDownIs = digitalRead(downPin);
          if (!buttonDownIs && m == 3)
          {
            lcd.backlight();
            TimeLCDOff = currentTime;

            menu();
          }
        }

      }

      //=======================================================================

      currentTime = millis();         // считываем время, прошедшее с момента запуска программы
      if (working == true)
      {
        show_work();
        digitalWrite(ledPin, HIGH);                   // моргнем встроенным LED
        delay(100);
        digitalWrite(ledPin, LOW);
        //==================================================
        if (buttonEterWas && !buttonEterIs)
        {
          delay(10);
          buttonEterIs = digitalRead(upPin);
          if (!buttonEterIs && working == true )//&& m == 0
          {
            lcd.backlight();              // включаем подсветку
            TimeLCDOff = currentTime;     // в TimeLCDOff записываем новое значение
            m = 0;
            working = false;        // прерываем режим "работа"
            menu();                // если были в рабочем режиме, то прерываем
          }
        }
      }


      if (currentTime >= (TimeLCDOff + (autoOFF * 1000)))
      {
        lcd.noBacklight();
      }
      buttonUpWas = buttonUpIs;
      buttonDownWas = buttonDownIs;
      buttonPlusWas = buttonPlusIs;
      buttonMinusWas = buttonMinusIs;
      buttonEterWas = buttonEterIs;
      //end loop
    }

    //==================================================================
    void menu()
    {
      working = false;
      if (m == 0)
      {
        lcd.setCursor(0, 0);
        lcd.print( "Main Menu" );
      }
      else if (m == 1)
      {
        lcd.setCursor(0, 0);
        lcd.print( "Parametr-1" );
        lcd.setCursor(0, 1);
        lcd.print( "P1 = " );
        lcd.print(p1);
      }
      else if (m == 2)
      {
        lcd.setCursor(0, 0);
        lcd.print( "Parametr-2" );
        lcd.setCursor(0, 1);
        lcd.print( "P2 = " );
        lcd.print(p2);
      }
      else if (m == 3)
      {

        lcd.setCursor(0, 0);
        lcd.print( "LED Control" );
        lcd.setCursor(0, 1);
        lcd.print( "LED = " );
        lcd.print(p3);
      }
    }

    void show_work()
    {
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("work");
      // lcd.setCursor(4, 1);
      //lcd.print("L=setup R=start");
      // m = 0;
      working = true;
    }
     
  11. sanik

    sanik Гик

    В самом низу пробовал возвращать Click_One == buttonUpIs Тоже не помогло:)
     
  12. lerik2703

    lerik2703 Гик

    у вас как кнопки подключены?
     
  13. sanik

    sanik Гик

    Через резисторы на минус
     
  14. sanik

    sanik Гик

    Намек понял попробую убрать и через внутреннюю подтяжку
     
  15. lerik2703

    lerik2703 Гик

    да нет я что бы понимал что у вас при нажатой кнопке digitalRead() возврашает
     
  16. sanik

    sanik Гик

    Все заработало :) причем все нормально Click_One вроде не заметно чтоб конфликтовал Придется две кнопки делать по другой схеме.
     
  17. sanik

    sanik Гик

    Понятно переделал именно эту кнопку стало работать но вдобавок работает и со второй переменой р2 хотя прописан этот код в одном месте!
     
  18. sanik

    sanik Гик

    В общем понял что ваш вариант тоже не действует а фокус заключается вот в этих переменных
    bool buttonUpWas = true;
    bool buttonUpIs = digitalRead(upPin);
    Если их поставить в луп то переменная начинает быстро увеличиваться А если их объявить как глобальные то переменная увеличивается на единицу. Ниже как видно у меня закомментировано все что относиться к вашему варианту при этом переменная прибавляется со скоростью зависящей от delay() причем условие если переменные в лупе то их надо на + подтяжку делать:)

    Код (C++):
    boolean buttonPlusWas = true;
    boolean buttonMinusWas = true;
    boolean buttonEterWas = true;
    boolean working = false;

    //boolean EnablFlash1 = false;
    //boolean EnablFlash2 = false;
    // Enablsol = 0;

    void setup()
    {
      pinMode(plusPin, INPUT); // _PULLUP
      pinMode(minusPin, INPUT);
      pinMode(upPin, INPUT);
      pinMode(downPin, INPUT);
      pinMode(EterPin, INPUT);
      pinMode(BL, OUTPUT);
      pinMode(ledPin, OUTPUT);

      lcd.init();            // инициализация LCD
      lcd.backlight();        // включаем подсветку
      for (int i = 0; i <= 255; i++)
      {
        analogWrite(BL, i);
        delay(5);
      }
      delay (500);
    }

    void loop()
    {
    //  const int  longTimeClick = 500;
    //  static  unsigned long previous_millis;
    //  static  unsigned long lastSwitchTime;
    //  static  bool Click_One  =  true;

      bool buttonUpWas = true;
      bool  buttonUpIs = digitalRead(upPin);
      bool buttonDownWas = true;
      bool buttonDownIs = digitalRead(downPin);
     
      boolean buttonPlusIs = digitalRead(plusPin);
      boolean buttonMinusIs = digitalRead(minusPin);
      boolean buttonEterIs = digitalRead(EterPin);
     
     
  19. sanik

    sanik Гик

    :D Целый день убился на то чтоб перетащить две переменные в луп и переделать две кнопки на подтяжку к плюсу :cool:
     
  20. DrProg

    DrProg Вечный нерд

    Вот выдрал из своего кода. Суть его в том, чтобы отслеживать нажатие кнопки и время ее удержания. Если держать меньше 1 сек ничего не происходит, если держать 1 сек уходим на функцию Stop(). В вашем случае вместо этой функции можете вставить свою. Ну и нажим кнопки перепишите под более понятное digitalRead().

    Код (C++):
      if (!(PIND & 2)) { // остановка таймера кнопкой
        if (oldPress) {
          if (timerPRESS < millis()) Stop();
        } else {
          timerPRESS = millis() + 1000;
          oldPress = 1;
        }
      } else {
        oldPress = 0;
      }