Arduino:Примеры/BlinkWithoutDelay: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
(не показано 13 промежуточных версий 1 участника) | |||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
= | =Мигание без команды 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]] - 1шт. | ||
* Светодиод. | * [[Светодиод]] - 1шт. | ||
* Резистор (номиналом | * [[Резистор]] (номиналом от [[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]], как показано на чертеже вверху и на схеме внизу. | |||
У большинства плат [[Arduino]] уже есть [[светодиод]], подсоединенный к 13-му контакту. В таком случае, если вы запустите нижеуказанный код, не подключив к плате ни [[светодиод]]а, ни [[резистор]]а, то увидите, как начнет мигать ''«родной»'' [[светодиод]]. | |||
У большинства плат | |||
==Схема== | ==Схема== | ||
[[File:ExampleCircuit_sch.png]] | [[File:ExampleCircuit_sch.png|center|frame|'''Рис. 2.''' Схема подключения к плате [[светодиод]]а через [[резистор]].|alt=Рис. 2. Схема подключения к плате светодиода через резистор.]] | ||
Создав цепь, подсоедините | Создав цепь, подсоедините [[Arduino]] к [[компьютер]]у, запустите среду разработки [[Arduino]] и введите код, указанный ниже. | ||
==Код== | ==Код== | ||
Данный код использует [[Arduino:Справочник языка Arduino/Функции/Работа со временем/millis()|millis()]] – функцию, которая возвращает программе (т.е. | Данный код использует [[Arduino:Справочник языка Arduino/Функции/Работа со временем/millis()|millis()]] – функцию, которая возвращает программе (т.е. ''«оповещает программу о...»'') количество миллисекунд, прошедших с момента ее запуска, тем самым заставляя [[светодиод]] мигать. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <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}} | ||
[[Категория:Пример]] | [[Категория:Пример]] | ||
Строка 115: | Строка 119: | ||
[[Категория:Пример программирования Arduino]] | [[Категория:Пример программирования Arduino]] | ||
[[Категория:Примеры программирования Arduino]] | [[Категория:Примеры программирования Arduino]] | ||
[[Категория:LOW]] | |||
[[Категория:setup()]] | |||
[[Категория:setup]] | |||
[[Категория:void]] | |||
[[Категория:pinMode()]] | |||
[[Категория:OUTPUT]] | |||
[[Категория:loop]] | |||
[[Категория:loop()]] | |||
[[Категория:millis()]] | |||
[[Категория:if]] | |||
[[Категория:HIGH]] | |||
[[Категория:digitalWrite()]] | |||
[[Категория:digitalWrite]] | |||
[[Категория:else]] | |||
[[Категория:Плата Arduino]] | |||
[[Категория:Светодиод]] | |||
[[Категория:Резистор]] |
Текущая версия от 18:18, 14 мая 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Мигание без команды Delay [1]
Иногда в процессе работы может потребоваться, чтобы два процесса проходили одновременно. К примеру, может понадобиться, чтобы светодиод мигал каждый раз, когда система будет считывать нажатие на кнопку. В этом случае функцию delay() использовать нельзя – руководствуясь ею, Arduino приостановит действие программы и потому просто «проморгает» факт нажатия на кнопку.
Скетч ниже демонстрирует, как заставить светодиод мигать, не используя при этом функцию delay(). Код заставляет светодиод включиться, а затем отмечает время. Затем, проходя через loop(), проверяет, не закончилось ли время, отведенное программой на режим «вкл». Если закончилось, он выключает светодиод и снова отмечает время. Потом ждет, когда закончится нужный интервал и снова включает светодиод. И так по кругу. То есть этот код заставляет светодиод непрерывно мигать.
В качестве аналогии можно привести такую ситуацию – допустим, вы разогреваете в микроволновке пиццу и в то же время ждете важного телефонного звонка. Вы кладете пиццу в микроволновку и включаете ее на 10 минут. То есть, если сравнить это с использованием функции delay(), то вы как бы сидите перед микроволновкой и ждете, когда таймер отсчитает эти 10 минут, но, услышав звонок, вдруг убегаете в другую комнату снимать трубку, тем самым «проморгав» момент икс – 10 минут превратятся в 11, 12, 13 и т.д., пока пицца не превратится в обуглившуюся лепешку.
Но это пример из выдуманной вселенной, где у микроволновки нет таймера. В нашей же вселенной он есть, благодаря чему во время подогрева пиццы вы можете и разговаривать по телефону, и читать «имейлы», и сидеть в соцсети (но не слишком долго – пицца остынет!), будучи уверенным, что по прошествии этих 10 минут микроволновка выключится и пицца будет в идеальной кондиции.
В данном примере мы как раз научимся делать подобный таймер.
Необходимое оборудование
- Плата Arduino - 1шт.
- Светодиод - 1шт.
- Резистор (номиналом от 220 Ом до 1 кОм) - 1шт.
Цепь
Подсоедините один конец резистора к 13-му контакту Arduino. К другому концу резистора подсоедините длинную ногу светодиода (это нога с положительным зарядом, т.н. анод). Короткую ногу светодиода (ногу с отрицательным зарядом, т.н. катод) подсоедините к контакту «земля» (GND) на Arduino, как показано на чертеже вверху и на схеме внизу.
У большинства плат Arduino уже есть светодиод, подсоединенный к 13-му контакту. В таком случае, если вы запустите нижеуказанный код, не подключив к плате ни светодиода, ни резистора, то увидите, как начнет мигать «родной» светодиод.
Схема
Создав цепь, подсоедините 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);
}
}
См.также
Внешние ссылки
Arduino продукты | |
---|---|
Начальный уровень | Arduino Uno • Arduino Leonardo • Arduino 101 • Arduino Robot • Arduino Esplora • Arduino Micro • Arduino Nano • Arduino Mini • Arduino Starter Kit • Arduino Basic Kit • MKR2UNO • TFT-дисплей Arduino |
Продвинутые функции | Arduino Mega 2560 • Arduino Zero • Arduino Due • Arduino Mega ADK • Arduino Pro • Arduino Motor Shield • Arduino USB Host Shield • Arduino Proto Shield • MKR Proto Shield • MKR Proto Large Shield • Arduino ISP • Arduino USB 2 Serial Micro • Arduino Mini USB Serial Adapter |
Интернет вещей | Arduino Yun • Arduino Ethernet • Arduino MKR1000 • Arduino WiFi 101 Shield • Arduino GSM Shield V2 • Arduino WiFi Shield • Arduino Wireless SD Shield • Arduino Wireless Proto Shield • Arduino Ethernet Shield V2 • Arduino Yun Shield • Arduino MKR1000 Bundle |
Носимые устройства | Arduino Gemma • Lilypad Arduino Simple • Lilypad Arduino Main Board • Lilypad Arduino USB • LilyPad Arduino SimpleSnap |
3D-печать | Arduino Materia 101 |
Устаревшие устройства | - |
Примеры Arduino | |
---|---|
Стандартные функции | |
Основы |
|
Цифровой сигнал |
|
Аналоговый сигнал |
|
Связь |
|
Управляющие структуры |
|
Датчики |
|
Дисплей |
Примеры, объясняющие основы управления дисплеем:
|
Строки |
|
USB (для Leonardo, Micro и Due плат) |
В этой секции имеют место примеры, которые демонстрируют использование библиотек, уникальных для плат Leonardo, Micro и Due.
|
Клавиатура |
|
Мышь |
|
Разное |
- Страницы, использующие повторяющиеся аргументы в вызовах шаблонов
- Справочник языка Arduino
- Arduino
- Перевод от Сubewriter
- Проверка:myagkij
- Оформление:myagkij
- Редактирование:myagkij
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Пример
- Примеры
- Пример программирования Arduino
- Примеры программирования Arduino
- LOW
- Setup()
- Setup
- Void
- PinMode()
- OUTPUT
- Loop
- Loop()
- Millis()
- If
- HIGH
- DigitalWrite()
- DigitalWrite
- Else
- Плата Arduino
- Светодиод
- Резистор