Пины (выводы) микроконтроллеров можно настроить так, чтобы они либо выдавали сигнал, либо его считывали, то есть работать либо как вход, либо как выход. Но сигналы бывают цифровыми и аналоговыми. Цифровой сигнал принимает два значения — единицу или ноль, ну или высокое (HIGH) и низкое (LOW). Но вот аналоговый сигнал плавно изменяется и может принимать любое значение.
Рассмотрим небольшую аналогию со светом. В простейшем вы говорите «светло» или «темно». Если перевести это в цифровой сигнал, то достаточно 1 бита, чтобы передать такой объём информации, например:
- — светло;
- — темно.
Если передать больше информации, то потребуется больше бит, например:
- 00 — кромешная тьма;
- 01 — сумерки;
- 10 — достаточно светло;
- 11 — слишком яркий свет.
Но если рассказать об этом подробнее, то ответ уже не будет столь однозначным. Появляются такие данные, как насколько конкретно светло или темно, какая цветовая температура у света (тёплый или холодный), направленный свет или рассеянный, с какой стороны он светит и так далее. Получается, что чем более полное описание чего-нибудь вы даёте, тем больше данных нужно передать. Ну а в мире микроконтроллеров и цифровых устройств потребуется больше бит, чтобы записать и передать эту информацию.
Закончим с аналогиями и вернемся к электронике, как уже отмечалось ранее, цифровой сигнал может принимать два значения — логической ноль или единицу, аналоговый же сигнал принимает бесконечное множество значений.


Чтобы преобразовать сигнал из аналогового в цифровой используют АЦП (аналогово-цифровые преобразователи). Они различаются по количеству бит, или простыми словами, по количеству единиц и нулей, в которых представляется тот или иной сигнал. Например, в ардуино АЦП 10-битный, то есть, что он может принимать 2 в 10-й степени значений, а именно 1024.

При этом аналоговый вход ардуины может принимать сигнал значение от 0 до 5 вольт, то есть вы можете считывать (измерять) напряжение от 0 до 5 вольт с точностью: 5/1024=0,005 вольта.
Для чего используется
Чтение аналоговых сигналов, как ни странно, применяется для чтения сигнала с аналоговых датчиков. Датчики, в свою очередь, также бывают с аналоговым и цифровым выходом. То есть либо выдаётся какая-то плавно изменяющаяся величина, либо набор из единиц и нулей, которые потом расшифровываются и обрабатываются программой микроконтроллера.
Например, аналоговые входы можно использовать:
- Для измерения температуры с помощью термопары или терморезистора;
- Для измерения освещенности фоторезисторами, фотодиодами и пр.;
- Плавно задавать какие-то величины с помощью потенциометров, поворотных и вращающихся джойстиков, что удобно использовать для управления различными механизмами, радиоуправляемыми моделями, регулировки оборотов двигателей или интенсивности свечения источников света.
- Измерения веса или давления с помощью тензодатчиков и так далее.
Некоторые из применений мы рассмотрим ниже.
Как работать с аналоговым входом?
С теорией разобрались, перейдем к практике. В любой программе ардуино есть две основных функции:
- void setup() – в ней настраивается режим работы микроконтроллера или его определенных узлов, а также назначаются его пины для работы в качестве входа или выхода.
- void loop() — это непосредственно программа, которая выполняется циклично строчка за строчкой.
Перед void setup() указываются библиотеки, которые будут использованы в программе, задаются какие-то переменные и прочее.
Для начала выберем аналоговый пин и настроим его для работы в качестве входа для этого пишем
void setup() {
pinMode(A0, input)
}
Здесь A0 – номер аналогового входа, input – режим работы в качестве входа.
Если вы не знаете какие пины и для чего могут использоваться – вам поможет карта пинов ардуино, вы можете найти её для каждой версии платы по запросу «adruino uno pinout», если плата Arduino UNO, если у вас другая модификация, например, nano, пишем соответственно «arduino nano pinout» и так далее для каждого случая.

Здесь мы видим, что аналоговые выходы, они выделены зеленым цветом, кстати, цифровые номера пинов сохраняются и вы можете использовать вместо A0, например, просто цифру 14 — pinMode(14, input) — это аналогичное выражение в коде. В Arduino UNO аналоговых входов 6, в nano их уже 8 (несмотря на то что она построена на таком же микроконтроллере), а в Mega их аж 16.
Добавим к коду возможность чтения данных с последовательного порта. Это нужно для того, чтобы микроконтроллер передавал компьютеру какую-то информацию, и мы могли её прочитать. Для этого нужно использовать команду со следующим синтаксисом Serial.begin(9600) (размеры букв важны, нужно писать именно так), тогда код примет вид:
void setup() {
Serial.begin(9600);
pinMode(A0, INPUT);
}
На этом настройка микроконтроллера завершена.
Пока что оставим программирование. Мы рассмотрим, как изменяются данные с аналогового входа на примере потенциометра. Для этого подключим его крайние выводы к источнику питания, а средний вывод ко входу А0.

Потенциометр подойдет на 1….10 кОм. Собираем элементарную схему и открываем Arduino IDE. Дальше будем использовать такой код:
int val=0;
void setup() {
Serial.begin(9600);
pinMode(A0, INPUT);
}
void loop() {
val = analogRead(A0);
Serial.println(val);
delay(1000);
}
Подключим по указанной схеме потенциометр, у меня оказался чуть меньше чем на 9.2 кОм.
И соберем схему, обратите внимание, если датчик питается от одного, а ардуино от другого источника питания, как у меня, то нужно соединить их минусы (gnd), иначе работать не будет.

Дальше включаем монитор порта в Arduino IDE и можем наблюдать какое значение у нас на аналоговом входе.

Я прокрутил ручку потенциометра от края до края и на экране значения изменились с 0 до 1023, соответственно напряжение на входе изменилось с 0 до 5 вольт. А дальше я плавно вращал ручку потенциометра и значения также изменялись, что вы можете видеть на иллюстрации ниже.

Дальше я взял фоторезистор и подключил его по схеме делителя напряжения последовательно с резистором на 1 кОм, плюс питания подключил к фоторезистору, а минус к резистору, точку соединения резистора и фоторезистора подключил к аналоговому входу.

Освещение на первых снимках слабое, ранее пасмурное утро, света с окна почти нет, свет в большинстве своем падает от монитора, я закрыл пальцем, чтобы увидеть, какой сигнал будет в максимально тёмном состоянии, а затем убрал его.

Дальше я включил настольную лампу, зафиксировал изменение сигнала, после чего поставил лампу прямо над фоторезистором максимально близко.

Таким образом, определив значения сигналов при разной степени освещенности, вы можете использовать их для управления чем-либо, простейший пример — сделать фотореле, в котором можете тонко настроить пороги срабатывания в программе.
Ну и напоследок, мне попался датчик воды, который оказался скорее не датчиком уровня, а датчиком наличия воды, поскольку в сухом состоянии сигнал с него был 0, при частичном погружении порядка 250-260, и при полном погружении эта цифра не изменилась, ну стала больше на 10, но значение прыгало вверх-вниз. Подключается он просто — на плате датчика обозначены «+», «-» и «S» (сигнал), подал на плату питание, а S подключил к аналоговому входу, код никак не изменял, ниже вы видите, что из этого вышло.


Заключение
В этой статье мы разобрались, как пользоваться аналоговым входом ардуино и выводить информацию от микроконтроллера через последовательный порт, кстати, так вы можете выводить любые значения и использовать это для взаимодействия с компьютером, например, если напишете программу, которая будет отображать какие-то параметры, полученные от датчика. Любители иногда используют это при построении домашних метеостанций, и просматривают данные о температурах и влажности на компьютере.
В следующей статье мы будем использовать полученные знания для регулировки электрических величин с помощью ШИМ. С потенциометра мы будем считывать значение (положение его рукояти), как было показано в этой статье, использовать их для установки скважности ШИМ. Также я расскажу, что такое ШИМ и как его можно использовать в управлении светодиодами и коллекторным двигателем (моторчиком от игрушек).
Предыдущая