Мигание светодиода без задержки с помощью шагового двигателя

Основываясь на предыдущем вопросе, я изменил скрипт, чтобы использовать мерцание без задержки.

К сожалению, это не работает, есть идеи почему?

Я использую SparkFun RedBoard Plus, Qwiic LED Stick — APA102C, шаговый двигатель Adafruit — размер NEMA-17 — 200 шагов/об и Adafruit Motor Shield V2.

Измененный код (на основе @Michel Keijzers, см. ниже):

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "Qwiic_LED_Stick.h" // Щелкните здесь, чтобы получить библиотеку: http://librarymanager/All#SparkFun_Qwiic_LED_Stick

// Переменные изменятся:
int ledState = LOW;             // ledState используется для установки светодиода

unsigned long previousMillis = 0;        // запомним время последнего обновления светодиода

// константы не изменятся:
const long interval = 500;           // интервал мигания (миллисекунды)

LED LEDStick; //Создаем объект класса LED

Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);

void setup() {
  Wire.begin();
  Serial.begin(115200);
  while (!Serial);
  Serial.println("Stepper test!");



  if (!AFMS.begin()) {
    // если (!AFMS.begin(1000)) {
    Serial.println("Could not find Motor Shield. Check wiring.");
    while (1);
  }
  Serial.println("Motor Shield found.");
  myMotor->setSpeed(50);  // 50 об/мин


  //Запуск связи с LED Stick
  if (!LEDStick.begin())  {
    Serial.println("Qwiic LED Stick failed to begin. Please check wiring and try again!");
    while (1);
  }

  Serial.println("Qwiic LED Stick ready!");
// LEDStick.setLEDColor(255, 0, 0);
  LEDStick.setLEDBrightness(1);
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // сохранить время последнего мигания светодиодом
    previousMillis = currentMillis;

    ledState = !ledState;
    // устанавливаем светодиод с помощью переменной ledState:
    uint8_t intensity = ledState == HIGH ? 255 : 0;
    LEDStick.setLEDColor(intensity, intensity, intensity);
  }

  Serial.println("Single coil steps");
  myMotor->step(200, FORWARD, SINGLE);
}

Код:

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "Qwiic_LED_Stick.h" // Щелкните здесь, чтобы получить библиотеку: http://librarymanager/All#SparkFun_Qwiic_LED_Stick

// Переменные изменятся:
int ledState = LOW;             // ledState используется для установки светодиода

unsigned long previousMillis = 0;        // запомним время последнего обновления светодиода

// константы не изменятся:
const long interval = 1000;           // интервал мигания (миллисекунды)

LED LEDStick; //Создаем объект класса LED
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);

void setup() {
  Wire.begin();
  Serial.begin(115200);
  while (!Serial);
  Serial.println("Stepper test!");

  if (!AFMS.begin()) {
    // если (!AFMS.begin(1000)) {
    Serial.println("Could not find Motor Shield. Check wiring.");
    while (1);
  }
  Serial.println("Motor Shield found.");
  myMotor->setSpeed(50);  // 50 об/мин


  //Запуск связи с LED Stick
  if (LEDStick.begin() == false) {
    Serial.println("Qwiic LED Stick failed to begin. Please check wiring and try again!");
    while (1);
  }

  Serial.println("Qwiic LED Stick ready!");
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // сохранить время последнего мигания светодиодом
    previousMillis = currentMillis;

    // если светодиод выключен, включить его и наоборот:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // устанавливаем светодиод с помощью переменной ledState:
    LEDStick.setLEDColor(50, 50, 50);
  }

  Serial.println("Single coil steps");
  myMotor->step(200, FORWARD, SINGLE);
}

, 👍0

Обсуждение

«это не работает» — бесполезное описание проблемы… что происходит на самом деле?, @jsotola

Он не мигает должным образом, @hsi100

это так же загадочно ... чего вы ожидали? ... что на самом деле произошло?, @jsotola


1 ответ


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

0

Вы только устанавливаете (назначаете) ledState, но никогда его не используете.

Мне кажется, следующий фрагмент

// устанавливаем светодиод с ledState переменной:
LEDStick.setLEDColor(50, 50, 50);

Должно быть примерно так:

// устанавливаем светодиод с ledState переменной:
uint8_t intensity = ledState == HIGH ? 255 : 0;
LEDStick.setLEDColor(intensity, intensity, intensity);

Это «преобразует» состояние ledState в белый цвет (значения RGB 255) при ВЫСОКОМ или в черный/выключенный (значения RGB 0) при НИЗКОМ уровне.

Также вы можете изменить строку

if (LEDStick.begin() == false) {

в

if (!LEDStick.begin()) {

и изменить строки

// если светодиод выключен, включаем его и наоборот:
if (ledState == LOW) {
  ledState = HIGH;
} else {
  ledState = LOW;
}

в

// если светодиод выключен, включаем его и наоборот:
ledState = ledState == LOW ? HIGH : LOW;

или даже

ledState = !ledState;
,

Большое спасибо. Я сделал модифицированный код и обновил его в вопросе, он кажется мигающим, но дольше 1 секунды. Может ли это быть связано с частотой платы. Как я могу управлять разными цветами света на основе этого кода: интенсивность uint8_t = ledState == HIGH ? 255 : 0; LEDStick.setLEDColor(интенсивность, интенсивность, интенсивность);, @hsi100

Пожалуйста, проголосуйте и примите ответ, если он помог и является решением вашей проблемы. Я не понимаю напрямую, почему он мигает дольше 1 секунды, вы можете распечатать переменные, чтобы узнать точное время. Что касается цветов, вы можете преобразовать LOW/HIGH в любое значение от 0 до 255 для красного, зеленого и синего, просто немного поиграйте с аргументами внутри оператора LEDStick.setLEDColor., @Michel Keijzers