Выполнение кода через функции
Я делаю светодиодный куб, в котором используется последовательное освещение. Так что по сути мне нужно повторять свои команды в течение определенного времени. После долгих поисков ничего не вышло, поэтому решил спросить здесь.
Вот код, который мне нужно воспроизвести в рабочем формате
void loop(){
runfor(500){
DigitalWrite(5,HIGH); //это команда, которая будет выполнена в других
//функция
}
}
void runfor(uint32_t duration){
int timer = millis();
while((millis()-timer)<=duration){
//DigitalWrite(5,HIGH); будет выполнено здесь
}
}
Таким образом, по сути, DigitalWrite (или любой другой код, если он используется) будет многократно выполняться в течение 500 миллисекунд
@A.Shetye, 👍2
1 ответ
Лучший ответ:
ИЗМЕНИТЬ из-за неправильного понимания вопроса.
Если вы хотите иметь возможность передавать инструкции в функцию, вам придется иметь функцию для каждого набора инструкций (то есть вы не можете передавать произвольные операторы в качестве параметра функции), а затем вы настраиваете свою функцию runfor()
так, чтобы она принимала параметр указателя на функцию.
typedef void (*callback_function)(void); // определение типа здесь упрощает чтение кода при использовании в других местах.
void runfor(uint32_t duration, callback_function patternCode){
uint32_t timer = millis();
while ((millis()-timer)<=duration) {
//получить эти команды из вызывающей функции
patternCode();
}
}
void pattern1() {
// Световой узор №1
}
void pattern2() {
// Световой узор №2
}
void setup() {
// Код настройки
}
void loop() {
runfor(1000, pattern1);
runfor(2000, pattern2);
}
ОРИГИНАЛЬНЫЙ ОТВЕТ
Ваш начальный псевдокод почти готов.
void runfor(uint32_t duration){
uint32_t timer = millis();
while ((millis()-timer)<=duration) {
//получить эти команды из вызывающей функции
}
}
Изменения, которые я внес:
измените
int
наuint32_t
, чтобы учесть все возможные значенияmillis()
.измените ключевое слово
for
наwhile
, которое является правильным ключевым словом для нужного вам типа цикла.добавлена точка с запятой после назначения
таймера
, согласно синтаксису C.
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
Извините, я отредактирую свой пост. Спасибо за информацию!, @A.Shetye
Я не уверен, что понимаю. Какой ответ вы ищете?, @jose can u c
jose can uc Я имею в виду реформу кода, чтобы он в основном «принимал» функцию, скажем, loop() и запускал команды в последующих фигурных скобках { }. Также можете ли вы, пожалуйста, размещать комментарии к моим вопросам в комментариях к вопросам, чтобы другие могли понять?, @A.Shetye
Ваша переменная таймера должна иметь тип
uint32_t
., @Majenko@A.Shetye Пример кода, предоставленный в ответе, делает то, о чем вы просите. Ваш первоначальный пример в вопросе уже был очень близок к правильному!, @jose can u c
Полагаю, меня неправильно поняли. Часть // здесь не является примером кода. Так что если я делаю **runfor(50){ <place code here}** из, скажем, loop(), он должен запустить данный код на 50 миллисекунд. Так что, полагаю, мой текущий код не может этого сделать?, @A.Shetye
Теперь, когда я вас понял, я изменил свой ответ., @jose can u c