Поворот сервопривода в зависимости от нажатия двух кнопок

Plusheviy.los
Offline
Зарегистрирован: 20.09.2016

Всем привет! Собрался делать довольно большой проект на ардуино, но не особо пока в теме. Сервопривод должен переходить из состояния 0 градусов(первое положение) в 45(второе положение), потом в 90(третье положение). То есть у него 3 положения. Сначала он в первом. У меня 2 кнопки: при нажатии первой он должен повернуться во второе, при повторном нажатии в третье, при ещё одном во второе, то есть первая кнопка переключает 2й и 3й режим, а вторая кнопка сбрасывает из любого положения в первое положение. Я хотел использовать счётчик, но почему-то он не работает. Серво кряхтит, но то поворачивается на 90 сразу, то никуда, то в 45, а потом кряхтит... Вот мой код:

#include <Servo.h>

//объявляем переменную порта
int portServ = 9;
int portBut1 = 2;
int portBut2 =4;
int portLed = 13;
int firstPos = 0;//первое положение сервы
int partblock=45; //второе положение
int block=90; //третье положение
int counter=0; //счетчик

Servo myservo;

boolean lastButton1=LOW;
boolean currentButton1 = LOW;
boolean lastButton2=LOW;
boolean currentButton2 = LOW;

boolean ledOn1=false;

void setup() {
  // put your setup code here, to run once:
  myservo.attach(portServ); //attach our servo to the port 9
  myservo.write(0);
  
  pinMode(portBut1, INPUT);
  pinMode(portBut2, INPUT);
  pinMode(portLed, OUTPUT);
}

boolean debounce (boolean last, int button) //функция, где мы устраняем дребезг
//передаём последнее значение нажата ли кнопка.
{
  boolean current = digitalRead(button); //считываем текущее значение кнопки
  if (last!=current) //если значение последнего состояния кнопки не совпадает с текущим
  {
    delay(5); //ждём 5 мс, это мало, но хватит, чтобы кнопка узбагоилась
    current = digitalRead(button); //текущему значению присваеваем считываемое состояние кнопки
  }
  return current;//возвращаем текущее значение, вроде как то что мы чётко считали
}

void loop() {
  counter=0;
 start:
  currentButton1=debounce(lastButton1,portBut1);
  currentButton2=debounce(lastButton2,portBut2);
   
   counter=counter+1;
 
  if(currentButton1==HIGH&&counter%2==0)//нечётный счетчик
  {
     {
    ledOn1= !ledOn1;
  }
    digitalWrite(portLed, ledOn1); //собственно взаимодействие с диодом
    myservo.write(partblock);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  
   lastButton1=currentButton1; //ну и наш настояший превратился в бывшего
  lastButton2=currentButton2; //ну и наш настояший превратился в бывшего
    goto start;
  }
    
    if(currentButton1==HIGH&&counter%2!=0)
  {
     {
    ledOn1= !ledOn1;
  }
    digitalWrite(portLed, ledOn1); //собственно взаимодействие с диодом
     myservo.write(block);               // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
    lastButton1=currentButton1; //ну и наш настояший превратился в бывшего
  lastButton2=currentButton2; //ну и наш настояший превратился в бывшего
    goto start;
   
    }
   if(currentButton2==HIGH)
  {
    myservo.write(firstPos);
    
    counter=0;
    lastButton1=currentButton1; //ну и наш настояший превратился в бывшего
  lastButton2=currentButton2; //ну и наш настояший превратился в бывшего
    goto start;
  }
  
   else
   {}
   lastButton1=currentButton1; //ну и наш настояший превратился в бывшего
  lastButton2=currentButton2; //ну и наш настояший превратился в бывшего
  
}

 

 

vvadim
Offline
Зарегистрирован: 23.05.2012

заведите переменную, определяющую в каком состоянии находится ваша система, например state=0;

и научитесь кнопками менять её значения с выводом в Serial
а уже потом прилепите сервы и углы их поворота

Plusheviy.los
Offline
Зарегистрирован: 20.09.2016

Я пробовал Serial.println, (почему-то как в джаве!), но не пойму, куда выведется?(

Plusheviy.los
Offline
Зарегистрирован: 20.09.2016

Я пробовал Serial.println, (почему-то как в джаве!), но не пойму, куда выведется?(

vvadim
Offline
Зарегистрирован: 23.05.2012

вы бы на ютубе хоть ролике по азам программирования дуни посмотрели)))

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Выводит в сериал порт. В ардуино иде есть пункт в меню "монитор порта" по моему, вот туда и шлет зараза....

Plusheviy.los
Offline
Зарегистрирован: 20.09.2016

Я только там и сижу. А ещё сижу в универе на программиста... то есть по коду видно, что совсем всё плохо?..

kasper007
Offline
Зарегистрирован: 23.05.2016

строка 66  if(currentButton1==HIGH&&counter%2!=0)

наверное правильней if(currentButton1==HIGH&&counter%2!==0)

вы же все таки сравниваете, а не присваиваете.

А что, разве в нашиз ВУЗАХ программистам не выжигают из мозга оператор GOTO? Согласен его можно использовать в каких-то моментах, но не в такой же программе.

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

kasper007 пишет:

строка 66  if(currentButton1==HIGH&&counter%2!=0)

наверное правильней if(currentButton1==HIGH&&counter%2!==0)


Не правильнее, посмотрите оператор !=
Чтобы в сериал писал в сетапе напишите Serial.begin (9600);

kasper007
Offline
Зарегистрирован: 23.05.2016

Виноват, извиняюсь, что внес смуту. ! Не заметил.