Как повторить конкретный код в 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();
}**
//////////////////////////////////
@VOID seekers, 👍-1
Обсуждение1 ответ
С вашим текущим кодом движение вперед и назад уже должно повторяться вечно. Чтобы уменьшить это до фиксированного числа раз, вы можете определить переменную счетчика, увеличить ее в 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
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- как быстро loop() работает в Arduino
- Использовать Arduino Nano V3 для программирования другого Arduino (Pro Mini)?
- Как прочитать значение PIN PWM-выхода?
- Как мигать светодиодом и одновременно запускать другой код?
- Подключение Arduino Nano к Raspberry Pi Zero
- Как автоматически сбросить модуль NRF24L01
- Программа Nano Every с использованием порта UPDI
Неясно , что вы подразумеваете под "повторением " ... нет числа раз". Выполнение функции
movemotor()
занимает очень мало времени (вероятно, несколько миллисекунд). Так что повторение этого действия 5 раз не даст большого эффекта. Чего вы пытаетесь здесь добиться?, @chrislполная функция для выполнения означает, что предположим, что ex равно 20, а fx равно 100, поэтому после вызова этой функции двигатель перемещается от 20 до 100, а затем снова обратно от 100 до 20, И ДЛЯ ЗАВЕРШЕНИЯ ЭТОГО ПОТРЕБУЕТСЯ ПРИМЕРНО от 15 до 20 СЕКУНД Ясно???, @VOID seekers
могу ли я разместить здесь фотографии?? и каким образом ??, @VOID seekers
В редакторе вопросов есть кнопка для включения изображений. На кнопке изображены солнце и горы. Когда вы нажимаете на него, вы можете перетаскивать на него изображения со своего компьютера., @chrisl