Я пытаюсь управлять сервоприводом нажатием кнопки, но это не работает ПОМОГИТЕ

Я новичок в Arduino и следую этому руководству: https://www.youtube.com/watch ?v=T2HMJiy9b_I, но проблема в том, что сервопривод просто продолжает двигаться вперед и назад сам по себе, а кнопка ничего не делает при нажатии, пожалуйста, помогите.

Код:

#include <Servo.h>

Servo myservo;  // создаем сервообъект для управления сервоприводом
#define servoPin 3 //~
#define pushButtonPin 2 

int angle =90;    // начальный угол для сервопривода
int angleStep =5;
const int minAngle = 50;
const int maxAngle = 110;

int buttonPushed =0;

void setup() {
  // Демонстрация серво кнопки от Robojax.com
  Serial.begin(9600);          // установить серийный номер
  myservo.attach(servoPin);  // прикрепляем сервопривод к контакту 3 к объекту сервопривода
  pinMode(pushButtonPin,INPUT_PULLUP);
   Serial.println("Robojax Servo Button ");
}

void loop() {
  if(digitalRead(pushButtonPin) == LOW){
    buttonPushed = 1;
  }
   if( buttonPushed ){
  // изменить угол для следующего раза в цикле:
  angle = angle + angleStep;

    // реверс направления движения на концах угла:
    if (angle <= minAngle || angle >= maxAngle) {
      angleStep = -angleStep;
       buttonPushed = 0;
    }
    myservo.write(angle); // перемещаем сервопривод на нужный угол
      Serial.print("Moved to: ");
      Serial.print(angle);   // напечатать угол
      Serial.println(" degree");    
  delay(100); // ждем пока сервопривод туда доберется
   }


}

, 👍0

Обсуждение

Я разместил код: https://robojax.com/learn/arduino/?vid=robojax_Servo_PB2_move_one_direction. Мне нужна помощь с кодом, чтобы при нажатии кнопки сервопривод поворачивался от 0 до 180 градусов и останавливался, но кнопка не реагировала, а сервопривод продолжал двигаться вперед и назад., @SABLE MOTION

Отредактируйте свой вопрос. Выберите весь код и нажмите кнопку форматирования кода {}. Ваш код не читается, как опубликовано., @Duncan C

хорошо, как насчет сейчас, @SABLE MOTION

Как только вы нажмете кнопку один раз, и buttonPushed станет равным 1, сервопривод будет двигаться вечно, потому что ничто никогда не возвращает buttonPushed в 0. Вам нужно еще, чтобы установить его обратно в 0., @Delta_G

извините, но я действительно не знаю, как это сделать. :(, @SABLE MOTION

Также вы должны использовать подтягивающий резистор, если это еще не сделано., @Michel Keijzers

На самом деле этот код устанавливает buttonPushed в 0, когда угол достигает одного из пределов. Из этого кода я ожидаю, что сервопривод перейдет к одному из своих пределов и остановится, если вы нажмете кнопку в течение очень короткого времени. Пока вы удерживаете кнопку нажатой, я ожидаю, что сервопривод будет двигаться вперед и назад., @Duncan C

Похоже, что кнопка подключена через контакт к земле и использует режим INPUT_PULLUP на контакте. Это должно сработать. Пока вы удерживаете кнопку, сервопривод должен двигаться вперед и назад. Когда вы отпускаете кнопку, она должна останавливаться почти сразу (в течение 1/10 секунды)., @Duncan C

я разместил некоторый код, который показывает, как определить, что кнопка нажата в тот момент, когда вы ее нажимаете, но он не продолжает обнаруживать нажатие кнопки, если вы удерживаете кнопку.... https://arduino.stackexchange.com/questions /74876/последовательность перезапуска неопиксельного стика с помощью кнопки в любое время/74949#74949, @jsotola


1 ответ


-1

Это условие ниже никогда не выполняется, поскольку подразумевается логическое сравнение:

if( buttonPushed ){

и buttonPushed объявляется как :

int buttonPushed =0;

Правильное сравнение должно быть допустимым:

if( buttonPushed == 1) 
{ 
   // Сделать что-нибудь
}

Кроме того, кнопки нуждаются в надлежащем устранении дребезга, иначе push-событие будет иметь незаметные результаты:

https://dduino.blogspot.com/2012/03/arduino-button-debouncing .html

,

C++ будет рассматривать любое ненулевое значение как истинное, а 0 — как ложное. Совершенно законно использовать int внутри оператора if таким образом. Если вы хотите, я могу опубликовать демонстрационный код, чтобы доказать это. Это не лучший стиль кодирования, но он не приведет к сбою., @Delta_G

Оператор if работает с целыми числами!, @Sim Son

Mea culpa вы правы: https://www.arduino.cc/reference/en/language/variables/constants/constants/, @skourkos