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

Я пытаюсь вызвать функцию класса, которая мигает светодиодом «x» количество раз. Я не хочу использовать задержку, это усложняет задачу. Если я использую цикл while, светодиод просто горит. Я добавляю прерывание в begin() — расположение светодиода — контакт 13

В своем скетче я вызываю следующее:

robot.lights.pulse(0, 2000, 10000, 500); //в миллисекундах

Моя цель — подавать импульсы светодиоду «x» количество раз с указанной мной скоростью.

Это код внутри моего класса:

void StatusLights::begin(int locations[]){
    for(int i=0;i<NUM_OF_LIGHTS;i++){
        this->locations[i]=locations[i];
        pinMode(locations[i], OUTPUT);
    }

    ledState = LOW;
    previousMillis = 0;
    attachInterrupt(0, pulse_ISR, RISING);

};

void StatusLights::pulse(int location, int interval, int count, int speed){

    int value = 0;
    previousMillis = 0;
    // while(pulsecnt<count) {
        long currentMillis = millis();

        if (currentMillis - previousMillis >= interval) {
            previousMillis = currentMillis;
            value = 128+127*cos(2*PI/interval*(speed-currentMillis));
            analogWrite(locations[location], value); 
        };
    // };
    // digitalWrite(locations[location], LOW);
};

void pulse_ISR() {
    pulsecnt++;
};

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

Спасибо!

, 👍0

Обсуждение

Можете ли вы показать нам рабочий эскиз? Текущий Миллис должен быть unsigned long. Какой пульс вам нужен, потому что человеческий глаз имеет логарифмическую шкалу, а вы используете косинус. Как часто вы хотите обновлять яркость светодиода?, @Jot

@Jot добавил вызов функции к моему вопросу. Спасибо, @rcpilotp51

Рабочий эскиз — это то, что мы можем попробовать, не догадываясь, что представляет собой остальной код. Я хотел бы увидеть остальную часть эскиза, потому что мне кажется, что вы сделали его слишком сложным. Начните с функции «обновления», чтобы она продолжала работать, как пишет @JRobert в своем ответе. Это распространенный способ справиться с этим в проектах Arduino., @Jot

тогда нет, без остальных пяти классов, @rcpilotp51

Ваш «предыдущий Миллис» тоже длинный? Это не нормально. Вот что я имею в виду, говоря о догадках., @Jot


1 ответ


1

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

void loop()
{
   myStatusLights.updateLED();     // вызываем это часто
}

...

void StatusLights::updateLED(){
  if LED_active,
     if it's time to change the LED,
        toggle LED on/off;
        if LED has toggled enough times,
           set LED_active false;
        endif;
     endif;
  endif;
}

Обновление:

Как бы вы обновляли счетчик, отслеживали импульсы и обновляли состояние индикатора состояния без каких-либо параметров?

Некоторая функция класса должна инициировать мигание, независимо от того, знает ли она об этом сама или вызывается из кода вашего приложения. Эта функция класса должна будет установить эти параметры. Если его вызывать извне, возможно, внешнее их задает - ? Только ты это знаешь. В любом случае, их нужно будет сохранить в личных данных класса, чтобы функция .updateLED() могла иметь к ним доступ. Функция .updateLED() будет, например, отсчитывать оставшееся количество миганий для отображения, отслеживать, включен или выключен светодиод, фактически включать или выключать его и т. д., пока ей не останется ничего, что можно было бы сделать. . В этом случае он просто быстро возвращается, ничего не делая.

,

Я не уверен, что следую принципу «включение/выключение светодиода»; если светодиод переключался достаточное количество раз, установить LED_active false; endif;` это именно то, что я пытаюсь сделать, но я не уверен в синтаксисе - извините, код sudo в этом случае не помогает. @JРоберт, @rcpilotp51

Я понимаю, что вы хотите повторно вызвать функцию обновления. Как бы вы обновили счетчик, отслеживали импульсы и обновляли состояние индикатора состояния без каких-либо параметров? Что, если я захочу установить «пульсировать светодиод 10 раз» в функции настройки?, @rcpilotp51

@ rcpilotp51, у вас есть класс для индикаторов состояния, и вы не знаете, где хранить индикаторы состояния? http://www.cplusplus.com/doc/tutorial/classes/, @Juraj

@Juraj, у меня на самом деле есть набор «булавок» для световых мест, и я хочу вызывать их на основе других событий и хочу, чтобы они делали разные вещи... нужна ли мне функция обновления для каждого?, @rcpilotp51

Вам не нужна функция для каждого; одна функция обновления может проходить через массив светодиодов и применять одну и ту же логику к каждому из них на основе значений переменных класса каждого конкретного светодиода. Каждому светодиоду потребуется свой собственный набор, например, номер контакта, интервал мигания, оставшееся количество миганий и т. д., @JRobert