Переключение режима управления с помощью второй кнопки

Changeless
Offline
Зарегистрирован: 29.11.2020

Здравствуйте форумчане.

Очень долго мучаюсь с одним кодом

Вообщем задача следующая: Одна кнопка перемещает сервопривод по 3 положением, во время этого идёт индикация с помощью RBG, и есть управление сервоприводом с помощью потенциометра. И нужно сделать вторую кнопку, чтобы переключаться между режимами, имею ввиду нажал кнопку2 и идёт управление по 3 положением кнопкой1, ну а когда нажимаешь кнопку2 еще раз управляешь сервоприводом с помощью потенциометра.

Сейчас же это всё работает одновременно, но потенциометр поворачивается лишь когда нажмёшь на кнопку2(а нужно свободно)

 

Код: 

#include <Servo.h>
 
Servo s1;
 
float a = 0.1759;
float k = 0.48816;
float b = - 49.76331;
int button_state = 0;
int button_pin = 10;
int servo_position = 0;
int PIN_LED_RED = 3;
int PIN_LED_GREEN = 2;
int PIN_LED_BLUE = 4;
int switch_button = 11;
const int switch_position = 0;
int switch_state = 0;
const int POT=5;
int valpot = 0;
int angleServo = 0;
 
 
void setup() 
{
  s1.attach(6);
  Serial.begin(9600);
  pinMode(6,OUTPUT);
  pinMode(10,INPUT);
  pinMode(11,INPUT);
  pinMode(PIN_LED_RED,OUTPUT);
  pinMode(PIN_LED_GREEN,OUTPUT);
  pinMode(PIN_LED_BLUE,OUTPUT);
}
 
 
void loop()
  button_state = digitalRead(button_pin);
  switch_state = digitalRead(switch_button);
  
  if(switch_state == HIGH )
  {
valpot = analogRead(POT);
    {
angleServo=map(valpot,0,1023,0,180);
s1.write(angleServo);
delay(15);
    }
   }
  
  if (button_state == HIGH ){
  servo_position++;
  delay(500);
  if (servo_position == 3){
  servo_position = 0;
 
  }
  
  if (servo_position == 0){
  s1.write (50);
  digitalWrite(PIN_LED_BLUE, 0);
  digitalWrite(PIN_LED_GREEN, 1);
  digitalWrite(PIN_LED_RED, 0);
 
  }
 
  if (servo_position == 1){
  s1.write (90);
  digitalWrite(PIN_LED_BLUE, 1);
  digitalWrite(PIN_LED_GREEN, 0);
  digitalWrite(PIN_LED_RED, 0);
  
  }
  
  if (servo_position == 2){
  s1.write (130);
  digitalWrite(PIN_LED_BLUE, 0);
  digitalWrite(PIN_LED_GREEN, 0);
  digitalWrite(PIN_LED_RED, 1);
 
  }
  }
}
 
v258
Offline
Зарегистрирован: 25.05.2020

Во-первых, вставьте код как положено, без форматирования и нумерации строк его читать никто не будет, а во-вторых вы же так и задали - работа с потенциометром только при нажатой кнопке. А нужно, видимо, сделать четвертый режим, в который и переключаться второй кнопкой. И в котором управлять сервой потенциометром.

vde69
Offline
Зарегистрирован: 10.01.2016

Во первых используй старое положение кнопки, во вторых все кнопки имеют дребезг. Почитай про железный велосипед  (класс кнопок) или просто посмотри как в проектах сделано у других, например


  boolean buttonState = digitalRead(pinKey);

  if (!buttonState) {
    // кнопка отжата, обновим время и статус
    time_loop_key = time_loop;
    status_key = false;
  } else if (!status_key) {
    // кнопка нажата, но это первый цикл
    time_loop_key = time_loop;
    status_key = true;
  } else if (getDelayTime(time_loop_key, time_loop) > pauseKey) {
    // кнопка зажата давно, изменим режим и начнем считать заново
    time_loop_key = time_loop;
    status_key = false;
  }

 

далее как тут уже говорили тебе нужна ВТОРАЯ переменная которая принимает 3 статуса

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

Changeless пишет:
но потенциометр поворачивается лишь когда нажмёшь на кнопку2(а нужно свободно)

А когда не нажимаешь, он чем-то заклинен? Почему не поворачивается?

Changeless
Offline
Зарегистрирован: 29.11.2020

Спасибо большое! Сделаем!)