Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты для пожертвований указаны здесь.

Arduino:Примеры/BlinkWithoutDelay

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2228 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Моргание без команды Delay [1]

Иногда в процессе работы может потребоваться, чтобы два процесса проходили одновременно. К примеру, может понадобиться, чтобы светодиод моргал каждый раз, когда система будет считывать нажатие на кнопку. В этом случае функцию delay() использовать нельзя – руководствуясь ею, Arduino приостановит действие программы и потому просто «проморгает» факт нажатия на кнопку. Скетч ниже демонстрирует, как заставить светодиод моргать, не используя при этом функцию delay(). Код заставляет светодиод включиться, а затем отмечает время. Затем, проходя через loop(), проверяет, не закончилось ли время, отведенное программой на режим «вкл». Если закончилось, он выключает светодиод и снова отмечает время. Потом ждет, когда закончится нужный интервал и снова включает светодиод. И так по кругу. То есть этот код заставляет светодиод непрерывно моргать. В качестве аналогии можно привести такую ситуацию – допустим, вы разогреваете в микроволновке пиццу и в то же время ждете важного телефонного звонка. Вы кладете пиццу в микроволновку и включаете ее на 10 минут. То есть, если сравнить это с использованием функции delay(), то вы как бы сидите перед микроволновкой и ждете, когда таймер отсчитает эти 10 минут, но, услышав звонок, вдруг убегаете в другую комнату снимать трубку, тем самым «проморгав» момент икс – 10 минут превратятся в 11, 12, 13 и т.д., пока пицца не превратится в обуглившуюся лепешку. Но это пример из выдуманной вселенной, где у микроволновки нет таймера. В нашей же вселенной он есть, благодаря чему во время подогрева пиццы вы можете и разговаривать по телефону, и читать «имейлы», и сидеть в соцсети (но не слишком долго – пицца остынет!), будучи уверенным, что по прошествии этих 10 минут микроволновка выключится и пицца будет в идеальной кондиции. В данном примере мы как раз научимся делать подобный таймер.

Необходимое оборудование

  • Плата Arduino.
  • Светодиод.
  • Резистор (номиналом от 220 до 1000 Ом).

Цепь

ExampleCircuit bb.png

Подсоедините один конец резистора к 13-му контакту Arduino. К другому концу резистора подсоедините длинную ногу светодиода (это нога с положительным зарядом, т.н. анод). Короткую ногу светодиода (ногу с отрицательным зарядом, т.н. катод) подсоедините к контакту «земля» (GND) на Arduino, как показано на чертеже вверху и на схеме внизу. У большинства плат Arduino уже есть светодиод, подсоединенный к 13-му контакту. В таком случае, если вы запустите нижеуказанный код, не подключив к плате ни светодиода, ни резистора, то увидите, как начнет моргать «родной» светодиод.

Схема

ExampleCircuit sch.png

Создав цепь, подсоедините Arduino к компьютеру, запустите среду разработки Arduino и введите код, указанный ниже.

Код

Данный код использует millis() – функцию, которая возвращает программе (т.е. «оповещает программу о...») количество миллисекунд, прошедших с момента ее запуска, тем самым заставляя светодиод моргать.

  1. /* Моргание без команды Delay
  2.  
  3. Включает/выключает светодиод, подсоединенный к цифровому контакту на Arduino, не прибегая к использованию функции delay(). Это значит, что в то же самое время может быть запущен другой код, не мешающий выполнению кода с морганием светодиода.
  4.  
  5.  Цепь
  6.  * Светодиод подсоединен к 13-му контакту и «земле».
  7.  * Примечание: большинство плат Arduino уже имеют светодиод, подключенный к 13-му контакту – в таком случае этот пример можно выполнить, не пользуясь никаким дополнительным оборудованием, кроме самой Arduino.
  8.  
  9.  Создан в 2005 году Дэвидом А. Мэллисом (David A. Mellis),
  10.  модифицирован 8 февраля 2010 Полом Стоффрегеном (Paul Stoffregen).
  11.  
  12.  Данный пример кода не защищен авторским правом.
  13.  
  14.  
  15.  http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
  16.  */
  17.  
  18. // Тут вписываем константы. Это постоянные (т.е. не меняющиеся) значения.
  19. // Используйте эту секцию, чтобы задать номер контакта:
  20. const int ledPin =  13;      // номер для контакта светодиода
  21.  
  22. // Тут вписываем переменные. Это значения, которые изменятся:
  23. int ledState = LOW;             // в переменной ledState задаем режим работы светодиода (LOW значит «выкл»)
  24. long previousMillis = 0;        // в переменной previousMillis будет информация о времени, прошедшем с тех пор, как светодиод последний раз включался или выключался;
  25.  
  26. // тип нижеследующих переменных будет long, поскольку время
  27. // измеряется в миллисекундах и потому будет быстро превращаться в
  28. // слишком большую цифру, из-за чего ее нельзя будет хранить в int.
  29. long interval = 1000;           // интервал, после которого светодиод должен поменять режим работы (с «вкл» на «выкл» или наоборот; измеряется в миллисекундах)
  30.  
  31. void setup() {
  32.   // устанавливаем цифровой контакт как выходной контакт:
  33.   pinMode(ledPin, OUTPUT);  
  34. }
  35.  
  36. void loop()
  37. {
  38.   // здесь пишем код, который будет работать постоянно.
  39.  
  40.   // проверяем, не настало ли время менять режим светодиода
  41.   // (с «вкл» на «выкл» или наоборот));
  42.   // то есть, проверяем, какова разница между текущим временем и временем, когда светодиод в последний раз перешел в положение «вкл»/«выкл», и не превышает ли она желаемый интервал.
  43.   unsigned long currentMillis = millis();
  44.  
  45.   if(currentMillis - previousMillis > interval) {
  46.     // сохраняем время, когда светодиод в последний раз включался/выключался
  47.     previousMillis = currentMillis;  
  48.  
  49.     // если светодиод выключен, включаем его (и наоборот):
  50.     if (ledState == LOW)
  51.       ledState = HIGH;
  52.     else
  53.       ledState = LOW;
  54.  
  55.     // передаем светодиоду значение переменной ledState:
  56.     digitalWrite(ledPin, ledState);
  57.   }
  58. }

См.также

  1. setup()
  2. loop()
  3. millis()
  4. BareMinimum
  5. Blink
  6. DigitalReadSerial

Внешние ссылки

  1. Arduino - Blink Without Delay