Действие с кнопкай

Тема в разделе "Arduino & Shields", создана пользователем Andrei brest, 25 сен 2016.

  1. Andrei brest

    Andrei brest Нерд

    Привет
    подскажите как сделать так чтобы при нажатии на кнопку (int 2) светодиод включился на 2 секунды и погас НО при этом кнопка остается нажатой .
     
  2. Tomasina

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

    разделить ситуацию на два отдельных события (функции): анализ состояния кнопки и управление светодиодом.

    "перемычка" между ними - это переменная (в данном случае флаг - boolean). Первая функция записывает в эту переменную данные, а вторая функция читает из этой переменной данные.
     
    Andrei brest нравится это.
  3. qwone

    qwone Гик

    Что бы кнопка была нажатой, (хе-хе) нужно давить ее пальцем. А у ардуины пальцев нет.
    Из наблюдений.
     
  4. Andrei brest

    Andrei brest Нерд

    Код (C++):
    int buuton = 2;
    int led= 13;
    //boolean buutonstatus= false;


    void setup() {
    pinMode (led,OUTPUT);
    pinMode (buuton, INPUT_PULLUP);
    }

    void loop() {
      boolean= digitalRead(buuton);
      boolean
     
    }
    оправдательное напровление
     
  5. Andrei brest

    Andrei brest Нерд

     
  6. Tomasina

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

    Код (C++):
    #define BUTTON_PIN       4  // кнопка подключается между пином и GND
    #define LED_PIN          13 // LED подключается через резистор 200-400 Ом между пином и GND
    const byte ledTimeout  = 2; // время до отключения LED, сек (не более 255)

    boolean LEDstate;           // переменная-флаг для обмена информацией между функциями
    unsigned long timestamp;    // переменная для расчета времени отключения LED

    void setup()
    {
      pinMode(BUTTON_PIN, INPUT_PULLUP);
      pinMode(LED_PIN, OUTPUT);
      LEDstate = false;
    }

    void loop()
    {
      checkButton();  // вызываем функцию чтения состояния кнопки
      setLED();       // вызываем функцию управления LED
    }

    void checkButton()
    {
      static boolean btnState = false; // локальная переменная для хранения состояния кнопки
      if (!digitalRead(BUTTON_PIN))    // реакция на нажатие кнопки
      {
        if (btnState == false)                        // если до этого момента кнопка была НЕ нажата...
        {
          btnState = true;                            // то ставим флаг, что кнопка нажата,
          LEDstate = true;                            // разрешаем включение LED
          timestamp = millis() + ledTimeout * 1000;   // и запоминаем время отключения
        }
      }
      else btnState = false; // реакция на отжатие кнопки: ставим флаг, что кнопка НЕ нажата
    }

    void setLED()
    {
      if (LEDstate == true) // если включение LED разрешено...
      {
        if (millis() < timestamp) digitalWrite(LED_PIN, HIGH); // и если с момента включения прошло меньше 2 сек, то подаем питание на LED
        else LEDstate = false;                                 // если прошло больше 2 сек, то запрещаем включение LED
      }
      else digitalWrite(LED_PIN, LOW);                         // в любом другом случае гасим LED
    }
     
    Andrei brest нравится это.
  7. qwone

    qwone Гик

    Вот мой вариант кода.
    Код (C++):
    /* одновибратор
    кнопка -> 6 (btm_pin) 0 нажата/ 1 нет
           GND ->  GND
    светодиод -> 13 (Led_pin) 1 горит/ 0 нет
           GND ->  GND
    */

    const int btm_pin=6  ; // нога кнопки
    const int Led_pin=13 ; // нога светодиода
    const int interval=2000 ;// интервал после нажатия клавиши 2 сек
    uint32_t past=0 ;
    uint8_t Led=0 ;
    void setup() {
       pinMode(btm_pin, INPUT_PULLUP);
       pinMode(Led_pin, OUTPUT);
       digitalWrite(Led_pin,Led);
    }

    void loop() {
      if(!digitalRead(btm_pin)){
        Led=1;
        digitalWrite(Led_pin,Led);
        past=millis();
        }
       if (millis() >=past+interval) {
           Led=0;
           digitalWrite(Led_pin,Led);
           }

    }
     
    Andrei brest нравится это.
  8. qwone

    qwone Гик

    Вот вместе с вашим кодом. Может он не оптимален, но думаю вам понятен.
    Код (C++):
    /* одновибратор
    кнопка -> 6 (btm_pin) 0 нажата/ 1 нет
           GND ->  GND
    светодиод -> 13 (Led_pin) 1 горит/ 0 нет
           GND ->  GND
    */

    //#1
    const int btm_pin = 6  ; // нога кнопки
    const int Led_pin = 13 ; // нога светодиода
    const int interval = 2000 ; // интервал после нажатия клавиши 2 сек
    uint32_t past = 0 ;
    uint8_t Led = 0 ;
    //#2
    #include <SoftwareSerial.h>
    SoftwareSerial gsm(7, 8); // RX, TX

    void setup() {
      //#1
      pinMode(btm_pin, INPUT_PULLUP);
      pinMode(Led_pin, OUTPUT);
      digitalWrite(Led_pin, Led);
      //#2
      Serial.begin(9600);
      gsm.begin(9600);
    }

    void loop() {
      //#1
      if (!digitalRead(btm_pin)) {
        Led = 1;
        digitalWrite(Led_pin, Led);
        past = millis();
      }
      if (millis() >= past + interval) {
        Led = 0;
        digitalWrite(Led_pin, Led);
      }
      //#2
      if (Led) {   // если горит светодиод
        while (1) {           // проверяем готовность модема
          gsm.println("AT+CPAS");
          if (gsm.find("0")) break;
          delay(100);
        }
        gsm.println("ATD+79990000000;"); // звоним по указаному номеру
        delay(100);
        if (gsm.find("OK")) Serial.println("OK!");
        else Serial.println("error");
      }
    }
     
    Andrei brest нравится это.
  9. Tomasina

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

    главное чтобы работало как задумано ;)
     
    Andrei brest нравится это.
  10. Andrei brest

    Andrei brest Нерд

    Во первых хочу поблагодарить за помощь
    Реально СПАСИБО всем
    по поводу вашего примера светодиод получается с задержкой
    а я хотел чтобы светодиод погас пусть 2 сек после нажатия(и удержания кнопки) и оставался в таком же состоянии до следующего нажатия
    Пример Tomasina как раз работает так только там есть тоже глюк когда отжимаем кнопку срабатывает
    пин 13 как будто мы нажали кнопку
     
  11. Tomasina

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

    это дребезг кнопки. Попробуй повесить параллельно контактам кнопки конденсатор 0,1-0,47 мкФ.
     
  12. qwone

    qwone Гик

    Код (C++):
    /* одновибратор
    кнопка -> 6 (btm_pin) 0 нажата/ 1 нет
           GND ->  GND
    светодиод -> 13 (Led_pin) 1 горит/ 0 нет
           GND ->  GND
    */

    //#1
    const int btm_pin = 6  ; // нога кнопки
    const int Led_pin = 13 ; // нога светодиода
    const int interval = 2000 ; // интервал после нажатия клавиши 2 сек
    uint32_t past = 0 ;
    uint8_t Led ;
    //#2
    #include <SoftwareSerial.h>
    SoftwareSerial gsm(7, 8); // RX, TX

    void setup() {
      //#1
      pinMode(btm_pin, INPUT_PULLUP);
      pinMode(Led_pin, OUTPUT);
      digitalWrite(Led_pin, Led = 0);
      //#2
      Serial.begin(9600);
      gsm.begin(9600);
    }

    void loop() {
      //#1
      if (Led && millis() >= past + interval) {
        digitalWrite(Led_pin, Led = 0);
      }
      if ( !digitalRead(btm_pin)) {
        digitalWrite(Led_pin, Led = 1);
        past = millis();
      }
     //#2
      if (Led) {   // если горит светодиод
        gsm.println("AT+CPAS"); // проверяем готовность модема
        if (gsm.find("0")) {
          gsm.println("ATD+79990000000;"); // звоним по указаному номеру
          delay(100);
          if (gsm.find("OK")) Serial.println("OK!");
          else Serial.println("error");
        }
      }
    }