Странная проблема с кодом Arduino

В настоящее время я только начинаю работать с Arduino, поэтому у меня мало знаний. В этом проекте у меня есть приемник и передатчик с 2 кнопками. Итак, я хотел бы включить что-то, когда я нажимаю кнопку A. Если A нажимается дольше, я бы хотел, чтобы произошло что-то еще. То же самое происходит с кнопкой B, но по некоторым причинам, когда я долго нажимаю A, срабатывает B, и я понятия не имею, почему...

Кстати. этот код создан не мной, а скопирован и отредактирован для моего использования. Если бы кто-нибудь мог мне помочь, я был бы очень рад :)

код:

//ButtonAEvents

long prevA = 0;
long prevB = 0;
int buttonStateA = 0; // 0 = не нажата --- 1 = долго нажата --- 2 коротко нажата
int buttonStateB = 0; // 0 = не нажата --- 1 = долго нажата --- 2 коротко нажата
int ButtonAPin = 2;
int ButtonBPin = 3;
int DURATION_A_IN_MILLIS = 1000;
int DURATION_B_IN_MILLIS = 1000;

// ОДНОРАЗОВАЯ НАСТРОЙКА

void setup()
{
    pinMode(ButtonAPin, INPUT);
    pinMode(ButtonBPin, INPUT);
    Serial.begin(9600);
}

// НАЧАЛО ЦИКЛА

void loop()
{

    //КНОПКА ПРОВЕРИТЬ
    buttonStateA = 0;
    if (digitalRead(ButtonAPin)) {
        prevA = millis();
        buttonStateA = 1;
        while ((millis() - prevA) <= DURATION_A_IN_MILLIS) {
            if (!(digitalRead(ButtonAPin))) {
                buttonStateA = 2;
                break;
            }
        }
    }

    if (!buttonStateA) {
        // Ничего не нажато
    }
    else if (buttonStateA == 1) {
        // ДЛИТЕЛЬНОЕ НАЖАТИЕ

        Serial.println("LongpressA");
        digitalWrite(A1, HIGH);
        delay(100);
    }
    else if (buttonStateA == 2) {
        //КОРОТКОЕ НАЖАТИЕ
        digitalWrite(A1, HIGH);
        Serial.println("ShortpressA");
        delay(100);
    }

    //ПРОВЕРИТЬ КНОПКУ B
    buttonStateB = 0;
    if (digitalRead(ButtonBPin)) {
        prevB = millis();
        buttonStateB = 1;
        while ((millis() - prevB) <= DURATION_B_IN_MILLIS) {
            if (!(digitalRead(ButtonBPin))) {
                buttonStateB = 2;
                break;
            }
        }
    }

    if (!buttonStateB) {
        // Ничего не нажато
    }
    else if (buttonStateB == 1) {
        //КОРОТКОЕ НАЖАТИЕ

        Serial.println("LongpressB");
        delay(100);
    }
    else if (buttonStateB == 2) {
        // ДЛИТЕЛЬНОЕ НАЖАТИЕ
        digitalWrite(A1, LOW);
        Serial.println("ShortpressB");
        delay(100);
    }
}

, 👍2

Обсуждение

У вас нет причин для вашей проблемы, поэтому это комментарий: вы поменяли местами слова LongpressB и ShortpressB в операторах последовательной печати, также рекомендуется не использовать ! оператор для целого числа (используйте buttonStateB == 0) или, что еще лучше, в вашем случае оператор switch., @Michel Keijzers

плюс за хорошо написанный вопрос, @jsotola

Какие у вас аппаратные соединения? Предполагается, что контакты кнопки находятся в состоянии HIGH при нажатии и LOW при отсутствии нажатия. Вы также не используете подтягивания/опускания, поэтому они должны быть внешними., @Maximilian Gerhardt

Я протестировал ваш код на своем Arduino Uno с двумя кнопками, которые переходят в НИЗКИЙ уровень при нажатии и вытягиваются извне, инвертировал логику в digitalRead() в коде, и он работает, как и ожидалось. Если нажатие одной кнопки вызывает срабатывание другой, я бы поискал неисправность в настройках вашего оборудования (перекрестные помехи, случайное перемыкание, неправильная полярность кнопки и т. д.). Также проблемой может быть дребезг сигнала (и его можно подавить с помощью конденсаторов)., @Maximilian Gerhardt

Всем спасибо за быстрые ответы! Я изменил положение контактов и убедился, что они не перемкнуты, к сожалению, проблема все еще существует. Должен ли я, возможно, использовать резистор между приемником и ардуино? с уважением, @Nea Yjung

Не могли бы вы отредактировать свой вопрос и добавить принципиальную схему, нарисованную на бумаге или с помощью инструмента «Схема» в меню редактирования вопроса, чтобы мы все могли видеть ваши аппаратные соединения без путаницы / предположений?, @Maximilian Gerhardt

Привет еще раз, я попытался использовать функцию схемы, но я не очень хорошо знаком с символами и электроникой, поэтому я нарисовал ее в Photoshop, надеюсь, это понятно, но извините еще раз ... http://prntscr.com/p7vc8m, @Nea Yjung

Пожалуйста, [отредактируйте](https://arduino.stackexchange.com/posts/68669/edit) свой пост, чтобы включить это изображение и техническое описание чипа RO2A sc2272., @abu-ahmed al-khatiri


1 ответ


1

Не уверен, что это просто академическое упражнение с вашей стороны (что совершенно здорово), но если вы просто пытаетесь двигаться вперед и заставить что-то работать, вы можете рассмотреть одну из многих отличных библиотек кнопок. для Ардуино.

Недавно я использовал библиотеку под названием ButtonKing, которая позволила мне выполнять очень сложные операции с меню на MKR1010 с дисплеем и одним интерфейс кнопок. Также есть несколько других библиотек, которые заботятся об устранении дребезга, длинных щелчках, двойных щелчках и т. д.

,