Как контролировать количество void loop в секунду?
int firstAnalogPin = 0;
int secondAnalogPin = 5;
int firstVal = 0;
int secondVal = 0;
void setup(){
Serial.begin(9600); // установить порт
}
void loop(){
firstVal = analogRead(firstAnalogPin);
// читаем входной пин
secondVal = analogRead(secondAnalogPin);
// читаем входной пин
Serial.print(firstVal);
Serial.print("\t");
Serial.println(secondVal);
}
По сути, я хочу знать, как преобразовать скорость передачи данных в количество запусков loop()
в секунду. Как контролировать количество loop()
в секунду?
@John, 👍1
Обсуждение3 ответа
Если ваша цель — контролировать, как часто датчик опрашивается и печатается на SD-карте, я бы посоветовал вам воспользоваться функцией "Мигание без задержки" https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay это было бы намного чище, чем пытаться замедлить цикл до заданного времени.
Количество запусков loop()
в секунду зависит от времени, затрачиваемого на выполнение инструкций внутри loop()
. Например, в вашем коде время, необходимое для одного loop()
, примерно равно времени, которое требуется микроконтроллеру для выполнения всех инструкций в loop()
(подробнее в частности, время, затраченное на каждую операцию или функцию от вызова до возврата): в вашем случае время, затраченное на Serial.print()
+ время, затраченное на analogRead()
(без учета прерываний между операторами).
Тем не менее, вы обычно не хотите контролировать интервал между loop()
; Я предполагаю, что вы действительно хотите контролировать интервал между выполнением определенных операций в вашем loop()
. Скажем, вы хотите установить время между выполнениями analogRead(0)
равным 500 мс. Это можно сделать так:
#define INTERVAL 500 // время между чтениями
unsigned long lastRead = 0;
void setup(){
Serial.begin(9600); // установить порт
}
void loop(){
//....ваш другой код....
if (millis() - lastRead >= INTERVAL){ // если INTERVAL прошел
val = analogRead(0);
lastRead = millis();
Serial.println(val);
//...что-нибудь еще
}
//...ваш другой код...
}
С этим кодом теперь у вас есть около 2 выборок analogRead
каждую секунду. Конечно, это полезно только в том случае, если loop()
работает быстрее, чем выбранный вами интервал. Если есть вызовы функций или любые другие операции в loop()
(внутри или вне блока IF), которые всегда занимают больше времени, чем ваш интервал, тогда этот код не будет служить никакой цели.
Марчелло Романи библиотека SimpleTimer была создана для такого рода задач. Вы позволяете loop()
работать как можно быстрее, но поддерживаете только таймеры и выполняете другие короткие задачи. Библиотека таймеров запускает ваши периодические задачи, когда это необходимо:
#include <SimpleTimer.h>
SimpleTimer timer; // создает набор таймеров
// Функция обратного вызова таймера — их может быть больше одной
void onTimer(void){
; // делаем что-то здесь, давайте коротко
}
void setup(void){
; // Serial.begin() и другие настройки
timer.setInterval(1000L, onTimer); // устанавливаем 1-секундный повторяющийся таймер
}
void loop(void){
timer.run(); // обновляет таймеры, возможно, вызывает функцию обратного вызова
; // любой другой код цикла
}
- Использовать все контакты как цифровые входы/выходы
- Как получить ненулевой выход из HX711 и ячейки загрузки?
- Какие компоненты можно подключить к контактам 0/1 (RX/TX) без предотвращения загрузки кода?
- Можно ли использовать SoftwareSerial в ESP01
- Использую nRF2401, и в передатчике и приемнике Rx не мигает, а Tx мигает; почему Rx не мигает?
- Проблема с подключением датчика сердцебиения и температуры на arduino uno, но работает по отдельности
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
Вы не знаете. Смотрите ответы. Предположим, вы обнаружили, что он зацикливается (скажем) 1000 раз в секунду, а затем вы добавили код, чтобы что-то сделать, зная это, тогда дополнительный код заставит его зацикливаться 900 раз в секунду. Итак, вы допускаете это, а затем он зацикливается 800 раз в секунду. Это не способ сделать это., @Nick Gammon
Если вам не нужен точный контроль, вы можете просто добавить «задержку» в конце «цикла»., @Gerben
как установить код, пока один цикл завершает свою работу, а затем после выполнения следующего цикла., @Mukeshkumar s bhabhor