Сделать световые вспышки, пока шаговый двигатель постоянно движется.

Стартовый код.

#include <Stepper.h>

const int stepsPerRevolution = 120;  // изменяем это, чтобы оно соответствовало числу
// для вашего двигателя количество шагов на оборот

// инициализируем библиотеку шаговых двигателей на контактах с 8 по 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

int stepCount = 0;         // количество шагов, которые сделал мотор
int LEDPin = 13;
void setup() {
  // инициализируем последовательный порт:
  Serial.begin(9600);
  pinMode(LEDPin,OUTPUT);
}


void loop() {
  // шаг один шаг:
  myStepper.step(1);
  Serial.print("steps:");
  Serial.println(stepCount=456);
  stepCount++;
  delay(35);
}

Я хочу, чтобы индикатор мигал с интервалом в 15 секунд, пока мой шаговый двигатель продолжает двигаться. По сути, я хочу объединить этот код с этим:

int LEDPin = 13;
void setup()
  pinMode(LEDPin,OUTPUT);
void loop()
{
  digitalWrite(LEDPin,HIGH);
  delay(6000);
  digitalWrite(LEDPin,LOW);
  delay(6000);
}

, 👍-1

Обсуждение

у вас есть вопрос? ............ примечание: delay(6000); заставляет Arduino останавливаться на 6 секунд..... изучите код примера скетча BlinkWithoutDelay, @jsotola


2 ответа


Лучший ответ:

0

В вашей функции цикла() вызовите две новые функции. Назовем их MaybeStep() и MaybeBlink(). Каждый из них считывает время, millis(), и вычитает сохраненное время, когда он в последний раз выполнял свое действие (переключение или переключение светодиода). Если эта разница >= интервала для этого действия, выполните действие и обновите сохраненное время до текущего времени.

Не забудьте сделать сохраненное время «статическим» (или глобальным), чтобы оно не перезаписывалось при возврате функции.

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

Обновление:

Новичок в Arduino и не совсем понимаю, что вы имеете в виду?

Ваша функция цикла будет выглядеть примерно так:

void loop(){
   maybeStep();
   maybeBlink();
}

Обратите внимание, что цикл теперь не делает ничего, кроме вызова функций действий. Вот схема одной из функций действия:

void maybeStep(){
   if the time_now > than the time_we_last_stepped by 35 millisec, then
      step again and store the new time_we_last_stepped;

   return;
}

Обратите внимание, что эта функция может выполнять или не выполнять шаг! Он решает, следует ли выполнять шаг, считывая время и сравнивая его со временем предыдущего шага. Но в любом случае – шаг или не шаг – оно быстро возвращается. Функция mayBlink() будет работать точно так же: сравнивать время последнего включения или выключения светодиода с временем ожидания между переключениями. Затем либо переключите его (и сохраните время и состояние включения/выключения), либо нет, и в любом случае вернитесь в цикл.

При таком подходе ваша функция цикла() будет вызывать эти функции действий очень часто — намного чаще, чем необходимо. В большинстве случаев ничего не произойдет. Но время от времени («маленькое время» с человеческой точки зрения) одна из этих функций делает шаг или переключает светодиод. Если вы напишите свой код таким образом, цикл() может вызывать десятки или сотни таких функций, и все эти действия все равно могут выполняться вовремя.

Ключом к этому методу программирования, называемому неблокирующим программированием, является то, что функции действий должны быть очень краткими . Они должны быстро решить, нужно ли что-то делать, и либо сделать это, либо нет, а затем немедленно вернуться.

,

спасибо, но я новичок в Arduino и не совсем понимаю, что вы имеете в виду?, @dakota


0

Функция delay() заставляет программу Arduino остановиться и «досчитать до 100». Пока он это делает, он не делает ничего другого.

Поэтому откладывать нельзя, если вы пытаетесь сделать несколько дел одновременно.

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

unsigned long nextLEDTime = 0;
bool ledState = false;
#define delay 6000

int LEDPin = 13;
void setup()
  pinMode(LEDPin,OUTPUT);
void loop()
{ 
  if (millis() >= nextLEDTime) // пора ли переключить светодиод
   {
     ledState = ! ledState;  //Инвертируем состояние светодиода
     digitalWrite(LEDPin, ledState);
     nextLEDTime = millis() + delay;  //Установим nextLEDTime на следующий раз, когда нам нужно что-то сделать
   }
}

Затем вам нужно сделать то же самое с кодом вашего шагового двигателя, создав отдельную переменную для отслеживания того, когда вы в следующий раз захотите что-то сделать с шаговым двигателем.

Поместите весь свой код в одну функцию цикла, которая проверяет значения nextLEDTime и nextStepperMotorTime бота и предпринимает соответствующие действия в нужное время для каждой вещи, которую вы хотите обработать.

,