Что верно в отношении функции digitalread
Функция digitalRead ()
digitalRead () в Arduino позволяет получить логическое значение определенного пина. Функция, как правило, используется при работе с цифровыми устройствами, если в программе требуется отслеживать изменение состояния какого-либо датчика. В этой статье мы рассмотрим синтаксис, примеры использования и некоторые особенности этой функции.
Синтаксис digitalRead ()
Описание работы функции
Функция digitalRead () используется для того, чтобы получить информацию от внешнего устройства, подключенного к определенному пину. Таким устройством может быть кнопка или любой датчик, формирующий высокий или низкий уровень сигнала в зависимости от ситуации. Получив сигнал, мы можем как-то на него прореагировать: включить светодиод, издать звук, запустить двигатель или отправить SMS-сообщение.
Важное отличие функции от другой функции считывания показаний analogRead() заключается в том, что мы не можем узнать реальный уровень сигнала на входе, даже если мы считываем его с аналоговых пинов. digitalRead всегда возвращает лишь два варианта значений: HIGH и LOW:
Для корректной работы функции нужно, чтобы пины находились в режиме INPUT или INPUT_PULLUP, т.к. в противном случае поступающий сигнал будет искажаться из-за падения напряжения на внутреннем резисторе, подключаемом к пинам в режимах OUTPUT.
В случае, если к выбранному пину не подключено устройство, функция работать не будет. Т.е. она будет возвращать какие-то значения, но они будут совершенно случайными. Такой же результат будет в случае подключения устройства в неопределенном состоянии, например, кнопки без подтягивающего резистора, когда она не нажата.
Примеры использования digitalRead ()
Изучение функции digitalRead лучше начинать на простых проектах: с подключенной кнопкой и датчиком, имеющим цифровой выход (например, датчик движения).
Пример работы с кнопкой
В данном варианте схемы мы подключаем ко второму пину кнопочный переключатель с подтягивающим резистором 1КОм. Резистор нужен для того, чтобы в не нажатом состоянии на входе не возникали помехи.
Пример скетча отслеживания нажатия кнопки
Пример для схемы с кнопкой в режиме INPUT_PULLUP
Схема подключения максимально проста:
Пример скетча с INPUT_PULLUP
Сам скетч меняется минимально. Мы просто определяем тип пина как INPUT_PULLUP и получаем в итоге гораздо меньше хаоса на входе:
Пример подключения датчика движения
Датчик движения подключается по обычной схеме. Более подробно о PIR-сенсорах можно прочитать в этой статье. Цифровой выход датчика подсоединяем ко второму цифровому пину.
Для работы можно использовать тот же скетч, то и для варианта работы с кнопкой в режиме INPUT (для датчика движения подтягивающих резисторов не требуется, они уже встроены в модуль сенсора).
Краткие выводы
Функция digitalRead одна из важнейших и часто используемых в ардуино. С ее помощью мы «чувствуем» окружающий мир. Правда, в отличие от analogRead, картина всегда получается черно-белой: функция возвращает только два варианта значений: HIGH или LOW. Во многих случаях этого вполне хватает. Например, если нам нужно просто получить сигнал о возникновении какого-либо события, такого как срабатывание датчика движения, звука, вибрации.
Использовать digitalRead () очень просто – нужно просто передать ей номер пина, с которого будет считан сигнал. Функция возвратит нам число, равное HIGH или LOW, которое мы затем сможем сверить в блоке условия и выполнить какие-то действия. Самое главное, собрать схему так, чтобы на входе не получать случайные значения. В этой статье мы привели несколько примеров с советами.
Функция digitalRead ()
digitalRead () в Arduino позволяет получить логическое значение определенного пина. Функция, как правило, используется при работе с цифровыми устройствами, если в программе требуется отслеживать изменение состояния какого-либо датчика. В этой статье мы рассмотрим синтаксис, примеры использования и некоторые особенности этой функции.
Синтаксис digitalRead ()
Описание работы функции
Функция digitalRead () используется для того, чтобы получить информацию от внешнего устройства, подключенного к определенному пину. Таким устройством может быть кнопка или любой датчик, формирующий высокий или низкий уровень сигнала в зависимости от ситуации. Получив сигнал, мы можем как-то на него прореагировать: включить светодиод, издать звук, запустить двигатель или отправить SMS-сообщение.
Важное отличие функции от другой функции считывания показаний analogRead() заключается в том, что мы не можем узнать реальный уровень сигнала на входе, даже если мы считываем его с аналоговых пинов. digitalRead всегда возвращает лишь два варианта значений: HIGH и LOW:
Для корректной работы функции нужно, чтобы пины находились в режиме INPUT или INPUT_PULLUP, т.к. в противном случае поступающий сигнал будет искажаться из-за падения напряжения на внутреннем резисторе, подключаемом к пинам в режимах OUTPUT.
В случае, если к выбранному пину не подключено устройство, функция работать не будет. Т.е. она будет возвращать какие-то значения, но они будут совершенно случайными. Такой же результат будет в случае подключения устройства в неопределенном состоянии, например, кнопки без подтягивающего резистора, когда она не нажата.
Примеры использования digitalRead ()
Изучение функции digitalRead лучше начинать на простых проектах: с подключенной кнопкой и датчиком, имеющим цифровой выход (например, датчик движения).
Пример работы с кнопкой
В данном варианте схемы мы подключаем ко второму пину кнопочный переключатель с подтягивающим резистором 1КОм. Резистор нужен для того, чтобы в не нажатом состоянии на входе не возникали помехи.
Пример скетча отслеживания нажатия кнопки
Пример для схемы с кнопкой в режиме INPUT_PULLUP
Схема подключения максимально проста:
Пример скетча с INPUT_PULLUP
Сам скетч меняется минимально. Мы просто определяем тип пина как INPUT_PULLUP и получаем в итоге гораздо меньше хаоса на входе:
Пример подключения датчика движения
Датчик движения подключается по обычной схеме. Более подробно о PIR-сенсорах можно прочитать в этой статье. Цифровой выход датчика подсоединяем ко второму цифровому пину.
Для работы можно использовать тот же скетч, то и для варианта работы с кнопкой в режиме INPUT (для датчика движения подтягивающих резисторов не требуется, они уже встроены в модуль сенсора).
Краткие выводы
Функция digitalRead одна из важнейших и часто используемых в ардуино. С ее помощью мы «чувствуем» окружающий мир. Правда, в отличие от analogRead, картина всегда получается черно-белой: функция возвращает только два варианта значений: HIGH или LOW. Во многих случаях этого вполне хватает. Например, если нам нужно просто получить сигнал о возникновении какого-либо события, такого как срабатывание датчика движения, звука, вибрации.
Использовать digitalRead () очень просто – нужно просто передать ей номер пина, с которого будет считан сигнал. Функция возвратит нам число, равное HIGH или LOW, которое мы затем сможем сверить в блоке условия и выполнить какие-то действия. Самое главное, собрать схему так, чтобы на входе не получать случайные значения. В этой статье мы привели несколько примеров с советами.
Digital Read Serial
This example shows you how to monitor the state of a switch by establishing serial communication between your Arduino and your computer over USB.
Hardware Required
A momentary switch, button, or toggle switch
Circuit
Connect three wires to the board. The first two, red and black, connect to the two long vertical rows on the side of the breadboard to provide access to the 5 volt supply and ground. The third wire goes from digital pin 2 to one leg of the pushbutton. That same leg of the button connects through a pull-down resistor (here 10k ohm) to ground. The other leg of the button connects to the 5 volt supply.
Pushbuttons or switches connect two points in a circuit when you press them. When the pushbutton is open (unpressed) there is no connection between the two legs of the pushbutton, so the pin is connected to ground (through the pull-down resistor) and reads as LOW, or 0. When the button is closed (pressed), it makes a connection between its two legs, connecting the pin to 5 volts, so that the pin reads as HIGH, or 1.
Schematic
In the program below, the very first thing that you do will in the setup function is to begin serial communications, at 9600 bits of data per second, between your board and your computer with the line:
Next, initialize digital pin 2, the pin that will read the output from your button, as an input:
Now that your setup has been completed, move into the main loop of your code. When your button is pressed, 5 volts will freely flow through your circuit, and when it is not pressed, the input pin will be connected to ground through the 10k ohm resistor. This is a digital input, meaning that the switch can only be in either an on state (seen by your Arduino as a «1», or HIGH) or an off state (seen by your Arduino as a «0», or LOW), with nothing in between.
int sensorValue = digitalRead(2);
Once the board has read the input, make it print this information back to the computer as a decimal value. You can do this with the command Serial.println() in our last line of code:
Now, when you open your Serial Monitor in the Arduino Software (IDE), you will see a stream of «0»s if your switch is open, or «1»s if your switch is closed.
Русские Блоги
Объяснение синтаксиса функции Arduino (включая примеры) три
1. Цифровой ввод / вывод
Два аналоговых входа / выхода
2.3 analogWrite() PWM
3. Расширенный ввод-вывод
Пять, математические операции
Шесть, тригонометрические функции
Семь, случайное число
Девять, установите функцию прерывания
10. Переключить прерывание
10.1 interrupts () (прерывание)
10.2 noInterrupts () (отключить прерывания)
12. USB (только для Леонардо и Дуэ)
12.1 Мышь (клавиатура)
12.2 Клавиатура (мышь)
1. Цифровой ввод / вывод
описание
Настройте указанный вывод как выход или вход. Подробнее см. Цифровые контакты.
грамматика
параметр
pin: Пин для установки режима
режим: ВХОД или ВЫХОД
ledPin = 13 // светодиод подключен к цифровому выводу 13
pinMode (ledPin, OUTPUT); // Установить цифровой вывод как выход
digitalWrite (ledPin, HIGH); // загораем светодиод
delay (1000); // ждем одну секунду
digitalWrite (ledPin, LOW); // Выключаем светодиод
Delay (1000); // ждем секунду
нота
Вывод аналогового входа также может использоваться как цифровой вывод, см. A0, A1 и т. Д.
описание
Напишите HIGH или LOW на цифровой вывод.
Если вывод настроен в режиме INPUT, использование digitalWrite () для записи значения HIGH сделает внутренний подтягивающий резистор 20 кОм (подробности см. В руководстве по цифровым выводам). Запись LOW отключит подтягивание. Подтягивающий резистор может загорать светодиод, чтобы сделать его немного ярче.Если светодиод работает, но яркость очень низкая, это может быть вызвано этой причиной. Чтобы исправить это, используйте функцию pinMode () для установки выходного контакта.
грамматика
параметр
pin: номер контакта (например, 1, 5, 10, A0, A3)
возвращение
int ledPin = 13; // светодиод подключен к порту номер 13
pinMode (ledPin, OUTPUT); // Установить цифровой порт в режим ввода
digitalWrite (ledPin, HIGH); // делаем светодиод ярким
delay (1000); // задержка на одну секунду
digitalWrite (ledPin, LOW); // выключаем светодиод
delay (1000); // задержка на одну секунду
Порт 13 устанавливается на высокий уровень с задержкой на одну секунду, а затем устанавливается на низкий уровень.
Аналоговые выводы также могут использоваться как цифровые выводы, используя входные порты A0, A1, A2 и т. Д.
описание
Считайте значение указанного вывода, ВЫСОКОЕ или НИЗКОЕ.
грамматика
параметр
pin: номер контакта, который вы хотите прочитать (int)
возвращение
ВЫСОКИЙ или НИЗКИЙ
пример
ledPin = 13 // светодиод подключен к выводу 13
int inPin = 7; // кнопка подключена к цифровому выводу 7
int val = 0; // Определяем переменную для хранения считанного значения
pinMode (ledPin, OUTPUT); // Установить вывод 13 как выход
pinMode (inPin, INPUT); // Установить вывод 7 как вход
val = digitalRead (inPin); // считываем входной контакт
digitalWrite (ledPin, val); // Устанавливаем значение светодиода на значение кнопки
Установите 13 контакт на значение входного контакта 7.
нота
Если вывод оставить плавающим, digitalRead () вернет HIGH или LOW (случайное изменение).
Контакты аналогового входа могут использоваться как цифровые, см. A0, A1 и т. Д.
2. Аналоговый ввод / вывод
описание
Настройка опорного напряжения, используемое для аналогового входа (то есть максимальное значение входного диапазона). Возможные варианты:
ВНУТРЕННЯЯ: Используйте 1.1V в качестве опорного напряжения на ATmega168 и ATmega328, и 2.56V в качестве опорного напряжения на ATmega8 (Arduino Mega не имеет этот вариант)
INTERNAL1V1: Используйте 1.1V в качестве опорного напряжения (опция только для Arduino Mega)
INTERNAL2V56: Возьмите 2.56V в качестве опорного напряжения (опция только для Arduino Mega)
ВНЕШНИЙ: Используйте напряжение AREF штифта (от 0 до 5) в качестве опорного напряжения.
параметр
тип: какой тип ссылки использовать (ПО УМОЛЧАНИЮ, ВНУТРЕННЯЯ, ВНУТРЕННЯЯ1V1, ВНУТРЕННЯЯ2V56 или ВНЕШНЯЯ).
возвращение
Меры предосторожности
После изменения опорного напряжения, данные считываются из ранее analogRead () может быть неточной.
предостережение
Не используйте внешнее напряжение ниже 0 В или выше 5 В на выводе AREF. Если вы используете напряжение на Ареф штифтом в качестве опорного напряжения, необходимо установить тип ссылки на EXTERNAL перед вызовом analogRead (). В противном случае, вы будете сократить эффективное опорное напряжение (внутренне генерируемый) и Ареф штифт, который может повредить микроконтроллер на вашем Arduino борту.
Кроме того, вы можете подключить резистор 5K между внешним опорным напряжением и выводом AREF, что позволит вам переключаться между внешним и внутренним опорным напряжением. Обратите внимание, что общее сопротивление изменится, потому что внутри вывода AREF находится резистор 32 кОм. Оба резистора имеют эффект делителя напряжения. Так, например, если вы вводите напряжение 2,5 В, конечное напряжение на выводе AREF будет 2,5 * 32 / (32 + 5) = 2,2 В.
описание
Считайте значение данных с назначенного аналогового вывода. Плата Arduino содержит 6-канальный (у Mini и Nano 8 каналов, у Mega 16 каналов) 10-битный аналого-цифровой преобразователь. Это означает, что он преобразует входные напряжения от 0 до 5 вольт в целые числа от 0 до 1023. Это приведет к соотношению между показаниями: 5 вольт / 1024 единицы или 0,0049 вольт (4,9 мВ) на единицу. Диапазон ввода и точность можно изменить с помощью analogReference (). Для чтения аналогового входа требуется около 100 микросекунд (0,0001), поэтому максимальная скорость чтения составляет 10 000 раз в секунду.
грамматика
Значение чтения
Контакт: считывание значения с входного контакта (от 0 до 5 для большинства плат, от 0 до 7 для Mini и Nano и от 0 до 15 для Mega)
возвращение
Целочисленное значение от 0 до 1023
Меры предосторожности
Если аналоговый входной контакт не подключен к схеме, значение, возвращаемое функцией analogRead (), будет колебаться в зависимости от ряда факторов (таких как другие аналоговые входные контакты, ваша рука находится рядом с платой и т. Д.).
пример
int analogPin = 3; // Потенциометр (средний вывод) подключен к выводу 3 аналогового входа
int val = 0; // Определяем переменную для хранения считанного значения
serial.begin (9600); // Устанавливаем скорость передачи (9600)
val = analogRead (analogPin); // Считываем значение с входного контакта
serial.println (val); // Отображаем прочитанное значение
2.3 analogWrite() PWM
описание
Аналоговое значение (ШИМ) выводится через вывод. Его можно использовать для освещения светодиодов с разной яркостью или для вращения двигателей с разной скоростью. После завершения вывода analogWrite () вывод будет генерировать стабильную прямоугольную волну специального рабочего цикла до следующего вызова analogWrite () (или вызова digitalRead () или digitalWrite () на том же выводе). Частота сигнала ШИМ составляет примерно 490 Гц.
В большинстве плат Arduino (ATmega168 или ATmega328) эту функцию могут выполнять только контакты 3, 5, 6, 9, 10 и 11. На aduino Mega эту функцию могут выполнять контакты с 2 по 13. На старой плате Arduino (ATmega8) только выводы 9, 10, 11 могут использовать analogWrite (). Перед использованием analogWrite () вам не нужно вызывать pinMode (), чтобы установить вывод в качестве вывода.
Функция analogWrite не связана напрямую с аналоговым выводом и функцией analogRead.
грамматика
параметр
pin: вывод, используемый для ввода значения.
значение: Рабочий цикл: от 0 (полностью закрыт) до 255 (полностью открыт).
возвращение
Описание и известные проблемы
Выходное значение PWM контактов 5 и 6 будет выше ожидаемого рабочего цикла (выходное значение выше). Это связано с тем, что функции millis () и delay () используют тот же внутренний таймер, что и выход ШИМ. Это приведет к состоянию низкого рабочего цикла большую часть времени (например, 0-10) и может привести к тому, что контакты 5 и 6 не будут полностью замкнуты, когда значение равно 0.
пример
Управляйте яркостью светодиода, считывая сопротивление потенциометра.
int ledPin = 9; // светодиод подключен к цифровому выводу 9
int analogPin = 3; // Потенциометр подключен к аналоговому выводу 3
int val = 0; // Определяем переменную для хранения считанного значения
pinMode (ledPin, OUTPUT); // Установить вывод как вывод
val = analogRead (analogPin); // Считываем значение с входного контакта
analogWrite (ledPin, val / 4); // загораем светодиод со значением val / 4 (поскольку значение, считываемое функцией analogRead, составляет от 0 до 1023, а значение, выводимое функцией analogWrite, составляет от 0 до 255)
3. Расширенный ввод-вывод
описание
Сгенерируйте прямоугольный сигнал с определенной частотой (рабочий цикл 50%) на выводе. Продолжительность может быть установлена, в противном случае форма волны будет генерироваться до тех пор, пока не будет вызвана функция noTone (). Этот контакт можно подключить к пьезоэлектрическому зуммеру или другим динамикам для воспроизведения звука.
Одновременно может воспроизводиться только один звук. Если на булавке уже воспроизводится музыка, сигнал вызова () не действует. Если музыка воспроизводится на одном и том же контакте, частота автоматически регулируется.
Использование функции tone () будет создавать помехи для 3- и 11-контактной ШИМ (кроме платы Mega).
Примечание. Если вы хотите генерировать разные тона на нескольких выводах, вам необходимо вызвать функцию noTone () на этом выводе, прежде чем использовать функцию tone () на следующем выводе.
грамматика
tone(pin, frequency, duration)
параметр
булавка: булавка для воспроизведения звука
частота: частота звука, единица Гц, тип unsigned int
duration: продолжительность звука в миллисекундах (необязательно), введите unsigned long
описание
Остановите прямоугольную волну, генерируемую тоном (). Если тон () не используется, это не повлияет.
Примечание. Если вы хотите генерировать разные звуки на нескольких выводах, вам нужно вызвать noTone () на предыдущем выводе, прежде чем использовать tone () на следующем выводе.
грамматика
параметр
булавка: булавка для прекращения воспроизведения звука
описание
Сдвигайте байт данных побитно. Начните со старшего бита (крайний левый) или младшего значащего бита (крайний правый). Запишите каждый бит на вывод данных по очереди, а затем на выводе синхронизации поднимается высокий или низкий уровень, указывая, что предыдущие данные действительны.
Примечание. Если тип часов устройства, к которому вы подключены, является нарастающим фронтом, перед вызовом shiftOut (), например, вызовом digitalWrite (clockPin, LOW), необходимо убедиться, что на выводе тактов низкий уровень.
Примечание: это программная реализация; Arduino предоставляет аппаратно реализованную библиотеку SPI, которая работает быстрее, но эффективна только на определенных выводах.
грамматика
shiftOut(dataPin, clockPin, bitOrder, value)
параметр
dataPin: выходной контакт для каждого бита данных (int)
clockPin: вывод часов, когда dataPin имеет значение, уровень вывода изменяется (int)
bitOrder: порядок выходных битов, сначала старший бит или младший бит
значение: выходные данные для смещения (байт)
возвращение
нота
dataPin и clockPin должны быть настроены как вывод с помощью pinMode (). В настоящее время shiftOut может выводить только 1 байт (8 бит), поэтому, если выходное значение больше 255, его нужно разделить на два шага.
// Старший бит имеет приоритетный последовательный вывод
// Сдвиг вывода старшего байта
shiftOut(dataPin, clock, MSBFIRST, (data >> 8));
// Сдвиг вывода младшего байта
shiftOut(data, clock, MSBFIRST, data);
// Первый последовательный вывод младшего разряда
// Сдвиг вывода младшего байта
shiftOut(dataPin, clock, LSBFIRST, data);
// Сдвиг вывода старшего байта
shiftOut(dataPin, clock, LSBFIRST, (data >> 8));
пример
Соответствующую схему см. В руководстве по управлению регистром сдвига 74HC595.
// Название: shiftOut code, Hello World //
// Author : Carlyn Maw,Tom Igoe //
// Примечание: используйте регистр сдвига 74HC595 для подсчета от 0 до 255 //
// Вывод подключен к ST_CP 74HC595
// Вывод подключен к SH_CP 74HC595
// // Вывод подключен к DS 74HC595
// Устанавливаем вывод как выход
// Программа подсчета вверх
описание
Последовательный сдвиг байта данных. Начните со старшего бита (крайний левый) или младшего бита (крайний правый). Для каждого бита сначала установите высокий уровень синхронизации, затем прочитайте бит из линии передачи данных, а затем установите низкий уровень тактовой частоты.
Примечание: это программная реализация; Arduino предоставляет аппаратно реализованную библиотеку SPI, которая работает быстрее, но эффективна только на определенных выводах.
грамматика
параметр
dataPin: выходной контакт для каждого бита данных (int)
clockPin: вывод часов, когда dataPin имеет значение, уровень вывода изменяется (int)
bitOrder: порядок выходных битов, сначала старший бит или младший бит
описание
Считайте пульс (ВЫСОКИЙ или НИЗКИЙ) пина. Например, если значение HIGH, pulseIn () будет ждать, пока вывод станет HIGH и начнет отсчет времени, а затем дождется, пока вывод станет LOW и остановит отсчет времени. Возвращает длину импульса в микросекундах. Если в течение указанного времени нет импульса, функция вернется.
Функция синхронизации этой функции определяется опытом, и длительная синхронизация импульсов может вызвать ошибки. Диапазон времени составляет от 10 микросекунд до 3 минут. (1 секунда = 1000 миллисекунд = 1000000 микросекунд)
грамматика
pulseIn(pin, value, timeout)
параметр
pin: номер контакта (int), который вы хотите синхронизировать.
value: Тип импульса для чтения, HIGH или LOW (int).
возвращение
Длина импульса (микросекунды), если таймаут ожидания возвращает 0 (беззнаковый длинный)
пример
unsigned long duration;
duration = pulseIn(pin, HIGH);;
Четыре раза
описание
Возвращает количество миллисекунд, прошедших с тех пор, как плата разработки Arduino запустила текущую программу. Это число переполнится (вернется к нулю) примерно через 50 дней.
параметр
возвращение
Возвращает количество миллисекунд (длинное целое число без знака) с момента запуска текущей программы.
пример
unsigned long time;
// Выводим время от начала программы до настоящего момента
// Подождите одну секунду, чтобы избежать отправки большого количества данных
незамедлительный
Обратите внимание, что параметр millis представляет собой длинное целое число без знака. Попытка выполнить математические операции с другими типами данных (например, с целыми числами) может вызвать ошибки.
Когда срабатывает функция прерывания, значение millis () больше не изменяется.
описание
Возвращает количество микросекунд, прошедших с момента, когда плата разработки Arduino запустила текущую программу. Это число переполнится (вернется к нулю) примерно через 70 минут. На платах разработки Arduino с частотой 16 МГц (таких как Duemilanove и Nano) разрешение этой функции составляет четыре микросекунды (то есть возвращаемое значение всегда кратно четырем). На плате разработки Arduino с тактовой частотой 8 МГц (например, LilyPad) разрешение этой функции составляет восемь микросекунд.
параметр
Возвращает количество микросекунд (длинное целое число без знака) с момента запуска текущей программы.
unsigned long time;
// Выводим время с начала программы
// Подождите одну секунду, чтобы избежать отправки большого количества данных
описание
Время (в миллисекундах) для временной установки программы. (Одна секунда равна 1000 миллисекунд)
грамматика
параметр
мс: количество миллисекунд для паузы (беззнаковое длинное)
возвращение
пример
ledPin = 13 // светодиод подключен к цифровому 13 пину
pinMode (ledPin, OUTPUT); // Установить вывод как выход
digitalWrite (ledPin, HIGH); // загораем светодиод
delay (1000); // ждем 1 секунду
digitalWrite (ledPin, LOW); // Выключаем светодиод
delay (1000); // ждем одну секунду
предостережение
Хотя создать мигающий светодиод с помощью delay () просто, и во многих примерах используется короткая задержка для устранения дрожания переключателя, delay () действительно имеет много существенных недостатков. В процессе использования функции задержки считывание значений датчиков, вычисления и операции с контактами не могут быть выполнены, поэтому это приводит к приостановке большинства других действий. Для других методов работы с синхронизацией, пожалуйста, присоединитесь к функции millis () и следующим примерам. Большинство опытных программистов обычно избегают delay () дольше 10 миллисекунд, если только программа arduino не очень проста.
Однако некоторые операции все еще могут выполняться при выполнении delay (), поскольку функция задержки не отменяет прерывание. Данные, полученные через коммуникационный порт RX, будут записаны, значение PWM (analogWrite) и статус вывода будут поддерживаться, а прерывание будет выполняться в соответствии с настройками.
описание
Приостановить программу на указанный период времени (единица измерения: микросекунды). Одна секунда равна 1 000 000 микросекунд. В настоящее время максимальная точность задержки, которую можно сгенерировать, составляет 16383. Это может измениться в будущих версиях Arduino. Для задержек, превышающих несколько тысяч микросекунд, вместо этого следует использовать delay ().
грамматика
параметр
us: время паузы в микросекундах (целое число без знака)
возвращение
пример
int outPin = 8; // digital pin 8
pinMode (outPin, OUTPUT); // установить как цифровой вывод для вывода
digitalWrite (outPin, HIGH); // Установить высокий уровень пина
delayMicroseconds (50); // пауза на 50 микросекунд
digitalWrite (outPin, LOW); // устанавливаем вывод на низкий уровень
delayMicroseconds (50); // пауза на 50 микросекунд
Настройте контакт 8 как выходной контакт. Он излучает серию прямоугольных волн с периодом 100 микросекунд.
Предупреждения и известные проблемы
Эта функция работает очень точно выше 3 микросекунд. Мы не можем гарантировать, что delayMicroseconds будет точным за меньшее время.
После версии Arduino0018 delayMicroseconds () больше не делает прерывание недействительным.
Пять, математические операции
описание
Вычислите минимум двух чисел.
параметр
X: первое число, любой тип данных
Y: второе число, любой тип данных
возвращение
Меньшее из двух чисел.
Например
sensVal = min (sensVal, 100); // Присваиваем SensVal меньшее из sensVal или 100
// Убедитесь, что оно никогда не превышает 100.
Комментарий
Интуитивно понятное сравнение, метод max () часто используется для ограничения нижнего предела переменной, а min () часто используется для ограничения верхнего предела переменной.
предостережение
Из-за того, как реализована функция min (), следует избегать использования других функций в круглых скобках, так как это приведет к неверным результатам.
min (a, 100); // Используйте эту форму вместо других математических операций вне функции
описание
Вычислите максимум два числа.
параметр
X: первое число, любой тип данных
Y: второе число, любой тип данных
возвращение
Больший из двух параметров.
пример
sensVal = max (senVal, 20); // присваиваем sensVal 20 или больше
// (Фактически гарантируем, что его значение не менее 20)
нота
Вопреки интуиции, max () обычно используется для ограничения минимального значения переменной, а min () обычно используется для ограничения максимального значения переменной.
предостережение
Из-за реализации функции max () избегайте вложения других функций в круглые скобки, что может привести к неверным результатам.
max (a–, 0); // Избегайте этого использования, это приведет к неверным результатам
a—; // вместо этого используем этот метод
max (a, 0); // выводим другие вычисления за пределы функции
описание
Вычислить абсолютное значение числа.
параметр
возвращение
Если x больше или равно 0, он возвращает себя. Если x меньше 0, возвращается обратное.
предостережение
Из-за метода реализации функции ABS () избегайте использования каких-либо функций в скобках (только цифры в скобках), иначе это приведет к неверным результатам.
ABS (a + +); // Избегайте этой ситуации, иначе результат будет некорректным
a ++; // Используйте этот код вместо указанного выше кода ошибки
ABS (a); // Убедимся, что другие функции вынесены за скобки
описание
Ограничить число в пределах диапазона
параметр
x: число, которое необходимо ограничить, применимы все типы данных.
a: Минимальное значение диапазона, применимы все типы данных.
b: максимальное значение диапазона, применимы все типы данных.
возвращаемое значение
x: если x находится между a и b
пример
sensVal = constrain(sensVal, 10, 150);
// Диапазон возвращаемого значения датчика ограничен от 10 до 150
map(value, fromLow, fromHigh, toLow, toHigh)
описание
Сопоставьте число из одного диапазона с другим. Другими словами, значения между fromLow и fromHigh отображаются на значения между toLow и toHigh.
Диапазон значений не ограничен, потому что значения за пределами диапазона иногда являются преднамеренными и полезными. Если вам нужно ограничить диапазон, функцию constrain () можно использовать до или после этой функции.
Обратите внимание, что «нижний предел» в двух диапазонах может быть больше или меньше «верхнего предела», поэтому функцию map () можно использовать для переворота диапазона значений, например:
Эта функция также может обрабатывать отрицательные числа, см. Следующий пример:
Это эффективно и хорошо работает.
Функция map () использует для расчетов целые числа и поэтому не дает оценок. Расчет должен указывать, что это необходимо. Остаток десятичной дроби будет округлен, а не округлен и не усреднен.
параметр
значение: значение для отображения
fromLow: нижний предел текущего значения диапазона
fromHigh: верхний предел текущего значения диапазона
toLow: нижняя граница значения целевого диапазона
toHigh: верхний предел значения целевого диапазона
возвращаемое значение
пример
/Сопоставьте аналоговое значение с 8 битами (от 0 до 255)/
int val = analogRead(0);
val = map(val, 0, 1023, 0, 255);
приложение
Что касается реализации математики, вот полная функция
long map(long x, long in_min, long in_max, long out_min, long out_max)
описание
Вычислите степень числа. Pow () можно использовать для вычисления дробной степени числа. Это очень удобно для построения экспоненциальных степенных чисел или кривых.
параметр
база: база (плавающая)
экспонента: мощность (с плавающей запятой)
возвращение
Сила числа (двойная)
пример
Подробнее см. Функцию fscale в коде библиотеки.
описание
Вычислите квадратный корень числа.
параметр
x: количество квадратных корней любого типа
возвращаемое значение
Квадратный корень из этого числа, введите double
Шесть, случайное число
описание
Используйте randomSeed () для инициализации генератора псевдослучайных чисел, чтобы генератор запускался в любой точке случайной последовательности. Эта последовательность, хотя и очень длинная и случайная, всегда одна и та же.
Если вам нужно сгенерировать реальное случайное число в последовательности random (), используйте функцию randomSeed () для предварительной установки абсолютного случайного ввода при выполнении его подпоследовательности, например, возврат функции analogRead () на отключенном контакте. ценность.
И наоборот, иногда также полезно точное повторение псевдослучайных чисел. Это можно сделать, вызвав функцию randomSeed (), которая использует фиксированное значение перед началом случайной серии.
параметр
возвращение
Нет возвращаемого значения
пример
описание
Использование функции random () генерирует псевдослучайные числа.
грамматика
параметр
возвращение
Случайное число от min до max-1 (тип данных длинный)
нота
Если вам нужно сгенерировать реальное случайное число в последовательности random (), используйте функцию randomSeed () для предварительной установки абсолютного случайного ввода при выполнении его подпоследовательности, например, возврат функции analogRead () на отключенном контакте. ценность.
И наоборот, иногда также полезно точное повторение псевдослучайных чисел. Это можно сделать, вызвав функцию randomSeed (), которая использует фиксированное значение перед началом случайной серии.
пример
// Если аналоговый входной вывод 0 отключен, случайный аналоговый шум
// Функция randomSeed () будет вызываться каждый раз при запуске кода
// Различные начальные значения.
// randomSeed () случайным образом прервет выполнение функции random.
// Вывести случайное число от 0 до 299
// Вывести случайное число от 10 до 19
randNumber = random(10, 20);
Семь битная операция
описание
Извлеките младший (крайний правый) байт переменной (например, слова).
грамматика
параметр
x: любой тип значения
возвращение
описание
Извлеките старший бит байта (крайний левый) или второй младший бит более длинного байта.
грамматика
параметр
x: любой тип значения
возвращение
описание
Прочтите цифры числа.
грамматика
параметр
возвращение
Значение этого бита (0 или 1).
описание
Запишите цифровую переменную на бите.
грамматика
параметр
X: числовая переменная для записи
N: бит числовой переменной, который будет записан, начиная с 0, это самый младший (крайний правый) бит
B: значение записанного бита (0 или 1)
возвращение
описание
Установите бит для числовой переменной.
утверждение
грамматика
X: числовая переменная, которую вы хотите установить.
возвращение
описание
Очистить назначенный бит числового значения (установить этот бит в 0)
грамматика
параметр
X: укажите значение очищаемого бита N: укажите позицию очищаемого бита, начиная с 0, 0 означает крайний правый бит
возвращаемое значение
описание
грамматика
параметр
n: биты для вычисления
возвращаемое значение
Восемь, установите функцию прерывания
attachInterrupt(interrupt, function, mode)
описание
Когда происходит внешнее прерывание, вызывается указанная функция. Когда происходит прерывание, эта функция заменяет выполняемую программу. Большинство плат Arduino имеют два внешних прерывания: 0 (цифровой контакт 2) и 1 (цифровой контакт 3).
Arduino Mege имеет четыре внешних прерывания: номер 2 (вывод 21), 3 (вывод 20), 4 (вывод 19), 5 (вывод 18).
грамматика
прерывание: количество контактов прерывания
function: функция, которая вызывается при возникновении прерывания.Эта функция не должна принимать никаких параметров и возвращать значение. Эту функцию иногда называют процедурой обслуживания прерывания.
режим: определите, когда произойдет прерывание. Следующие четыре константы являются предварительно определенными действующими значениями:
LOW Когда на выводе низкий уровень, запускайте прерывание
ИЗМЕНИТЬ Когда уровень вывода изменяется, запускайте прерывание
RISING Когда вывод меняется с низкого на высокий, запускается прерывание.
ПАДЕНИЕ Когда вывод меняется с высокого на низкий, запускается прерывание.
возвращение
Меры предосторожности
Когда срабатывает функция прерывания, значения delay () и millis () не изменяются. Когда происходит прерывание, данные, полученные через последовательный порт, могут быть потеряны. Вы должны объявить переменную для хранения переменной, когда нет прерывания.
Использовать прерывание
В однокристальной программе автоматизации при возникновении аварийной ситуации прерывание очень полезно, оно может помочь решить проблему синхронизации. Задача, использующая прерывания, может считывать данные с энкодера и отслеживать действия пользователя.
Если вы хотите убедиться, что программа всегда улавливает импульс поворотного энкодера, никогда не будет недостатка в импульсе, это очень усложнит написание программы, которая все делает, потому что программа потребует постоянного опроса датчика линейного энкодера, Чтобы догнать, когда появляется пульс. То же самое верно и для других датчиков, таких как звуковой датчик, пытающийся прочитать кнопку, которая пытается поймать, или инфракрасный щелевой датчик (фотопрерыватель), который пытается поймать падающую монету. Во всех этих случаях микроконтроллер, который может быть отключен прерыванием, используется для выполнения другой работы.
Пример программы
volatile int state = LOW;
attachInterrupt(0, blink, CHANGE);
описание
Закройте данное прерывание.
параметр
прерывание: количество отключенных прерываний (0 или 1).
Девять, переключатель прерван
9.1 interrupts () (прерывание)
описание
Повторно включите прерывания (оно будет отключено после использования команды noInterrupts ()). Прерывания позволяют выполнять некоторые важные задачи в фоновом режиме, и по умолчанию включено состояние. Некоторые функции могут не работать после отключения прерываний, а входящая информация может игнорироваться. Прерывания могут немного нарушить время кода, но прерывания могут быть отключены в ключевых частях.
параметр
возвращение
пример
// Важный, чувствительный ко времени код
// Здесь написан другой код
9.2 noInterrupts () (отключить прерывания)
описание
Отключить прерывания (повторно включить прерывания прерывания ()). Прерывания позволяют некоторым важным задачам выполняться в фоновом режиме, а прерывания включены по умолчанию. Когда прерывания отключены, некоторые функции не будут работать, а информация, полученная во время связи, также может быть потеряна.
Прерывания немного повлияют на временной код, а также не будут работать с некоторыми конкретными кодами.
параметр
возвращение
пример
// Здесь размещается критический, чувствительный ко времени код
// Остальные коды размещены здесь
10. Связь
Используется для связи между платой управления Arduino и компьютером или другим оборудованием. Все платы управления Arduino имеют как минимум один последовательный порт (также известный как UART или USART). Он связывается с компьютером через микросхему преобразования последовательного порта через цифровые контакты 0 (RX) и 1 (TX). Следовательно, если вы используете эти функции, вы не можете использовать контакты 0 и 1 в качестве входа или выхода.
Вы можете использовать последовательный монитор, встроенный в Arduino IDE, для связи с платой Arduino. Нажмите кнопку монитора последовательного порта на панели инструментов, чтобы вызвать функцию begin () (выберите ту же скорость передачи данных).
Arduino Mega имеет три дополнительных последовательных порта: Serial 1 использует 19 (RX) и 18 (TX), Serial 2 использует 17 (RX) и 16 (TX), Serial 3 использует 15 (RX) и 14 (TX). Чтобы использовать эти три контакта для связи с вашим персональным компьютером, вам понадобится дополнительный адаптер USB-to-serial, потому что эти три контакта не подключены к адаптеру USB-to-serial на Mega. Чтобы использовать их для связи с внешними последовательными устройствами TTL, подключите контакт TX к контакту RX вашего устройства, подключите контакт RX к контакту TX вашего устройства и подключите GND к контакту GND. (Не подключайте эти контакты напрямую к последовательному порту RS232; их рабочее напряжение составляет +/- 12 В, что может повредить вашу плату управления Arduino.)
Плата Arduino Leonardo использует Serial 1 для связи с RS-232 через 0 (RX) и 1 (TX). Последовательный порт зарезервирован для связи USB CDC с использованием библиотек Mouse и Keyboard. Для получения дополнительной информации, пожалуйста, обратитесь к странице начала работы с Леонардо и странице оборудования.