Home News

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, которое мы затем сможем сверить в блоке условия и выполнить какие-то действия. Самое главное, собрать схему так, чтобы на входе не получать случайные значения. В этой статье мы привели несколько примеров с советами.