Как контролировать количество 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() в секунду?

, 👍1

Обсуждение

Вы не знаете. Смотрите ответы. Предположим, вы обнаружили, что он зацикливается (скажем) 1000 раз в секунду, а затем вы добавили код, чтобы что-то сделать, зная это, тогда дополнительный код заставит его зацикливаться 900 раз в секунду. Итак, вы допускаете это, а затем он зацикливается 800 раз в секунду. Это не способ сделать это., @Nick Gammon

Если вам не нужен точный контроль, вы можете просто добавить «задержку» в конце «цикла»., @Gerben

как установить код, пока один цикл завершает свою работу, а затем после выполнения следующего цикла., @Mukeshkumar s bhabhor


3 ответа


1

Если ваша цель — контролировать, как часто датчик опрашивается и печатается на SD-карте, я бы посоветовал вам воспользоваться функцией "Мигание без задержки" https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay это было бы намного чище, чем пытаться замедлить цикл до заданного времени.

,

3

Количество запусков 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), которые всегда занимают больше времени, чем ваш интервал, тогда этот код не будет служить никакой цели.

,

0

Марчелло Романи библиотека 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();   // обновляет таймеры, возможно, вызывает функцию обратного вызова
   ;              // любой другой код цикла
}
,