Мигание светодиода без задержки с помощью шагового двигателя
Основываясь на предыдущем вопросе, я изменил скрипт, чтобы использовать мерцание без задержки.
К сожалению, это не работает, есть идеи почему?
Я использую 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);
}
@hsi100 , 👍0
Обсуждение1 ответ
Лучший ответ:
Вы только устанавливаете (назначаете) 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
- Шаговый двигатель и мигающий светодиод
- Питание светодиодной ленты - Сколько ампер?
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Светодиод L продолжает гореть
- Улучшенное циклическое переключение цветов RGB.
- Плавное мигание светодиодов
- Остановить мигание светодиодов
«это не работает» — бесполезное описание проблемы… что происходит на самом деле?, @jsotola
Он не мигает должным образом, @hsi100
это так же загадочно ... чего вы ожидали? ... что на самом деле произошло?, @jsotola