Искусство управления временем в Arduino: От задержек delay() до параллельных задач millis().

Arduino - это платформа, которая обеспечивает простой и удобный способ создания электронных проектов. При написании программ для Arduino часто возникает необходимость работы с временем и задержками. В этой статье мы рассмотрим основные функции задержек и техники управления временем в Arduino.

Мигаем и Измеряем: Практическое Руководство по millis() и micros() в Arduino

Функции задержек delay().

Простейшим способом управления временем в Arduino является использование функций задержек. Две основные функции задержек в Arduino:

delay(time)

Эта функция приостанавливает выполнение программы на определенное количество миллисекунд (time). Например, delay(1000) приостановит выполнение программы на 1 секунду.

void setup() {
pinMode(13, OUTPUT);
}
void loop() {
  digitalWrite(13, HIGH);
  delay(500); // подождать полсекунды
  digitalWrite(13, LOW);
  delay(500); // подождать полсекунды
}

Функция delay() представляет собой простую и эффективную возможность задерживать выполнение программы на определенное количество миллисекунд (мс). 1 секунда равна 1,000 мс, и эта функция может быть использована для создания задержек с разрешением в миллисекундах. Параметр time принимает тип данных unsigned long, что означает, что вы можете устанавливать задержки на промежутки времени от 1 до 4,294,967,295 мс (примерно 50 суток) с точностью до 1 мс.

Эта функция работает на системном таймере микроконтроллера Arduino и останавливает выполнение программы в течение указанного периода времени. Однако следует помнить, что delay() не будет работать внутри прерывания и при отключенных прерываниях, поскольку она полагается на системный таймер для создания задержек.

delayMicroseconds(time)

Эта функция приостанавливает выполнение программы на определенное количество микросекунд (time).

void setup() {}
void loop() {
  // что-то выполнить
  delayMicroseconds(100); // подождать 100 мкс
}

Функция delayMicroseconds() предоставляет возможность создавать задержки с очень высоким разрешением в микросекундах (мкс). 1 секунда равна 1,000,000 мкс, и данная функция может приостановить выполнение программы на промежуток времени от 4 до 16,383 мкс. Параметр time принимает тип данных unsigned int, что означает, что вы можете устанавливать задержки с разрешением в микросекундах.

Важно отметить, что delayMicroseconds() работает не на таймере, а на пропуске тактов процессора. Это означает, что она может работать внутри прерывания и при отключенных прерываниях. Однако, иногда она может работать не совсем корректно с переменными из-за своего высокого разрешения, поэтому рекомендуется стараться использовать константы (например, const int delayTime = 1000;) вместо переменных внутри delayMicroseconds(), чтобы избежать ошибок.

Обе эти функции предоставляют удобный и простой способ управления временными задержками в программировании Arduino и являются важными инструментами для создания точных временных интервалов в ваших проектах.

Функция yield().

Функция yield() предоставляет возможность выполнять код во время задержек delay(). Это позволяет создавать параллельно выполняющиеся задачи без использования сложных таймеров.

void setup() {
  pinMode(13, OUTPUT);
}
void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}
void yield() {
  // код, который может выполняться во время задержек
}

Функция yield() работает только для AVR Arduino и не поддерживается на платформах esp8266 и esp32.

Функции счёта времени millis(),millis().

Arduino предоставляет две функции для отслеживания времени:

millis()

Функция millis() возвращает количество миллисекунд, прошедших с момента запуска программы на Arduino. Она является полезным инструментом для отслеживания времени в вашем проекте. Возвращаемое значение имеет тип unsigned long, что позволяет отслеживать время на протяжении более 49 суток. Эта функция обычно используется для выполнения определенных действий через определенные временные интервалы.

Пример использования millis() для мигания светодиодом каждую секунду:

const int ledPin = 13; // Пин светодиода
void setup() {
  pinMode(ledPin, OUTPUT);
}
void loop() {
  static unsigned long previousMillis = 0; // Переменная для хранения предыдущего времени
  const long interval = 1000; // Интервал в миллисекундах (1 секунда)
  unsigned long currentMillis = millis(); // Получаем текущее время
  // Если прошло достаточно времени с момента последнего мигания
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis; // Запоминаем текущее время
    digitalWrite(ledPin, !digitalRead(ledPin)); // Мигаем светодиодом
  }
}

В этом примере светодиод будет мигать каждую секунду, используя функцию millis(), чтобы отслеживать прошедшее время.

micros()

Функция micros() возвращает количество микросекунд, прошедших с момента запуска программы. Она имеет более высокое разрешение, чем millis(), что позволяет отслеживать более короткие временные интервалы (меньше одной миллисекунды). Это полезно, когда вам нужно измерить очень короткие временные интервалы или управлять устройствами, требующими точного управления временем.

Пример использования micros() для измерения времени выполнения определенной операции:

void setup() {
  // Настройка вашего проекта
}
void loop() {
  unsigned long startTime = micros(); // Получаем время начала операции
  // Выполняем операции, которые вы хотите измерить
  unsigned long elapsedTime = micros() - startTime; // Вычисляем время, затраченное на операцию
  Serial.print("Время выполнения операции: ");
  Serial.print(elapsedTime);
  Serial.println(" микросекунд");
  delay(1000); // Пауза 1 секунда перед следующей операцией
}

В этом примере функция micros() используется для измерения времени выполнения операции в loop(). Полученное значение времени выводится через последовательный порт (Serial) для мониторинга.

Используя функции millis() и micros(), вы можете эффективно управлять временными интервалами в ваших проектах Arduino и создавать более точные и сложные программы с параллельно выполняющимися задачами.

Многозадачность с millis(): Мигание несколькими светодиодами.

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

const int ledPin1 = 2;  // Пин первого светодиода
const int ledPin2 = 3;  // Пин второго светодиода
const int ledPin3 = 4;  // Пин третьего светодиода

unsigned long previousMillis1 = 0;  // Переменная для хранения времени последнего мигания 1 светодиода
unsigned long previousMillis2 = 0;  // Переменная для хранения времени последнего мигания 2 светодиода
unsigned long previousMillis3 = 0;  // Переменная для хранения времени последнего мигания 3 светодиода

const long interval1 = 1000;  // Интервал для 1 светодиода в миллисекундах (1 секунда)
const long interval2 = 500;   // Интервал для 2 светодиода в миллисекундах (0.5 секунды)
const long interval3 = 250;   // Интервал для 3 светодиода в миллисекундах (0.25 секунды)

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
}

void loop() {
  unsigned long currentMillis = millis();  // Получаем текущее время

  // Мигание первым светодиодом
  if (currentMillis - previousMillis1 >= interval1) {
    previousMillis1 = currentMillis;
    digitalWrite(ledPin1, !digitalRead(ledPin1));
  }

  // Мигание вторым светодиодом
  if (currentMillis - previousMillis2 >= interval2) {
    previousMillis2 = currentMillis;
    digitalWrite(ledPin2, !digitalRead(ledPin2));
  }

  // Мигание третьим светодиодом
  if (currentMillis - previousMillis3 >= interval3) {
    previousMillis3 = currentMillis;
    digitalWrite(ledPin3, !digitalRead(ledPin3));
  }
}

В этом примере кода три светодиода мигают с разными интервалами: 1 секунда, 0.5 секунды и 0.25 секунды. Это достигается путем использования трех переменных для отслеживания времени последнего мигания каждого светодиода и сравнения этого времени с текущим временем, полученным с помощью millis(). Каждый светодиод переключается между состоянием HIGH и LOW в зависимости от прошедшего времени.

Этот пример демонстрирует, как использовать millis() для управления несколькими задачами параллельно, что может быть весьма полезно в ваших проектах Arduino. Теперь у вас есть возможность создавать сложные и интересные программы, используя многозадачность с функцией millis().

Преобразование Millis в часы, минуты и секунды.

Миллисекунды не всегда удобны для отображения времени. Их можно легко преобразовать в часы, минуты и секунды, что делает отображение времени более человеческим.

uint32_t sec = millis() / 1000ul;      // полное количество секунд
int timeHours = (sec / 3600ul);        // часы
int timeMins = (sec % 3600ul) / 60ul;  // минуты
int timeSecs = (sec % 3600ul) % 60ul;  // секунды

В этой статье мы рассмотрели основные функции управления временем в Arduino. Используя эти функции и техники, вы сможете создавать более эффективные и точные временные управляющие механизмы для ваших проектов. Удачи в вашем программировании на Arduino!

Фотографии к статье

Комментарии

Ваше Имя*



.Искусство управления временем в Arduino: От задержек delay() до параллельных задач millis().

Статьи про Arduino
23 октября , 2023
Комментариев:0
Фото:3
Понравилась статья? Нажми


Разработка проектов