Как повторить конкретный код в Void loop() количество раз

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

#include <SPI.h>
#include <Wire.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

int Extension = A0 ;
int Extension_value ;
int Flexion = A1 ;
int Flexion_value ;
//int Pot_speed = A2 ;
int pot_position = A2 ;
int position_value ;

int forward = 11 ;
int forward_state ;
int reverse = 12 ;
int reverse_state;

int s_limit = 2 ;
int e_limit = 3 ;

bool done = false ;

int up = 4 ;
int dn = 5 ;
int sel = 6 ;
int fwd = 7 ;
int rev = 8 ;

int button1 = 0 ;
int button2 = 0 ;
int count_value = 0 ;
int prestate = 0 ;

int button3 = 0 ;
int button4 = 0 ;
int button5 = 0 ;

int sel_prestate = 0 ;
int fwd_prestate = 0 ;
int rev_prestate = 0 ;

int sel_state = 0 ;
int fwd_state = 0 ;
int rev_state = 0 ;

void setup() {

    lcd.init();
    lcd.backlight();

///////////////////////////HOMING//////////////////

homing();

///////////////////INPUT OUTPUT//////////////////
  pinMode (Extension , INPUT) ;
  pinMode (Flexion , INPUT) ;
  pinMode (pot_position , INPUT) ;
  pinMode (up , INPUT) ;
  pinMode (dn , INPUT) ;
  pinMode (sel , INPUT) ;
  pinMode (fwd , INPUT) ;
  pinMode (rev , INPUT) ;
  pinMode (forward , OUTPUT) ;
  pinMode (reverse , OUTPUT) ;
  
   
  Serial.begin(115200);

digitalWrite (reverse , LOW);
digitalWrite (forward ,LOW);
}

void loop() {

 button1 = digitalRead (up) ;
 button2 = digitalRead (dn) ;
 button3 = digitalRead (sel) ;
 button4 = digitalRead (fwd) ;
 button5 = digitalRead (rev) ;
 
///////////////////Buttons////////////////////////////

if (button1 == HIGH && prestate == 0) {
    count_value++;  
    prestate = 1;
  }
else if (button2 == HIGH && prestate == 0) {
    count_value--;
    prestate = 1;
  } 
 else if(button1 == LOW && button2 == LOW) {
    prestate = 0;
  }
if(count_value<0){
count_value = 0;
}

//////////////mapping and displaying pot values ////////////////////////////
  Extension_value = analogRead (Extension) ;
  Extension_value = map(Extension_value, 0, 1023, 0, 120) ;
  Flexion_value = analogRead (Flexion) ;
  Flexion_value = map(Flexion_value, 0, 1023, 0, 120) ;
  position_value = analogRead (pot_position) ;
  position_value = map(position_value, 0, 1023, 0, 120) ;
/////////////////////////////LCD PRINT/////////////////////////////////////
lcd.setCursor(0,0);
lcd.print("Ex:");
lcd.print (Extension_value);
lcd.setCursor(7,0);
lcd.print("Fx:");
lcd.print(Flexion_value);

lcd.setCursor(0,1);
lcd.print("ExAngle:");
lcd.print(position_value);
lcd.print(" Rp:");
lcd.print(count_value);
////////////////////////// NEW CODE //////////////////////////////////////////

if (button3 == HIGH && sel_prestate == 0){
    sel_state = 1 ;
  }

//////////////////////// Motor Movement //////////////////////////////////////

     if (sel_state > 0 ){
      movemotor();
    }
   
//////////////////////////////////////////////////////////////////////////
//count_value = count_value  - 1  ;

}
//////////////// Homing Function////////////////////////
void homing()
{
  while(digitalRead(s_limit)== HIGH){
        digitalWrite(reverse , HIGH);
        lcd.setCursor(0, 0);
        lcd.print("INITIALISING PLS ");
        lcd.setCursor (0 ,1);
        lcd.print("WAIT.......");
    delay(200);
        lcd.clear();
}
}
/////////////// Motor Movement//////////////////////////  
 void movemotor()
 {
    if (Flexion_value < position_value){
      digitalWrite (reverse , HIGH);
      digitalWrite (forward , LOW);
}

    if (Extension_value > position_value){
      digitalWrite (forward , HIGH);
      digitalWrite (reverse , LOW);
}
 }
////////////////////////////////////////////////////////////////

я хочу повторить ///// Моторное движение//////////// часть count_value количество раз ... и предложения были бы полезны, я пытался использовать цикл while, но вход потенциометра зависал , также пытался использовать цикл for, но, похоже, это не работает

    //////////////////////// Моторное движение //////////////////////////////////////

     **if (sel_state > 0 ){
      movemotor();
    }**
  //////////////////////////////////

, 👍-1

Обсуждение

Неясно , что вы подразумеваете под "повторением " ... нет числа раз". Выполнение функции movemotor() занимает очень мало времени (вероятно, несколько миллисекунд). Так что повторение этого действия 5 раз не даст большого эффекта. Чего вы пытаетесь здесь добиться?, @chrisl

полная функция для выполнения означает, что предположим, что ex равно 20, а fx равно 100, поэтому после вызова этой функции двигатель перемещается от 20 до 100, а затем снова обратно от 100 до 20, И ДЛЯ ЗАВЕРШЕНИЯ ЭТОГО ПОТРЕБУЕТСЯ ПРИМЕРНО от 15 до 20 СЕКУНД Ясно???, @VOID seekers

могу ли я разместить здесь фотографии?? и каким образом ??, @VOID seekers

В редакторе вопросов есть кнопка для включения изображений. На кнопке изображены солнце и горы. Когда вы нажимаете на него, вы можете перетаскивать на него изображения со своего компьютера., @chrisl


1 ответ


0

С вашим текущим кодом движение вперед и назад уже должно повторяться вечно. Чтобы уменьшить это до фиксированного числа раз, вы можете определить переменную счетчика, увеличить ее в movemotor() при изменении направления для обеих сторон или только для одной из них (в зависимости от того, как вы хотите считать) и выполнить movemotor() только в том случае, если переменная счетчика находится ниже целевого значения. Итак, что-то вроде этого:

Введите переменную counter и нацелитесь на глобальную область видимости (в данном случае для повторения 5 раз):

int movement_counter = 0;
int movement_target_number = 5;

Затем в loop() добавьте условие if для выполнения movemotor() только под movement_target_number:

if (sel_state > 0 && movement_counter < movement_target_number){ движитель(); }

И теперь нам нужно только увеличить movement_counter внутри movemotor(). В этом случае мы увеличиваем счетчик при каждом полном движении вперед и назад:

void movemotor()
{
  if (Flexion_value < position_value){
    digitalWrite (reverse , HIGH);
    digitalWrite (forward , LOW);
    movement_counter++;
  }
  if (Extension_value > position_value){
    digitalWrite (forward , HIGH);
    digitalWrite (reverse , LOW);
  }
}

Вы можете изменить movement_target_number по своему вкусу, и вы также можете сбросить movement_counter в какой-то момент вашей программы, чтобы снова переместиться.

,

он по-прежнему продолжает зацикливаться вечно вместо того, чтобы зацикливаться 5 раз, @VOID seekers

он все еще продолжает зацикливаться вечно вместо того, чтобы зацикливаться 5 раз, я отслеживаю значение счетчика движения, оно остается 5, не увеличивается с 0, оно сразу доходит до 5, @VOID seekers