Управление сервоприводом по нажатию кнопки

Привет всем помогите с кодом .
суть кода заключаться в том что -
по нажатию кнопки сервопривод делает оборот от 0 до 90 градусов и возвращается в нулевое положение работает !
*нужно ! по повторному нажатию кнопки серво вернулся в нулевую точку и замер *(не получается осуществить умельцы помогите с кодом)



#include <Servo.h>
#include <ezButton.h>

#define LOOP_STATE_STOPPED 0
#define LOOP_STATE_STARTED 1




ezButton button(7);  // create ezButton object that attach to pin 7;
int loopState = LOOP_STATE_STOPPED;


Servo servo;                 // создайте сервообъект для управления сервоприводом


int angle = 0; // Текущий угол наклона серводвигателя

void setup() {
  Serial.begin(9600);         // Инициализируйте последовательный порт для связи с последовательным монитором.
  button.setDebounceTime(50); // установите время восстановления равным 50 миллисекундам
  servo.attach(9);    // прикрепляет сервопривод на штифте 9 к объекту сервопривода

  
}

void loop() {
  button.loop(); // СНАЧАЛА необходимо вызвать функцию loop()

  if(button.isPressed() ) {
   
     if (loopState == LOOP_STATE_STOPPED)
      loopState = LOOP_STATE_STARTED;
    else // if(loopState == LOOP_STATE_STARTED)
      loopState = LOOP_STATE_STOPPED;
  }

  if (loopState == LOOP_STATE_STARTED) {
 

  servo.write(0);
  delay(500);
 
     servo.write(90);
  delay(5000);

  
  }
 
  }


сорри не дописал …
по первому нажатию кнопки от 0 - 90 градусов цикл повторяется бесконечно по этому для того чтоб цикл остановить нужно допилить код
чтоб по первому щелку кнопки цикл запускался как есть по второму щелчку цикл останавливался и по сл. щелчку опять можно было цикл запустить

Звучит как платный заказ

я буду очень благодарен если подскажите в каком направлении копать

Нормально код вставил с первого раза. Уже только это похвалы достойно )))


Краткое описание: По нажатию кнопки мы изменяем значение переменной mode, что переводится никак иначе как “режим работы” (по крайней мере я её так перевёл). Первоначальное значение равно нулю - в этом режиме программа (как видно из кода) ничего не делает. В первом режиме - постоянный “цикл” 90-0-90-0 и т.д. Во втором режиме - 0-90 стоп.

Пробуй:

#include <Servo.h>
#include <ezButton.h>

ezButton button(7);             // create ezButton object that attach to pin 7;
uint8_t  mode = 0;

#define  DELAY_ANGLE   500     // Задержка для поворода сервопривода

Servo servo;                    // создайте сервообъект для управления сервоприводом

void setup() {
  Serial.begin(9600);           // Инициализируйте последовательный порт для связи с последовательным монитором.
  button.setDebounceTime(50);   // установите время восстановления равным 50 миллисекундам
  servo.attach(9);              // прикрепляет сервопривод на штифте 9 к объекту сервопривода
}

void loop() {
  button.loop();                // СНАЧАЛА необходимо вызвать функцию loop()
  if (button.isPressed() ) {
    mode++;
  }
  if (mode == 1) {
    servo.write(90);
    delay(DELAY_ANGLE);
    servo.write(0);
    delay(DELAY_ANGLE);
  }
  if (mode == 2) {
    mode = 0;
    servo.write(90);
    delay(DELAY_ANGLE);
    servo.write(0);
    delay(DELAY_ANGLE);
  }
}

Я только не знаю - 500мс точно сервоприводу хватит повернуться на 90гр?
Надо это значение подобрать опытным путем.

спасибо второй режим работает первый нет

Как это?
Загружаешь код в ардуину, сервопривод должен чуть дернуть и всё.
Потом нажимаешь на кнопку один раз и что происходит?

работает да серво дергается и все по нажатию кнопки уходит на 90 градусов потом на 0 после опять на 90 градусов и тишина

Ну смотри механику сервопривода, питание его или еще что. В коде всё верно написано: Пока (mode == 1) будет в цикле поворачиваться на 90-0-90-0 и тд.

А кнопка как подключена?

Краткое описание: По нажатию кнопки мы изменяем значение переменной mode, что переводится никак иначе как “режим работы” (по крайней мере я её так перевёл). Первоначальное значение равно нулю - в этом режиме программа (как видно из кода) ничего не делает. В первом режиме - постоянный “цикл” 90-0-90-0 и т.д. Во втором режиме - 0-90 стоп.

объясните как работает второй режим по тому как по одинарному щелчку по кнопке серво двигается два раза от 0-90 стоп

кнопка подключена на GND и на 7 пин

Тогда я не вижу ошибок в коде @BOOM

Добавьте вывод mode в Сериал и посмотрите, как он меняется при нажатии кнопки

1 лайк

извините я новичок в arduino подскажите как это сделать

В коде этого нет. Как только Вы нажали на кнопку, mode увеличивается на единицу и становится равным 2. По условию если mode равен 2 - сразу меняем его значение на ноль и делаем один раз «туды сюды».

Serial.begin(mode);
так ?

Прошейте этот код, запустите Сериал Монитор и акууратно нажмите на кнопку сначала один раз, а потом второй.
Выложите в форум что напечается в Мониторе

#include <Servo.h>
#include <ezButton.h>

ezButton button(7);             // create ezButton object that attach to pin 7;
uint8_t  mode = 0;
uint8_t  old_mode = 0;

#define  DELAY_ANGLE   500     // Задержка для поворода сервопривода

Servo servo;                    // создайте сервообъект для управления сервоприводом

void setup() {
  Serial.begin(9600);           // Инициализируйте последовательный порт для связи с последовательным монитором.
  button.setDebounceTime(50);   // установите время восстановления равным 50 миллисекундам
  servo.attach(9);              // прикрепляет сервопривод на штифте 9 к объекту сервопривода
 Serial.print("Mode = ");
 Serial.println(mode);
}

void loop() {
  button.loop();                // СНАЧАЛА необходимо вызвать функцию loop()
  if (button.isPressed() ) {
    mode++;
  }
if (mode != old_mode) {
 Serial.print("Mode changed to = ");
 Serial.println(mode);
 old_mode = mode;
}
  if (mode == 1) {
    servo.write(90);
    delay(DELAY_ANGLE);
    servo.write(0);
    delay(DELAY_ANGLE);
  }
  if (mode == 2) {
    mode = 0;
    servo.write(90);
    delay(DELAY_ANGLE);
    servo.write(0);
    delay(DELAY_ANGLE);
  }
}

Serial.begin(mode);
так ?

не, не так.

Я вам код дал