Функция digitalRead ()

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

arduino digitalRead button

Пример скетча отслеживания нажатия кнопки


#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

Схема подключения максимально проста:

arduino digital 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-сенсорах можно прочитать в этой статье. Цифровой выход датчика подсоединяем ко второму цифровому пину.

Arduino uno sensor PIR

Для работы можно использовать тот же скетч, то и для варианта работы с кнопкой в режиме INPUT (для датчика движения подтягивающих резисторов не требуется, они уже встроены в модуль сенсора).

Краткие выводы

Функция digitalRead одна из важнейших и часто используемых в ардуино. С ее помощью мы «чувствуем» окружающий мир. Правда, в отличие от analogRead,  картина всегда получается черно-белой: функция возвращает только два варианта значений: HIGH или LOW. Во многих случаях этого вполне хватает. Например, если нам нужно просто получить сигнал о возникновении какого-либо события, такого как срабатывание датчика движения, звука, вибрации.

Использовать digitalRead () очень просто – нужно просто передать ей номер пина, с которого будет считан сигнал. Функция возвратит нам число, равное HIGH или LOW, которое мы затем сможем сверить в блоке условия и выполнить какие-то действия. Самое главное, собрать схему так, чтобы на входе не получать случайные значения. В этой статье мы привели несколько примеров с советами.

ПОДЕЛИТЬСЯ

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here