DigitalRead в Arduino: синтаксис и примеры использования
23.08.2018
digitalRead () в Arduino позволяет получить логическое значение определенного пина. Функция, как правило, используется при работе с цифровыми устройствами, если в программе требуется отслеживать изменение состояния какого-либо датчика. В этой статье мы рассмотрим синтаксис, примеры использования и некоторые особенности этой функции.
Синтаксис digitalRead ()
digitalRead(<номер_пина>);
Возвращаемое значение:
LOW (логический ноль), если на входе отсутствует сигнал HIGH (логическая единица), если на входе присутствует сигнал.Параметры:
<номер пина> — номер цифрового или аналогового пина, используемого в качестве входного. Если к указанному пину не будет подключено реальное устройство, то функция будет возвращать совершенно случайные значения!Примеры использования:
int val = digitalRead(10); // Значение уровня синала на 10 пине if(digitalRead(10)) {} // Проверка на значение, считанное с 10 пина.Описание работы функции
Функция digitalRead () используется для того, чтобы получить информацию от внешнего устройства, подключенного к определенному пину. Таким устройством может быть кнопка или любой датчик, формирующий высокий или низкий уровень сигнала в зависимости от ситуации. Получив сигнал, мы можем как-то на него прореагировать: включить светодиод, издать звук, запустить двигатель или отправить SMS-сообщение.
Важное отличие функции от другой функции считывания показаний analogRead() заключается в том, что мы не можем узнать реальный уровень сигнала на входе, даже если мы считываем его с аналоговых пинов. digitalRead всегда возвращает лишь два варианта значений: HIGH и LOW:
Значение HIGH возвращается, если уровень сигнала превышает примерно половину опорного напряжения (на плате Arduino Uno это 2.6 В). В скетче ардуино HIGH соответствует логической 1, можно сравнивать полученное значение с константой HIGH или 1. Значение LOW получаем при низком уровне сигнала (меньше 2.6 В). В скетче этому сигналу соответствует значение константы LOW (логический 0).Для корректной работы функции нужно, чтобы пины находились в режиме INPUT или INPUT_PULLUP, т.к. в противном случае поступающий сигнал будет искажаться из-за падения напряжения на внутреннем резисторе, подключаемом к пинам в режимах OUTPUT.
В случае, если к выбранному пину не подключено устройство, функция работать не будет. Т.е. она будет возвращать какие-то значения, но они будут совершенно случайными. Такой же результат будет в случае подключения устройства в неопределенном состоянии, например, кнопки без подтягивающего резистора, когда она не нажата.
Примеры использования digitalRead ()
Изучение функции digitalRead лучше начинать на простых проектах: с подключенной кнопкой и датчиком, имеющим цифровой выход (например, датчик движения).
Пример работы с кнопкой
В данном варианте схемы мы подключаем ко второму пину кнопочный переключатель с подтягивающим резистором 1КОм. Резистор нужен для того, чтобы в не нажатом состоянии на входе не возникали помехи.
Пример скетча отслеживания нажатия кнопки
#define PIN_INPUT 2 #define PIN_LED 13 void setup() { Serial.begin(9600); pinMode(PIN_INPUT, INPUT); pinMode(PIN_LED, OUTPUT); } void loop() { int sensorVal = digitalRead(PIN_INPUT); Serial.println(sensorVal); // Выводим значение в мониторе порта // Нужно иметь в виду, что логика работы кнопки такова // - Если кнопка не нажата, то на вход поступает высокий уровень сигнала // - Если мы нажали кнопку, то на входе будет логический ноль if (sensorVal == HIGH) { digitalWrite(PIN_LED, LOW); // Кнопка не нажата - выключаем светодиод } else { digitalWrite(PIN_LED, HIGH);// А теперь кнопка нажата - светодиод включается } }Пример для схемы с кнопкой в режиме INPUT_PULLUP
Схема подключения максимально проста:
Пример скетча с INPUT_PULLUP
Сам скетч меняется минимально. Мы просто определяем тип пина как INPUT_PULLUP и получаем в итоге гораздо меньше хаоса на входе:
#define PIN_INPUT_PULLUP 2 void setup() { Serial.begin(9600); pinMode(PIN_INPUT_PULLUP, INPUT_PULLUP); } void loop() { int sensorVal = digitalRead(PIN_INPUT_PULLUP); Serial.println(sensorVal); }Пример подключения датчика движения
Датчик движения подключается по обычной схеме. Более подробно о PIR-сенсорах можно прочитать в этой статье. Цифровой выход датчика подсоединяем ко второму цифровому пину.
Для работы можно использовать тот же скетч, то и для варианта работы с кнопкой в режиме INPUT (для датчика движения подтягивающих резисторов не требуется, они уже встроены в модуль сенсора).
Краткие выводы
Функция digitalRead одна из важнейших и часто используемых в ардуино. С ее помощью мы «чувствуем» окружающий мир. Правда, в отличие от analogRead, картина всегда получается черно-белой: функция возвращает только два варианта значений: HIGH или LOW. Во многих случаях этого вполне хватает. Например, если нам нужно просто получить сигнал о возникновении какого-либо события, такого как срабатывание датчика движения, звука, вибрации.
Использовать digitalRead () очень просто – нужно просто передать ей номер пина, с которого будет считан сигнал. Функция возвратит нам число, равное HIGH или LOW, которое мы затем сможем сверить в блоке условия и выполнить какие-то действия. Самое главное, собрать схему так, чтобы на входе не получать случайные значения. В этой статье мы привели несколько примеров с советами.