Выполнять код только один раз
Я пытаюсь создать оператор if, который запускается только один раз, при первом запуске цикла void, и после этого переключается на другой код. Но следующее выполняет только stepper1a(). Любая помощь будет здорово. Спасибо!
int var;
int var2;
bool executed = false;
const int M1dirpin = 4; //Пин шагового направления
const int M1steppin = 5; // Шаговый штифт
void setup() {
pinMode(A2,INPUT);
pinMode(M1dirpin,OUTPUT);
pinMode(M1steppin,OUTPUT);
Serial.begin(9600);
}
void stepper1() {
int j;
delayMicroseconds(10);
digitalWrite(M1dirpin,HIGH);
for(j=0;j<=200;j++){
digitalWrite(M1steppin,LOW);
delayMicroseconds(10);
digitalWrite(M1steppin,HIGH);
delay(2);
}
}
void stepper1a() {
int j;
delayMicroseconds(10);
digitalWrite(M1dirpin,HIGH);
for(j=0;j<=1600;j++){
digitalWrite(M1steppin,LOW);
delayMicroseconds(10);
digitalWrite(M1steppin,HIGH);
delay(2);
}
}
void loop() {
if (executed == false) {
var = analogRead(A2);
delay(10);
if (var > 500) {
stepper1a();
delay(2000);
executed = true;
Serial.println("turned 1600");
Serial.println(executed);
}
else if (executed == true) {
var2 = analogRead(A2);
delay(10);
if (var > 500) {
stepper1();
delay(2000);
Serial.println("turned 200");
}
}
}
}
Обновлен цикл пустоты:
void loop() {
static bool yes_we_did_the_one_time_job = false;
if (yes_we_did_the_one_time_job) {
var = analogRead(A2);
delay(10);
if (var > 500) {
stepper2();
delay(2000);
Serial.println("turned 1600");
}
}
else {
var2 = analogRead(A2);
delay(10);
if (var > 500) {
stepper1();
delay(2000);
Serial.println("turned 200");
yes_we_did_the_one_time_job = true;
}
}
}
Теперь это работает, спасибо !!!:
void loop() {
static bool yeswedid = false;
if(yeswedid) {
if(analogRead(A2) > 500) {
stepper1();
stepper2();
}
}
else {
if(analogRead(A2) > 500) {
stepper1();
yeswedid = true;
}
}
}
@digit, 👍1
Обсуждение2 ответа
Лучший ответ:
Общее решение:
void loop() {
static bool yes_we_did_the_one_time_job = false;
if (yes_we_did_the_one_time_job) {
do_the_other_jobs();
} else {
do_the_one_time_job();
yes_we_did_the_one_time_job = true;
}
}
если это то, что вы предлагаете, это не сработало:, @digit
см. обновленный вопрос. Спасибо за вашу помощь, @digit
@digit: Re «_это не сработало_»: вы не совсем реализовали мое предложение. Внимательно прочитайте свой код, и вы увидите, что он не эквивалентен тому, что я разместил здесь., @Edgar Bonet
отличное решение спасибо чувак!, @digit
Если у вас есть код, который вы хотите запустить только один раз в начале вашей программы, вы можете использовать метод setup()
. На самом деле он может делать гораздо больше, чем просто настраивать контакты и значения по умолчанию.
Код основной функции Arduino (main.cpp ) выглядит так:
int main(void)
{
//(...) Я вырезал кое-что отсюда
настраивать();
для (;;) {
петля();
если (serialEventRun) serialEventRun();
}
вернуть 0;
}
Как видите, setup()
— это просто метод, который может делать почти то же самое, что и loop()
.
Метод setup()
может фактически содержать цикл for(;;)
, который остановит программу от выполнения loop()
метод. Изнутри вы можете проверить значение датчика и разорвать
его при выполнении условия.
int main(void)
{
//(...) I cut some stuff from here
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
в этом случае loop()
очень прост:
void setup()
{
for (;;)
{
var = analogRead(A2);
delay(10);
if (var > 500) {
stepper1();
delay(2000);
Serial.println("turned 200");
break;
}
}
}
Он должен реагировать на датчик в пустом цикле и не запускаться один раз при запуске. Спасибо., @digit
только один раз, но после выполнения начального условия. код OP можно использовать, отсутствует только {, @Juraj
- Как я могу использовать степпер для определенной степени?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Шаговый двигатель не поворачивается/не поворачивается против часовой стрелки
- Шаговый двигатель с концевыми выключателями
- Запустить два степпера одновременно
- Попытка понять постоянную скорость AccelStepper
- Шаговый двигатель - концевой выключатель положения
- Могу ли я запретить библиотеке Stepper удерживать двигатель?
у вас опечатка.
else if (executed == true) {
else toif (var > 500) {
, а неif (executed == false) {
. добавьте один } передelse if (executed == true) {
и удалите один } в конце, @Jurajи
if (выполнено) {} else {}
было бы чище, @JurajВаш обновленный код по-прежнему неверен. У вас есть код, который устанавливает для yes_we_did_the_one_time_job значение true внутри второго оператора if, что означает, что он не будет установлен до тех пор, пока не будет установлено
var > 500
., @Duncan C@DuncanC, это цель, насколько я понимаю. Подождите, пока AnalogRead в первый раз не достигнет 500, а затем выполните специальное движение инициализации. потому что без условия его можно было бы выполнить в setup(), @Juraj
@digit — вопрос относительно вашего кода «Обновленный цикл недействительности:». Код
if (var > 500) {
в оператореelse
должен бытьvar
илиvar2
?, @VE7JRO