Arduino:Примеры/BlinkWithoutDelay: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
м (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">»)
 
Нет описания правки
 
(не показано 14 промежуточных версий 1 участника)
Строка 3: Строка 3:
{{Myagkij-редактор}}
{{Myagkij-редактор}}


==Моргание без команды Delay <ref>[http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay Arduino - Blink Without Delay]</ref>==
=Мигание без команды Delay <ref>[http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay Arduino - Blink Without Delay]</ref>=
 
Иногда в процессе работы может потребоваться, чтобы два процесса проходили одновременно. К примеру, может понадобиться, чтобы [[светодиод]] мигал каждый раз, когда система будет считывать нажатие на кнопку. В этом случае функцию [[Arduino:Справочник языка Arduino/Функции/Работа со временем/delay()|delay()]] использовать нельзя – руководствуясь ею, [[Arduino]] приостановит действие программы и потому просто ''«проморгает»'' факт нажатия на кнопку.
 
[[Скетч]] ниже демонстрирует, как заставить [[светодиод]] мигать, не используя при этом функцию [[Arduino:Справочник языка Arduino/Функции/Работа со временем/delay()|delay()]]. Код заставляет [[светодиод]] включиться, а затем отмечает время. Затем, проходя через [[Arduino:Справочник языка Arduino/loop()|loop()]], проверяет, не закончилось ли время, отведенное программой на режим ''«вкл»''. Если закончилось, он выключает [[светодиод]] и снова отмечает время. Потом ждет, когда закончится нужный интервал и снова включает [[светодиод]]. И так по кругу. То есть этот код заставляет [[светодиод]] непрерывно мигать.
 
В качестве аналогии можно привести такую ситуацию – допустим, вы разогреваете в [[микроволновке]] пиццу и в то же время ждете важного телефонного звонка. Вы кладете пиццу в [[микроволновку]] и включаете ее на 10 минут.  То есть, если сравнить это с использованием функции [[Arduino:Справочник языка Arduino/Функции/Работа со временем/delay()|delay()]], то вы как бы сидите перед [[микроволновкой]] и ждете, когда таймер отсчитает эти 10 минут, но, услышав звонок, вдруг убегаете в другую комнату снимать трубку, тем самым ''«проморгав»'' момент икс –  10 минут превратятся в 11, 12, 13 и т.д., пока [[пицца]] не превратится в обуглившуюся лепешку. 
 
Но это пример из выдуманной вселенной, где у [[микроволновки]] нет таймера. В нашей же вселенной он есть, благодаря чему во время подогрева [[пиццы]] вы можете и разговаривать по [[телефон]]у, и читать ''«имейлы»'', и сидеть в соцсети (но не слишком долго – пицца остынет!), будучи уверенным, что по прошествии этих 10 минут [[микроволновка]] выключится и [[пицца]] будет в идеальной кондиции.


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


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


* Плата '''Arduino'''.
* [[Плата Arduino]] - 1шт.
* Светодиод.
* [[Светодиод]] - 1шт.
* Резистор (номиналом '''от 220 до 1000 Ом''').
* [[Резистор]] (номиналом от [[220 Ом]] до [[1 кОм]]) - 1шт.


==Цепь==
==Цепь==


[[File:ExampleCircuit_bb.png]]
[[File:ExampleCircuit_bb.png|center|frame|'''Рис. 1.''' Плата [[Arduino Uno]] с подключенным через [[резистор]] [[светодиод]]ом к 13-му контакту.|alt=Рис. 1. Плата Arduino Uno с подключенным через резистор светодиодом к 13-му контакту.]]


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


==Схема==
==Схема==


[[File:ExampleCircuit_sch.png]]
[[File:ExampleCircuit_sch.png|center|frame|'''Рис. 2.''' Схема подключения к плате [[светодиод]]а через [[резистор]].|alt=Рис. 2. Схема подключения к плате светодиода через резистор.]]


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


==Код==
==Код==


Данный код использует [[Arduino:Справочник языка Arduino/Функции/Работа со временем/millis()|millis()]] – функцию, которая возвращает программе (т.е. '''«оповещает программу о...»''') количество миллисекунд, прошедших с момента ее запуска, тем самым заставляя светодиод моргать.
Данный код использует [[Arduino:Справочник языка Arduino/Функции/Работа со временем/millis()|millis()]] – функцию, которая возвращает программе (т.е. ''«оповещает программу о...»'') количество миллисекунд, прошедших с момента ее запуска, тем самым заставляя [[светодиод]] мигать.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
/* Моргание без команды Delay
/* Моргание без команды Delay
   
   
Строка 95: Строка 100:
</syntaxhighlight>
</syntaxhighlight>


==См.также==
=См.также=


# [[Arduino:Справочник языка Arduino/setup()‎|setup()]]
# [[Arduino:Справочник языка Arduino/setup()‎|setup()]]
Строка 104: Строка 109:
# [[Arduino:Примеры/DigitalReadSerial|DigitalReadSerial]]
# [[Arduino:Примеры/DigitalReadSerial|DigitalReadSerial]]


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


<references />
<references />
{{Навигационная таблица/Портал/Arduino}}
[[Категория:Пример]]
[[Категория:Пример]]
[[Категория:Примеры]]
[[Категория:Примеры]]
[[Категория:Пример программирования Arduino]]
[[Категория:Пример программирования Arduino]]
[[Категория:Примеры программирования Arduino]]
[[Категория:Примеры программирования Arduino]]
[[Категория:LOW]]
[[Категория:setup()]]
[[Категория:setup]]
[[Категория:void]]
[[Категория:pinMode()]]
[[Категория:OUTPUT]]
[[Категория:loop]]
[[Категория:loop()]]
[[Категория:millis()]]
[[Категория:if]]
[[Категория:HIGH]]
[[Категория:digitalWrite()]]
[[Категория:digitalWrite]]
[[Категория:else]]
[[Категория:Плата Arduino]]
[[Категория:Светодиод]]
[[Категория:Резистор]]

Текущая версия от 18:18, 14 мая 2023

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


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

Иногда в процессе работы может потребоваться, чтобы два процесса проходили одновременно. К примеру, может понадобиться, чтобы светодиод мигал каждый раз, когда система будет считывать нажатие на кнопку. В этом случае функцию delay() использовать нельзя – руководствуясь ею, Arduino приостановит действие программы и потому просто «проморгает» факт нажатия на кнопку.

Скетч ниже демонстрирует, как заставить светодиод мигать, не используя при этом функцию delay(). Код заставляет светодиод включиться, а затем отмечает время. Затем, проходя через loop(), проверяет, не закончилось ли время, отведенное программой на режим «вкл». Если закончилось, он выключает светодиод и снова отмечает время. Потом ждет, когда закончится нужный интервал и снова включает светодиод. И так по кругу. То есть этот код заставляет светодиод непрерывно мигать.

В качестве аналогии можно привести такую ситуацию – допустим, вы разогреваете в микроволновке пиццу и в то же время ждете важного телефонного звонка. Вы кладете пиццу в микроволновку и включаете ее на 10 минут. То есть, если сравнить это с использованием функции delay(), то вы как бы сидите перед микроволновкой и ждете, когда таймер отсчитает эти 10 минут, но, услышав звонок, вдруг убегаете в другую комнату снимать трубку, тем самым «проморгав» момент икс – 10 минут превратятся в 11, 12, 13 и т.д., пока пицца не превратится в обуглившуюся лепешку.

Но это пример из выдуманной вселенной, где у микроволновки нет таймера. В нашей же вселенной он есть, благодаря чему во время подогрева пиццы вы можете и разговаривать по телефону, и читать «имейлы», и сидеть в соцсети (но не слишком долго – пицца остынет!), будучи уверенным, что по прошествии этих 10 минут микроволновка выключится и пицца будет в идеальной кондиции.

В данном примере мы как раз научимся делать подобный таймер.

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

Цепь

Рис. 1. Плата Arduino Uno с подключенным через резистор светодиодом к 13-му контакту.
Рис. 1. Плата Arduino Uno с подключенным через резистор светодиодом к 13-му контакту.

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

У большинства плат Arduino уже есть светодиод, подсоединенный к 13-му контакту. В таком случае, если вы запустите нижеуказанный код, не подключив к плате ни светодиода, ни резистора, то увидите, как начнет мигать «родной» светодиод.

Схема

Рис. 2. Схема подключения к плате светодиода через резистор.
Рис. 2. Схема подключения к плате светодиода через резистор.

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

Код

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

/* Моргание без команды Delay
 
Включает/выключает светодиод, подсоединенный к цифровому контакту на Arduino, не прибегая к использованию функции delay(). Это значит, что в то же самое время может быть запущен другой код, не мешающий выполнению кода с морганием светодиода. 
 
 Цепь
 * Светодиод подсоединен к 13-му контакту и «земле».
 * Примечание: большинство плат Arduino уже имеют светодиод, подключенный к 13-му контакту – в таком случае этот пример можно выполнить, не пользуясь никаким дополнительным оборудованием, кроме самой Arduino.
  
 Создан в 2005 году Дэвидом А. Мэллисом (David A. Mellis),
 модифицирован 8 февраля 2010 Полом Стоффрегеном (Paul Stoffregen).
 
 Данный пример кода не защищен авторским правом.
 
 
 http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
 */
 
// Тут вписываем константы. Это постоянные (т.е. не меняющиеся) значения. 
// Используйте эту секцию, чтобы задать номер контакта:
const int ledPin =  13;      // номер для контакта светодиода

// Тут вписываем переменные. Это значения, которые изменятся:
int ledState = LOW;             // в переменной ledState задаем режим работы светодиода (LOW значит «выкл»)
long previousMillis = 0;        // в переменной previousMillis будет информация о времени, прошедшем с тех пор, как светодиод последний раз включался или выключался;

// тип нижеследующих переменных будет long, поскольку время
// измеряется в миллисекундах и потому будет быстро превращаться в 
// слишком большую цифру, из-за чего ее нельзя будет хранить в int. 
long interval = 1000;           // интервал, после которого светодиод должен поменять режим работы (с «вкл» на «выкл» или наоборот; измеряется в миллисекундах)

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

void loop()
{
  // здесь пишем код, который будет работать постоянно.

  // проверяем, не настало ли время менять режим светодиода 
  // (с «вкл» на «выкл» или наоборот));
  // то есть, проверяем, какова разница между текущим временем и временем, когда светодиод в последний раз перешел в положение «вкл»/«выкл», и не превышает ли она желаемый интервал.
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // сохраняем время, когда светодиод в последний раз включался/выключался 
    previousMillis = currentMillis;   

    // если светодиод выключен, включаем его (и наоборот):
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // передаем светодиоду значение переменной ledState:
    digitalWrite(ledPin, ledState);
  }
}

См.также

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

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