Длительное нажатие кнопки

Тема в разделе "Arduino & Shields", создана пользователем Artclonic, 31 мар 2018.

  1. Artclonic

    Artclonic Гик

    Добрыи день, пытаюсь написать код на кнопку деиствие от которои начиналось бы через некоторое время (длительно нажатие)
    Вот кусочек кода... Не пому что не правильно записал... Не работает...
    Код (C++):
    else
    {
      if(digitalRead(knopka2)==LOW)  // нажали кнопочку #2
          {    
          val++;  // прибавляем к переменной 1 при каждой смене цикла.  
          delay(200); //небольшая защита от "дребезга" контактов кнопки
                     
          if(val>=5)
          {
           Serial.print("KNOPKA2");
           Serial.print(val);
           }
                     
           else
           {
            val=0; // обнулили переменную
            }
         
          }
          else
           {
            val=0; // обнулили переменную
            }
       
          }
     
  2. b707

    b707 Гуру

    попробуйте сами выполнить этот код вместо компьютера..
    1. Нажали кнопку.
    2. Увеличили val на единичку, теперь val =1
    3 задержка 200
    4. Если val > 5 ... но у нас val =1. значит идем в ветку else - "обнуляем переменную"

    И так бесконечно.
     
  3. parovoZZ

    parovoZZ Гуру

    с логикой-то как?

    Код (C++):
          if(val>=5)
          {
           Serial.print("KNOPKA2");
           Serial.print(val);
           }
                     
           else
           {
            val=0; // обнулили переменную

    перефразирую твой код:
    если val меньше 5, то val = 0.

    Берешь лист бумаги и рисуешь алгоритм работы программы. Пока не будешь визуально видеть свою программу, так и будешь делать такие вот логические ошибки. Хотя, с точки зрения МК, здесь ошибки никакой нет.
     
  4. Artclonic

    Artclonic Гик

    Вот верно?
    Код (C++):
    else
    {
      if(digitalRead(knopka2)==LOW)  // нажали кнопочку #2
          {  
          val++;  // прибавляем к переменной 1 при каждой смене цикла.  
          delay(200); //небольшая защита от "дребезга" контактов кнопки
                     
          if(val>=5)
          {
           Serial.print("KNOPKA2");
           Serial.print(val);
           val=0; // обнулили переменную
           }
                     
           else
           {
            //тогда ни чего не делаем
            }
       
          }
          else
           {
            val=0; // обнулили переменную если val не набрал "5"
            }
     
          }
     
  5. parovoZZ

    parovoZZ Гуру

    Синтаксически вроде верно. Алгоритмически будет так - каждые 200 мс МК будет наглухо висеть, каждую секунду будет заходить в подпрограмму обработки нажатия кнопки.
     
  6. SergeiL

    SergeiL Оракул Модератор

    Да Вы не слушайте parovoZZ-а ему так, поболтать. :)
    Не, не туда посмотрел, Поболтать он любит, но здесь я не туда посмотрел :).
     
    Последнее редактирование: 1 апр 2018
  7. Artclonic

    Artclonic Гик

    висеть, а значит -время задержки будет реализованно.
    Вроде так и хочу...
    А еще хочу реализовать, сколько раз (какои по счету раз) было достигнуто кол-во "5", т.е. сколько раз цикл достиг "5", после включения ардуины...И тогда уже в порт отправлять не только "KNOPKA2", а плюс значение кол-ва"длительных нажатии". Это мне надо еще како-то общи цикл делать? и Туда весь блок нажатия на вторую кнопку сувать?
     
  8. Artclonic

    Artclonic Гик

    ВСЕ ВЫ МЕНЯ ЗАПУТАЛИ,,,,
     
  9. vvr

    vvr Инженерище

    скачай библиотеку OneButton.
    посмотри что там написано и как организована обработка нажатий.
    и можешь смело заново велосипед изобретать.
     
  10. Artclonic

    Artclonic Гик

    Хочу так - не правильно?
    Код (C++):
    else
    {
      if(digitalRead(knopka2)==LOW)  // нажали кнопочку #2
          {  
          val++;  // прибавляем к переменной 1 при каждой смене цикла.
          delay(200); //небольшая защита от "дребезга" контактов кнопки
                   
          if(val>=5)
          {
           Serial.print("KNOPKA2");
           Serial.print(val);
           val=0; // обнулили переменную
           }
                   
           else
           {
            //тогда ни чего не делаем
            }
       
          }
          else
           {
            val=0; // обнулили переменную если val не набрал "5"
            }
     
          }
     
  11. b707

    b707 Гуру

    так нормально, только задержка 200 против дребезга - это очень много, я бы сделал 10-20-мс

    И еще - первый else, где "ничего не делаем" - можно убрать
     
  12. Artclonic

    Artclonic Гик

    Я наверное пропустил главное - это вставить паузу в конце цикла, а то смысл теряется,иначе цикл 5 раз сделает мгновенно, я правильно мыслю? Как раз таки в "первом else поставить delay(250)...
     
  13. parovoZZ

    parovoZZ Гуру

    А я бы не стал. Хотя бы из-за читабельности кода. Мне по скобкам лень бегать, но второй елсе запросто у ТС может примкнуть к первому иф.
     
  14. parovoZZ

    parovoZZ Гуру

    Приведи полный код.
     
  15. Artclonic

    Artclonic Гик

    Вот код моего компаса блютуз, нажатие второи кнопки пока не настроил..
    Код (C++):
    #include <SoftwareWire.h>
    #define addr 0x0D //I2C Address for The HMC5883

    SoftwareWire myWire1(4, 5); //4  sda and 5 scl
    SoftwareWire myWire2(6, 7); //6  sda and 7 scl
    const int knopka1=8; // кнопка №1
    const int knopka2=9; // кнопка №2
    int val=0;
    unsigned long L=250;
    int xx1;
    int yy1;
    int zz1;

    int xx2;
    int yy2;
    int zz2;


    static int mx1;
    static int my1;
    static int mz1;

    static int mx2;
    static int my2;
    static int mz2;




    void setup() {

    pinMode(knopka1, INPUT_PULLUP);
    pinMode(knopka2, INPUT_PULLUP);
    Serial.begin(9600);

      myWire1.begin();
      myWire2.begin();
     
      myWire1.beginTransmission(addr); //start talking
      myWire1.write(0x0B); // Tell the HMC5883 to Continuously Measure
      myWire1.write(0x01); // Set the Register
      myWire1.endTransmission();
      myWire1.beginTransmission(addr); //start talking
      myWire1.write(0x09); // Tell the HMC5883 to Continuously Measure
      myWire1.write(0x1D); // Set the Register
      myWire1.endTransmission();
     
      myWire2.beginTransmission(addr); //start talking
      myWire2.write(0x0B); // Tell the HMC5883 to Continuously Measure
      myWire2.write(0x01); // Set the Register
      myWire2.endTransmission();
      myWire2.beginTransmission(addr); //start talking
      myWire2.write(0x09); // Tell the HMC5883 to Continuously Measure
      myWire2.write(0x1D); // Set the Register
      myWire2.endTransmission();


    }

    void loop() {
     
    if(digitalRead(knopka1)==LOW) //проверка включена ли кнопка №1
    {
      //Начало первого блока кода для чтения 1 датчика
      int x1, y1, z1; //triple axis data
      //Tell the HMC what regist to begin writing data into

      myWire1.beginTransmission(addr);
      myWire1.write((uint8_t)0x00); //start with register 3.
      myWire1.endTransmission();

      //Read the data.. 2 bytes for each axis.. 6 total bytes
      myWire1.requestFrom(addr, 6);
      if (6 <= myWire1.available()) {
        x1 = myWire1.read(); //MSB  x
        x1 |= myWire1.read() << 8; //LSB  x
        z1 = myWire1.read(); //MSB  z
        z1 |= myWire1.read() << 8; //LSB z
        y1 = myWire1.read(); //MSB y
        y1 |= myWire1.read() << 8; //LSB y
      }

     
      xx1=(mx1-x1)/L;
    mx1=x1;
      yy1=(my1-y1)/L;
      my1=y1;
      zz1=(mz1-z1)/L;
      mz1=z1;
     

      //Начало второго блока кода для чтения 2 датчика
      int x2, y2, z2; //triple axis data
      //Tell the HMC what regist to begin writing data into

      myWire2.beginTransmission(addr);
      myWire2.write((uint8_t)0x00); //start with register 3.
      myWire2.endTransmission();

      //Read the data.. 2 bytes for each axis.. 6 total bytes
      myWire2.requestFrom(addr, 6);
      if (6 <= myWire2.available()) {
        x2 = myWire2.read(); //MSB  x
        x2 |= myWire2.read() << 8; //LSB  x
        z2 = myWire2.read(); //MSB  z
        z2 |= myWire2.read() << 8; //LSB z
        y2 = myWire2.read(); //MSB y
        y2 |= myWire2.read() << 8; //LSB y
      }
     
      xx2=(mx2-x2)/L;
       mx2=x2;
      yy2=(my2-y2)/L;
       my2=y2;
      zz2=(mz2-z2)/L;
       mz2=z2;
     
      // Печать в порт
     
    Serial.print("E");
    Serial.print(x1);
    Serial.print(",");
    Serial.print(y1);
    Serial.print(",");
    Serial.print(z1);
    Serial.print(",");
    Serial.print(xx1);
    Serial.print(",");
    Serial.print(yy1);
    Serial.print(",");
    Serial.print(zz1);
    //Serial.print(",");

    //Serial.print(x2);
    //Serial.print(",");
    //Serial.print(y2);
    //Serial.print(",");
    //Serial.print(z2);
    //Serial.print(",");

    //Serial.print(xx2);
    //Serial.print(",");
    //Serial.print(yy2);
    //Serial.print(",");
    //Serial.print(zz2);
    Serial.print("\n");

      delay(L);
    }
    else
    {
      if(digitalRead(knopka2)==LOW)  // нажали кнопочку #2
          {      
          val++;  // прибавляем к переменной 1 при каждой смене цикла.    
          delay(200); //небольшая защита от "дребезга" контактов кнопки
                       
          if(val>=5)
          {
           Serial.print("REPER");
           //Serial.print(val);
            val=0; // обнулили переменную
            delay(1000);//пауза
           }
                       
           else
           {
             // ничего не делаем...
            }
           
          }
          else
           {
            val=0; // обнулили переменную
            }
         
          }
          }
         


     
     
  16. Artclonic

    Artclonic Гик

    Привел...
     
  17. Artclonic

    Artclonic Гик

    Подскажите... Плиз...