Как управлять состоянием кнопки

Экстремальный новичок здесь ... Я использую Arduino Uno и PCA9685 16 Ch. Плата драйвера для управления сервоприводами с помощью кнопки и светодиодной обратной связи. Когда я нажимаю кнопку, сервопривод двигается, но когда я отпускаю кнопку, сервопривод возвращается в исходное положение. Я бы хотел, чтобы когда я нажимаю кнопку один раз, сервопривод перемещался и удерживал свое положение. Когда я снова нажимаю кнопку, возвращаюсь в исходное положение. Заранее спасибо за помощь.

Вот скетч:

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

int buttonPin0 = 2;   // Можно добавить столько кнопок, сколько нужно
int ledPin0C = 3;     // C обозначает закрытую позицию стрелочного перевода
int ledPin0T = 4;     // T обозначает брошенное положение стрелочного перевода
int buttonState0 = 0;

int buttonPin1 = 5;
int ledPin1C = 6;
int ledPin1T = 7;
int buttonState1 = 0;

void setup() {
    Serial.begin(9600);
    Serial.println("pca9685_TurnoutFinal!");
    pwm.begin();
    pwm.setPWMFreq(60);
    delay(30);

    pinMode(ledPin0C, OUTPUT);
    pinMode(ledPin0T, OUTPUT);
    pinMode(buttonPin0, INPUT);
    pinMode(ledPin1C, OUTPUT);
    pinMode(ledPin1T, OUTPUT);
    pinMode(buttonPin1, INPUT);
}

void loop() {
    ///////////
    buttonState0 = digitalRead(buttonPin0);
    if (buttonState0 == HIGH) {
        pwm.setPWM(0, 0, 370);
        digitalWrite(ledPin0T, LOW);
        digitalWrite(ledPin0C, HIGH);
    }
    else {
        pwm.setPWM(0, 0, 285);
        digitalWrite(ledPin0C, LOW);
        digitalWrite(ledPin0T, HIGH);
    }
    //////////
    buttonState1 = digitalRead(buttonPin1);
    if (buttonState1 == HIGH) {
        pwm.setPWM(1, 0, 370);
        digitalWrite(ledPin1T, LOW);
        digitalWrite(ledPin1C, HIGH);
    }
    else  {
        pwm.setPWM(1, 0, 285);
        digitalWrite(ledPin1C, LOW);
        digitalWrite(ledPin1T, HIGH);
    }
    //////////
}

, 👍-1


1 ответ


0

Код в цикле всегда выполняется, поэтому, когда вы отпускаете кнопку, код видит это как digitalRead(btn) = HIGH.

Вам нужна переменная состояния, чтобы знать, где в данный момент находится двигатель. Что-то вроде этого:

boolean state = false;
int oldButton = HIGH;

void loop() {
    delay(20); // достаточно для устранения дребезга большинства кнопок

    int newButton = digitalRead(buttonPin0);
    if (oldButton == HIGH && newButton == LOW) { // только когда кнопка меняется с "отпущена" на "нажата"
        state = !state;

        // сообщаем сервоприводу, куда идти
        if (state) {
            pwm.setPWM(0, 0, 370);
        } else {
            pwm.setPWM(0, 0, 285);
        }
    }
    oldButton = newButton;
}
,

Спасибо... Попробую разобраться, куда он идет., @Wayne Hensley

Также учитывайте дребезг кнопок., @Michel Keijzers

Мишель, не могли бы вы подробнее рассказать о подпрыгивании кнопок?, @Wayne Hensley

Не обращайте внимания на Мишеля ... Я немного почитал и теперь знаю, что это такое ... не уверен, повлияет ли это на мой проект, но еще раз спасибо, что сообщили мне об этом., @Wayne Hensley