Как мне сообщить код в Arduino, если я дважды нажимаю кнопку с прерываниями? - PullRequest
0 голосов
/ 22 июня 2019

Я использую esp32 в Arduino.Что я хочу сделать: если я нажму кнопку один раз, она должна Serial.print «Я был нажат один раз» Если я нажимаю кнопку дважды, он должен Serial.print «Я был нажат дважды»

IЯ использую функцию attachInterrupt (), но я не знаю, как сказать коду, как читать его, когда я нажимаю кнопку дважды.То, что мой код также делает, включает светодиод, когда он чувствует, что я нажал кнопку.

Вот то, чего я достиг на данный момент:

int boton = 0; 
int led = 5;
int valorBoton; //value of the button, if it off(1) or on (0) 
unsigned int count = 0 ; //counter

void setup() {
    Serial.begin(115200); //velocity
    pinMode(led, OUTPUT); //OUTPUT LED
    pinMode(boton, INPUT); //INFUPT BUTTON
    digitalWrite(led, LOW); //THE LED IS LOW INITIALLY
    attachInterrupt(digitalPinToInterrupt(0),button1,RISING);
}

void loop() {
    count++; 
    Serial.println(count); //printing the counter
    delay(1000);
}

void button1(){ //the function button1 is a parameter of attachInterrupt
    digitalWrite(led, HIGH); //when it is pressed, led is on 
    Serial.println("I was pressed");
    count = 0; // if I was pressed, then the count starts from cero all over again 
}

Я ожидаю напечатать Serial.println («Меня дважды нажимали»), когда я нажимаю кнопку

1 Ответ

2 голосов
/ 22 июня 2019

Это может быть реализовано многими способами.Один из способов - создать функцию для вашей функции прерывания, чтобы просто увеличить простой счетчик.Затем в циклической функции проверьте, нажимал ли пользователь функцию дважды (считая задержку между нажатиями), затем решите, будет ли это одно нажатие или дважды.Не забудьте изменить max_delay для максимального времени ожидания между двумя нажатиями.

// maximum allowed delay between two presses
const int max_delay = 500;

int counter = 0;
bool done = false;

const byte ledPin = 13;
const byte buttonPin = 0;
unsigned long first_pressed_millis = 0;

void counter_incr()
{
    counter++;
}

void setup()
{
    Serial.begin(115200);
    pinMode(ledPin, OUTPUT);          //OUTPUT LED
    pinMode(buttonPin, INPUT_PULLUP); //INPUT BUTTON as pullup
    digitalWrite(ledPin, LOW);        //THE LED IS LOW INITIALLY
    attachInterrupt(digitalPinToInterrupt(buttonPin), counter_incr, RISING);
}

void loop()
{
    if (counter > 0)
    {
        first_pressed_millis = millis();
        // wait for user to press the button again
        while (millis() - first_pressed_millis < max_delay)
        {
            // if button pressed again
            if (counter > 1)
            {
                Serial.println("Button pressed twice!");
                done = true;
                break;
            }
        }
        // if on timeout no button pressed it means the button pressed only one time
        if (!done)
            Serial.println("Button pressed once!");
        counter = 0;
    }
}
...