Код Arduino IDE, который необходимо остановить после заданного количества «оборотов».
У нас есть код Arduino IDE, который приводит в движение пластину на ходовом винте, приводимую в движение шаговым двигателем, вперед и назад.
У нас ходовой винт перемещается на 8 мм в одном направлении, затем на 8 мм в противоположном направлении, что дает общее смещение 16 мм. После этого движения у нас есть счетчик, который затем будет считаться за 1 «оборот». по сути. По достижении указанного количества программа остановится.
В настоящее время программа продолжает работать неопределенное время. Любая помощь/предложения будут оценены по достоинству.
// Подключаем библиотеку AccelStepper:
#include <AccelStepper.h>
// Определить соединения шагового двигателя и тип интерфейса двигателя.
// Тип интерфейса двигателя должен быть установлен на 1 при использовании драйвера:
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1
// Создаем новый экземпляр класса AccelStepper:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
void setup() {
// Устанавливаем максимальную скорость и ускорение:
stepper.setMaxSpeed(40000);
stepper.setAcceleration(20000);
}
void loop() {
static int counter = 0; // Инициализируем переменную-счетчик и начинаем с 0
// Устанавливаем целевую позицию:
stepper.moveTo(400); // находится в шагах. установка по умолчанию
// Бежим к целевой позиции с заданной скоростью и ускорением/замедлением:
stepper.runToPosition();
delay(0);
// Возвращаемся к нулю:
stepper.moveTo(0);
stepper.runToPosition();
delay(0); //микросекунды
counter++; //добавляет 1 к счетчику
if (counter >= 2) {
return; //выходим из цикла
}
}
@Noah Smith, 👍2
Обсуждение1 ответ
if (counter >= 2) {
return; //выходим из цикла
}
Инструкция return завершит цикл, но функция цикла вызывается снова и снова. Так что все начнется сначала.
Здесь есть несколько возможностей. Вы можете заменить оператор return
на while(1);
, который заблокирует выполнение до тех пор, пока плата не будет перезагружена.
Если вам не нужно, чтобы функция цикла когда-либо повторялась, вы можете просто переместить весь свой код в функцию настройки, поскольку она будет выполняться только один раз. Тогда функция цикла может быть просто пустой.
И, наконец, вы можете добавить логическую переменную и поместить код, который хотите запускать только изредка, в оператор if, который проверяет эту переменную. В конце процесса вы устанавливаете для переменной значение false, чтобы остановить запуск другого кода. Это позволит вам позже добавить код, чтобы вернуть его обратно нажатием кнопки или чего-то еще, на случай, если вам понадобится возможность запустить процесс снова.
bool running = true;
void loop(){
if(running){
// заниматься вещами
}
if (counter >= 2){
running = false;
}
}
exit(0)
и abort()
также должны работать. По крайней мере, в AVR они эквивалентны while(1);
, хотя и более четко определяют цель., @Edgar Bonet
Я думал, что выход (0) сломан? Почему я так подумал? Было ли это когда-нибудь?, @Delta_G
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
СВУ означает «самодельное взрывное устройство»., @jsotola
[Значения СВУ](https://en.wikipedia.org/wiki/СВУ), @Peter Mortensen
Что такое «СВУ»? Вы имеете в виду [IDE](https://en.wikipedia.org/wiki/Integrated_development_environment)? Или *[интеллектуальное электронное устройство](https://en.wikipedia.org/wiki/Intelligent_electronic_device)*? Или [Директива о промышленных выбросах](https://en.wikipedia.org/wiki/Industrial_Emissions_Directive)? Или что-то другое?, @Peter Mortensen