Переключение режимов кнопкой

1peace
Offline
Зарегистрирован: 04.04.2020

Здравствуйте, как сделать кнопку на удержание?

мне нужно переключать режимы работы двигателей одной кнопкой, при этом, второй режим работы нужно настроить как-то на удержание, то есть: пока кнопка нажата - двигатели не работают.

в целом, все это должно выглядеть так: подключаю ардуинку к питанию через USB порт, двигатели не работают, затем, нажимаю кнопку - двигатели работают, крутятся вперед. Нажимаю второй раз кнопку и обязательно удерживаю её - двигатели останавливаются до тех пор, пока я не отпущу кнопку. Если я отпускаю кнопку двигатели крутятся в обратную сторону

(А1, В1 отвечают за движение вперед, А2 В2 - за движение назад)

пока удалось создать просто переключение режимов кнопкой, то есть одно нажатие - движки работают, второе, не работают, третье - работают в обратную сторону)

 

Moderator : пожалуйста, вставьте код правильно (возможно, новым сообщением в тему), 

 
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Топик "Титановый велосипед" почитай - там есть класс для кнопки, у которого есть нужный функционал.

1peace
Offline
Зарегистрирован: 04.04.2020

Что-то еще менее понятно стало, есть где попроще? а то я совсем зеленый в этом деле..

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1peace пишет:

есть где попроще?

Для начала, прочитайте обязательную для всех новичков тему и "зайдите, как положено".

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Можете попробовать но без антидребезга может работать не стабильно. 


int button1 = 10; 

const int motorB1 = 8; 
const int motorB2 = 9; 
const int motorA1 = 11; 
const int motorA2 = 12; 
bool flag = 0;
uint8_t regim = 0;
uint8_t temp_regim = 0;
 
void setup() {
Serial.begin(9600);
pinMode(motorB1, OUTPUT);
pinMode(motorB2, OUTPUT);
pinMode(motorA1, OUTPUT);
pinMode(motorA2, OUTPUT);
pinMode(button1, INPUT);
}
 
void loop() {
  if (digitalRead(button1) == LOW && flag == 0)
  {
    temp_regim = regim;
    regim = 0;
    flag = 1;
  }
  if (digitalRead(button1) == HIGH && flag == 1)
    {
      flag = 0;
      if(temp_regim == 1)regim = 2;
      else regim = 1;
    }
 
  if (regim == 1)
  {
  Serial.print("regim == 0");
  digitalWrite(motorB1, HIGH);
  digitalWrite(motorB2, LOW);
  digitalWrite(motorA1, HIGH);
  digitalWrite(motorA2, LOW);
  }
 
  if (regim == 0)
  {
  Serial.print("regim == 1");
  digitalWrite(motorB1, LOW);
  digitalWrite(motorB2, LOW);
  digitalWrite(motorA1, LOW);
  digitalWrite(motorA2, LOW);
  }
 
  if (regim == 2)
  {
  Serial.print("regim == 2");
  digitalWrite(motorB1, LOW);
  digitalWrite(motorB2, HIGH);
  digitalWrite(motorA1, LOW);
  digitalWrite(motorA2, HIGH);
  }
}

 

1peace
Offline
Зарегистрирован: 04.04.2020
int button1 = 10; 
const int motorB1 = 8; 
const int motorB2 = 9; 
const int motorA1 = 11; 
const int motorA2 = 12; 
int flag = 0;
int regim = 0;



void setup() {

Serial.begin(9600);
pinMode(motorB1, OUTPUT);
pinMode(motorB2, OUTPUT);
pinMode(motorA1, OUTPUT);
pinMode(motorA2, OUTPUT);
pinMode(button1, INPUT);

}


void loop() {

  if (digitalRead(button1) == LOW && flag == 0)
  {
    regim++;
    flag = 1;

    if(regim > 3)
    {
      regim = 0;
    }
  }

  if (digitalRead(button1) == HIGH && flag == 1)
    {
      flag = 0;
    }
  if (digitalRead(button1) == HIGH && flag == 0)
  {
    
  }
  if (regim == 0)
  {
  Serial.print("regim == 0");
  digitalWrite(motorB1, HIGH);
  digitalWrite(motorB2, LOW);
  digitalWrite(motorA1, HIGH);
  digitalWrite(motorA2, LOW);
  }

  if (regim == 1)
  {
  Serial.print("regim == 1");
  digitalWrite(motorB1, LOW);
  digitalWrite(motorB2, LOW);
  digitalWrite(motorA1, LOW);
  digitalWrite(motorA2, LOW);
  }


  if (regim == 2)
  {
  Serial.print("regim == 2");
  digitalWrite(motorB1, LOW);
  digitalWrite(motorB2, HIGH);
  digitalWrite(motorA1, LOW);
  digitalWrite(motorA2, HIGH);
  }

  if (regim == 3)
  {
  Serial.print("regim == 3");
  digitalWrite(motorB1, LOW);
  digitalWrite(motorB2, LOW);
  digitalWrite(motorA1, LOW);
  digitalWrite(motorA2, LOW);
  }

}

 

1peace
Offline
Зарегистрирован: 04.04.2020

Теперь код вроде бы работает, но после удержания кнопки, перекидывает в первый режим, а при повторном удержании в 3ий, минуя второй

b707
Offline
Зарегистрирован: 26.05.2017

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