Главная » Arduino
Призовой фонд
на октябрь 2017 г.
1. Термометр Relsib WT51
Рэлсиб
2. 1000 руб
PCBWay
3. Регулируемый паяльник 60 Вт
Паяльник
4. 100 руб.
От пользователей

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


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 чел.

Комментарии (9) | Я собрал (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(), вероятно
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
Тестер ESR, полупроводников, резисторов, индуктивностей Сатфайндер
вверх