Реклама ⓘ
Главная » Arduino
Призовой фонд
на июнь 2024 г.
1. 50 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Arduino UNO урок 3 - Тайминг

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

В используемой там программе (см. код ниже) был один очень большой недостаток. Для выдержки паузы между вкл/выкл LED в 1 сек. нами была использована функция delay(). В это время контроллер не может выполнять другие команды в главной функции loop()

/* Мигание LED
 * ------------
 *
 * Включает и выключает светодиод (LED) подсоединенный  
 * к выходу 13, с интервалом в 2 секунды
 *
 */

int ledPin = 13;                // LED подсоединен к выводу 13

void setup()
{
  pinMode(ledPin, OUTPUT);      // устанавливаем вывод 13 как выход
}

void loop()
{
  digitalWrite(ledPin, HIGH);   // включаем LED
  delay(1000);                  // пауза 1 секунда
  digitalWrite(ledPin, LOW);    // выключаем LED
  delay(1000);                  // пауза 1 секунда
}

Первое, что мы сделаем, это внесем небольшие корректировки в функцию loop(). Чтобы сделать код более компактным и изящным, заменим 2 пары строчек на одну пару. Вместо установки значения в HIGH, а затем обратно в LOW, мы получим текущее значение ledPin и проинвертируем его. Т.е. если оно было HIGH, то станет LOW и наоборот.

void loop()
{
  digitalWrite(ledPin, !digitalRead(ledPin));   // включаем/выключаем LED
  delay(1000);                  // задержка 1 сек.
}

Отлично! Теперь мы усовершенствуем функцию delay(). Взамен, мы будем использовать функцию millis(). Данная функция возвращает количество миллисекунд, прошедшее с момента запуска текущей программы. Функция переполнится (вернется в нуль) приблизительно через 50 суток работы программы.

Альтернативной функцией является micros(), которая возвращает количество микросекунд, прошедшее с момента запуска текущей программы. Функция переполнится (вернется в нуль) приблизительно через 70 минут работы программы.

В нашем уроке мы будем использовать функцию millis():

/* Мигание LED Версия 2
 * ------------------------
 * Включает и выключает светодиод (LED) подсоединенный   
 * к выходу 13, с интервалом в 2 секунды используя функцию millis()
 *
 */
int ledPin = 13;                 // LED подсоединен к выводу 13
unsigned long currentTime;
unsigned long loopTime;

void setup()
{
  pinMode(ledPin, OUTPUT);      // устанавливаем вывод 13 как выход
  currentTime = millis();		// считываем время, прошедшее с момента запуска программы
  loopTime = currentTime;  
}

void loop()
{
  currentTime = millis();							// считываем время, прошедшее с момента запуска программы
  if(currentTime >= (loopTime + 1000)){				// сравниваем текущий таймер с переменной loopTime + 1 секунда
    digitalWrite(ledPin, !digitalRead(ledPin));   	// включаем/выключаем LED
    loopTime = currentTime;  						// в loopTime записываем новое значение
  }
  // Здесь могут быть другие команды
}

В данном примере мы ввели две дополнительные переменные currentTime и loopTime. В функции setup() обе переменные имеют одно и тоже значение. В функции loop(), переменная currentTime каждый раз обновляется в цикле. Когда currentTime больше чем loopTime на 1 секунду (loopTime + 1000), то LED меняет свое состояние, а переменной loopTime присваивается текущее значение currentTime.

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

Оригинал статьи на английском языке (перевод Колтыков А.В. для сайта cxem.net)

Оригинал статьи

Теги:

Колтыков А.В. Опубликована: 2011 г. 0 1
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (11) | Я собрал (0) | Подписаться

0
Михаил #
А если убрать из Setup строчку
loopTime = currentTime;
то какое значение будет у loopTime в условии в цикле?
Ответить
0
андрей #
отправь в порт и прочитай
Serial.println(loopTime );
Ответить
0
123 #
При включении в любой электро схеме идут переходные процессы, угадать как установятся конкретные биты не возможно, поэтому любая переменная не инициализированная в явном виде, содержит "мусор" - произвольные данные.
Ответить
0
дима #
А как сделать, чтобы светодиод включался на 20 часов (это 72000000millis) после чего выключался на 4 часа (это 14400000millis) после чего снова включался и так по кругу на все 50 возможных суток?
Ответить
0
Aleksandr #
Зачем в функции setup нужно писать currentTime = millis(); и loopTime = currentTime; ? Без них тоже прекрасно работает. Да и unsigned long currentTime; можно объявить в функции loop, тоже будет работать.
Ответить
0
Феруз #
А как управлять количеством циклов? Например зажечь светодиод 7 раз?
Ответить
0
Михаил #
А никого не смутило, что произойдет через 50 суток? Условие перестанет выполняться и все встанет
Ответить
0
Михаил #
Как осуществить чтобы и после 50 суток все работало как надо?
Ответить
0
Макс #
Обнулить millis(), вероятно
Ответить
0
Oleg #
Почему не выключается диод с временной задержкой?! Код, на мой взгляд, абсолютно христоматийный. Всё же написано по правилам. Подскажите, пожалуйста.
Прикрепленный файл: portyanka.ino
Ответить
0
Игорь #
Написал скетч чтобы значение на светодиоде было равным значению входа кнопки. Но хочу чтобы после прекращения подачи сигнала на вход, светодиод еще горел 10 секунд. При добавлении delay светодиод не сразу срабатывает после подачи сигнала на вход, а нужно длительное время держать кнопку. Как решить эту проблему?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
DC-DC регулируемый преобразователь 1.5-37В 2А с индикатором Квадрокоптер Syma X11
вверх