Ардуино аналоговый вход как цифровой

Урок 2. Аналоговые входы

Опубликовано 09.07.2014 11:54:00

Продолжим знакомство с платформой Arduino и в данной статье рассмотрим аналоговые входы.

Основным применением аналоговых входов в тематике Arduino является чтение значений аналоговых датчиков. В тоже время стоит не забыть упомянуть, что аналоговые входы могут использоваться как цифровые порты входов/выходов рассмотренные в предыдущем уроке (об этом в конце статьи).

На плате Arduino UNO их 6 (A0-A5). У других плат количество может отличаться, смотрите в спецификации.

Благодаря встроенному АЦП (аналого-цифровой преобразователь), данные входы могут считывать напряжение подаваемое на них. Микроконтроллеры Atmega 328, используемые в Arduino UNO, содержат шестиканальный АЦП, разрешение которого составляет 10 бит. Это позволяет на выходе получать значения от 0 до 1023 (всего 1024 градации).

Для того чтобы считать показание на аналоговом входе следует вызвать функцию

Данная функция возвращает значение от 0 до 1023 пропорционально напряжению на аналоговом входе

В качестве первого примера работы с аналоговыми входами подключим потенциометр.

Для нашей задачи отлично подойдут однообортные потенциометры изображенные на картинке. Не смотря на столь значительные внешние отличия, они мало чем отличаются. Для примера можно использовать любой из них. Большим потенциометром с крутилкой конечно удобнее пользоваться, но он обладает толстыми ножками которые быстро расшатывают контакты макетной платы. В случае, если под рукой имеется отвертка, то, при работе с макетной платой, лучше воспользоваться квадратным потенциометром.

Для эксперимента нам понадобятся:

Описание примера:

Потенциометр это резистор меняющий свое сопротивление в зависимости от угла поворота крутилки. Он имеет 3 вывода. На крайние выводы подаем 5V и GND (полярность не имеет особого значения, если выводы поменять местами, значения просто инвертируются). Между крайними выводами расположено резистивное вещество, по которому движется ползунок соединенный со средним выводом. При повороте крутилки изменяется сопротивление, а вместе с тем и напряжение.

На реальной макетной плате всё будет выглядеть следующим образом:

Пример программного кода:

Перевод значения аналогового сигнала в вольты

Для перевода получившегося значения в вольты достаточно вычислить шаг и умножить его на получаемое значение.

Для вычисления шага поделим опорное напряжение на 1024 градации

5В / 1024 = 0.0049 Вольт

Т.е. При получаемом аналоговом значении в 500, на порт контроллера приходит ( 500 * 0.0049) 2.45В.

пример программного кода:

Более точная работа аналогового входа

Для того чтобы добиться более точных показаний с аналогового входа можно использовать 2 варианта:

Функция analogReference()​

Задает опорное напряжение относительно которого происходят аналоговые измерения.

Возможные настройки (type):

DEFAULT: установлено по умолчанию. при данной конфигурации опорное напряжение автоматически принимается за напряжение питания платы Arduino. 5В (на платформах с напряжением питания 5 В) или за 3.3 В (на платформах с напряжением питания 3.3В)

На платформах Arduino “из коробки” вывод AREF не задействован. В этом случае при настройке DEFAULT к выводу подключается внутреннее напряжение AVCC. Соединение является низко-импедансным и любое напряжение подведенное к выводу в этот момент может повредить микросхему ATmega.

INTERNAL: встроенное опорное напряжение 1.1В на микроконтроллерах ATmega168 и ATmega328, и 2.56В на ATmega8.

Это может пригодиться для более точного измерения напряжения лежащего в пределах ниже 1.1В либо 2.56В. Болле точная работа достигается за счет меньшего шага 5/1024 против 1.1/1024. Значения соответствующее или превышающее 1.1В (2.56В) будут конвертироваться АЦП в 1023.

EXTERNAL: внешний источник опорного напряжения, подключенный к выводу AREF.

После того как мы задали функцию, происходит отключение обоих внутренних источников. Теперь можно подключить внешнее напряжение, которое и будет являться опорным для АЦП. Внешнее напряжение рекомендуется подключать к выводу AREF через резистор 5 кОм.

Ручная установка опорного напряжения

Актуальна для измерения крайне малого напряжения

Искажения при работе с аналоговыми входами появляются по причине того, что по дефолту за опорное напряжение принимается 5В, в то время как стабилизаторы напряжения на плате Arduino могут немного отклоняться от эталонного значения и выдавать к примеру 4.85В. 4.85 / 1024 = 0.0047 (при эталонном шаге в 0.0049)

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

Использование аналоговых входов в качестве цифровых выводов

Аналоговые входы могут использоваться как цифровые порты входов/выходов рассмотренные в предыдущем уроке

Для этого, для UNO, в коде их нужно записывать как цифровые с 14 по 19. К примеру, для A0

Читать ранее:

А как же комментарии?

В данный момент еще реализованы не все элементы нашего сообщества. Мы активно работаем над ним и в ближайшее время возможность комментирования статей будет добавлена.

Урок по Arduino №2 — для чего нужны аналоговые входы на Arduino и как их использовать?

На этом занятии мы рассмотрим, цифровые и аналоговые выходы Arduino, разберем чем отличается цифра от аналога, а также сделаем бегущий огонек на Arduino.

На этом занятии мы рассмотрим, цифровые и аналоговые выходы Arduino, разберем чем отличается цифровой сигнал от аналогового. Соберем с помощью макетной платы схему из двух светодиодов и будем плавно регулировать их яркость (включение и затухание). Рассмотрим тип данных int, условный оператор if и команду analogWrite для управления аналоговыми портами в языке программирования Ардуино.

В этом уроке используется:

Большая макетная плата на 1600 точек с 4 шинами питания: Купить
Arduino Uno: Купить
Arduino Nano: Купить
Фоторезисторы 20 штук: Купить
Инфракрасный дальномер: Купить
Высокоточный инфракрасный дальномер с I2C: Купить
Набор резисторов из 100 штук на все случаи: Купить
Соединительные провода 120 штук: Купить
Потенциометры с колпачками 5 штук: Купить

Чем отличается аналоговый сигнал от цифрового

Аналоговый сигнал непрерывно изменяется во времени. Вся информация в природе аналоговая — волны на воде, колебание струны и т.д. Изначально человек записывал информацию (звуки, изображения, видео) с помощью аналоговых устройств. Но аналоговые сигналы чувствительны к воздействию шумов и помех.

Цифровой сигнал передается в виде единиц и нулей, для компьютеров и цифровой техники это проще реализовать (есть сигнал или нет сигнала). Для оперативной памяти в компьютерах используют конденсаторы, один заряженный конденсатор — 1 бит. На флеш-памяти используют транзисторы с плавающим затвором.

С появлением компьютеров аналоговые сигналы стали переводить в цифру, поскольку аналоговый сигнал подвержен искажениям и затуханию при передаче или записи. Наглядно продемонстрировать разницу между аналоговым и цифровым сигналом поможет картинка, где изображен процесс квантования — разбиение непрерывной величины на конечное число интервалов (перевод аналогового сигнала в цифру).

Квантование — разбиение непрерывной величины на интервалы

Аналоговые и цифровые выходы на Ардуино

Если вы хотите регулировать выходное напряжение, то следует использовать пины, помеченные символом «

». Для Arduino Uno — это 3, 5, 6, 9, 10, 11. С помощью аналоговых портов можно выдавать любое напряжение 0 до 5 Вольт, а цифровые выходы можно только включать и выключать. Аналоговые порты используют ШИМ (широтно-импульсную модуляцию), по английски PWM (pulse-width modulation), с помощью которой имитируется аналоговый сигнал.

Аналоговые выходы на плате Ардуино имеют, отметку тильда «

Чтобы понять разницу между цифровым и аналоговым сигналом, соберите на макетной плате схему из светодиода и резистора, как на первом занятии — Подключение светодиода. Но в этот раз подключите светодиод к аналоговому выходу

9. Откройте скетч для мигания светодиодом из первого занятия и измените в нем порт выхода с Pin13 на Pin9. Загрузите скетч в плату Arduino NANO или UNO.

На Arduino аналоговый выход будет работать, как цифровой

9 порт может работать, как цифровой выход. Но если функцию digitalWrite изменить на analogWrite, то вместо значения HIGH (1) и LOW (0) можно поставить любое значение от 0 до 255. Именно в этом интервале можно менять напряжение на аналоговых выходах. Загрузите программу для плавного включения и затухания светодиода. Подробное описание работы данной программы даны ниже в пояснении к коду.

Скетч. Аналоговый сигнал Ардуино и светодиод

Пояснения к коду:

  1. Функция , где pin — порт выхода на который подается сигнал, value — значение между 0 (полностью выключено) и 255 (полностью включено), используется для управления яркостью светодиода или скоростью электродвигателя, посредством Широтно-Импульсной Модуляции (ШИМ);
  2. Переменная имеет начальное значение «0» при каждом выполнении цикла к величине прибавляется заданное значение (в данном скетче fade = 5);
  3. При достижении переменной максимального значения равного 255, принимает отрицательное значение -5. Теперь при каждом выполнении цикла к величине прибавляется -5, т.е. каждый раз из вычитается .
  4. Если сопоставить работу скетча с графиком процесса квантования, размещенным на рисунке в начале статьи, то — это шаг квантования, т.е. величина на которую увеличивается подаваемое напряжение, а — это шаг дискретизации, т.е. период времени через который меняется значение .

Эксперимент 2: управление яркостью светодиода с помощью потенциометра

В данном эксперименте мы будем управлять яркостью светодиода, используя потенциометр. Мы воспользуемся функцией для чтения напряжения и функцией для вывода ШИМ сигнала, коэффициент заполнения которого пропорционален аналоговому напряжению.

Необходимые компоненты

  • 1 x потенциометр
  • 1 x светодиод
  • 1 x резистор
  • 1 x Arduino Mega 2560
  • 1 x макетная плата
  • 6 x перемычка

Схема соединений

Соберите схему, как показано ниже. Когда вы будете вращать ручку потенциометра, напряжение на выводе A0 будет меняться. После чего программа будет изменять коэффициент заполнения ШИМ сигнала на выводе 2, изменяя яркость светодиода.

Код программы


Использование аналоговых входов в качестве цифровых выводов

Аналоговые входы могут использоваться как цифровые порты входов/выходов рассмотренные в предыдущем уроке

Для этого, для UNO, в коде их нужно записывать как цифровые с 14 по 19. К примеру, для A0

Arduino.ru

Аналоговый вход как цыфровой.

Понимаю что тупой вопрос, но элементарно на пльцах: читать A0 как High или low, понимаю что нужно понимать что подразумевается 0 или 1 и то что скорость считывания меньше чем на цифровом . В схеме подтягивающий резистор на землю на 10кОм есть (возможно его мало?). ардуино читает всегда high. (по крайней мере в протеусе ибо только начиню ваять ) Что не находил в инете – нету вообще и слова об этом. Значит вопрос реально тупой..((

– перебросил на цифровые, так будет проще но все же для понимая-

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

скорость считывания меньше чем на цифровом .

Ни в какой мере – точно такая же скорость.

Правильно написать код. Если бы Вы в строке 36 сравнивали бы с HIGH не номер пина, как Вы это делаете, а значение на нём, а заодно убрали бы из конца всё той же строки точку с запятой, то всё было бы нормально с божьей помощью.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Именно так уже и сделал, не увидел сначала ошибки))

И с аналога читает HIGH без проблем, а проблема вот в протеусе оказалась. Эмуляция в нем никудышняя. После исправления запустиось как надо, но не всегда . Тупо старт стоп в эмулторе клацаю- срабатывает раз через четыре примерно. Код прошивки при этом не меняю! . Плюнул на протеус- начал набирать потихоньку так. Пока придут блоки реле и пока залужу плату с оптронами для входов (жаль что на том же алиекспресе еще модули входов не придумали продавать) Попутно вопрос :

застрял в последних строчках:

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).

тоисть обрщаясь к ним я имею например ввиду A0 но пишу int 14? а как же тогда от A6 и до A15? в случае с мегой.

Млин, реально не написали ниразу пример этого случая.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

тоисть обрщаясь к ним я имею например ввиду A0 но пишу int 14? а как же тогда от A6 и до A15? в случае с мегой.

Млин, реально не написали ниразу пример этого случая.

Правильнее писать A0.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).

тоисть обрщаясь к ним я имею например ввиду A0 но пишу int 14? а как же тогда от A6 и до A15? в случае с мегой.

Млин, реально не написали ниразу пример этого случая.

не писали – рисовали.

распечатай себе картинко на память – твой случай: нижний левый угол платы – пины A0-A5, бирюзовым цветом аналоговые номера, сиреневеньким – цифровые номера пинов

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

застрял в последних строчках:

Нужен совет, давайет скетч целиком. Я не понимаю откуда эти строчки и в каком мест Вашего изначального скетча они стоят, а потому ничего не могу сказать.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

[quote=Клапауций 232 пишет:

Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).

распечатай себе картинко на память – твой случай: нижний левый угол платы – пины A0-A5, бирюзовым цветом аналоговые номера, сиреневеньким – цифровые номера пинов

скачал с того же пигиса на свою мегу, и раньше смотрел на эту картинку но чето недогнал что при написании кода смотреть на сопоставимость входов/выходов. Думал другие правила нужны(

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Строки 75 – 80.

При каждом попадании сюда Вы выполняете операцию previousMillis = currentMillis; .Это значит, что если условие в строке 73 будет выполняться часто, строка 78 не выполнится никогда, т.к. Вы каждый раз начинаете отсчёт времени заново. Думаю, что Вы хотели поставить строку 80 перед строкой 79, а не после.

Это вообще странная конструкция. Непонятно зачем считаетеся интервал в строке 93? Чтобы сбросить его в строке 95 и больше ничего не сделать? Строки 97-100 исполняются при каждом проходе, независимо от интервала. Опять же, думаю, что Вы хотели поместить строки 97-100 перед строкой 96

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

. и добавление про аналоговые как цифровые:

не на всех мк можно использовать аналоговые как цифровые. к примеру сравните распиновки 328р в дип и чип корпусах. adc6&adc7

ps в дипе даже не ищите их, а в чипе как цифровые нельзя. незнаю для какого чипа прога из стартового поста, но пина А15 не встречал. может надо написать д15 (А1)

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Строки 75 – 80.

При каждом попадании сюда Вы выполняете операцию previousMillis = currentMillis; .Это значит, что если условие в строке 73 будет выполняться часто, строка 78 не выполнится никогда, т.к. Вы каждый раз начинаете отсчёт времени заново. Думаю, что Вы хотели поставить строку 80 перед строкой 79, а не после.

Это вообще странная конструкция. Непонятно зачем считаетеся интервал в строке 93? Чтобы сбросить его в строке 95 и больше ничего не сделать? Строки 97-100 исполняются при каждом проходе, независимо от интервала. Опять же, думаю, что Вы хотели поместить строки 97-100 перед строкой 96

Совершенно так!,и стояла она сначала в начале, но когда начал в протеусе эксперементировать то поменял местами дабы он хоть как то начал работать. Не сомневаюсь что в железе все будет правильно и по правилам. По этому строку вернул на место (перед 79)

Строки 92-100 А вот здесь как раз таки не странная конструкция а то что назвается незнанием! Затык собственно произошел из-за того что начал городить условие: ” если транспортер запущен то осчитываю интервал и если после этого интервала сигнал LOW на входе то выход на аварию пока не появится HIGHyf этом входе.

как это правильно сложить ума не хватает. Вот. Да и на пальцах бы кто написал что и как работает этот previousMillis = currentMillis В. Я так понимаю. previos это предыдущее значение милисекунд , оно обычно в глобальных переменных задается или остается от предыдущей операции. current это текущее значение ибо по формуле понятно что надо отнять новое от старого и сравнить с заданым. Странно что на форуме еще нет темы именно по разжовыванию функций, так как новичку допустим не в зуб ногой!, разбираться как работает функция , то что в ссылке “программирование” это скудные лоскутки по ним впервые не поймешь, Я себя допустим не отношу к совсем тугоразвитым, учусь быстро и разбираюсь так как по сути инженер. НО! то как описаны функции . печаль да и только.

Green Oak Studio

Блог об Arduino, AVR, ARM, Linux и не только.

29 июня 2012 г.

Превращаем аналоговые входы Arduino в цифровые

DDRC – регистр направления данных порта C

7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 bit
DDRC DDC6 DDC5 DDC4 DDC3 DDC2 DDC 1 DDC 0

Каждый бит в этом регистре отвечает за направление данных на соответствующем пине:
PORTC – регистр данных порта C

7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 bit
PORTC PORTC6 PORTC5 PORTC4 PORTC3 PORTC2 PORTC1 PORTC0

Если пин сконфигурирован как вход, то при записи 1 в соответствующий бит этого регистра активируется подтягивающий резистор. При записи 0 подтягивающий резистор отключается.

Значение по умолчанию – 0.

7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 bit
PINC PINC6 PINC 5 PINC 4 PINC 3 PINC 2 PINC 1 PINC 0

Каждый бит этого регистра содержит значение соответствующего пина. Прочитать значение можно независимо от значения DDxn.

Для начала назначим бывший аналоговый вход A0 как цифровой выход. Для этого запишем единицу в бит DDC0 регистра DDRC:

Чтобы включать и выключать светодиод, будем записывать то 1, то 0 в бит PORTC0 регистра PORTC:

Blink, способ 2

Есть более читерский способ, который сокращает программу еще на 2 строчки. В гайде ATmega328 пишут, что запись единицы в PINxn переключает значение PORTxn, независимо от значения DDRxn. Ну то есть если там был 0, то становится 1, а если был 1, то становится 0. За сим накалякаем следующий код:

Для того, чтобы сделать что-то по нажатию кнопки, надо сдетектировать это самое нажатие. Ждем единицу на PINC5, и по ней запускаем бегущие огни – записываем по очереди единицы в PORTCn, а потом записываем нули точно так же. Полный код:

Программа в основном цикле содержит сколько же строк, сколько было бы при использовании стандартных цифровых выходов и конструкций digitalWrite(). Поэтому единственная сложность возникает лишь в ненаглядности функций.

Использование аналого-цифрового преобразования (АЦП) в Arduino Uno

В этой статье мы рассмотрим различные аспекты использования аналого-цифрового преобразования (АЦП, в англ. ADC – Analog to Digital Conversion) в Arduino Uno.

Плата Arduino имеет 6 каналов АЦП, как показано на следующем рисунке.

Любые из этих каналов (или даже все сразу) можно использовать для подачи на них аналогового напряжения. АЦП в Arduino Uno имеет разрешение 10 бит, то есть получаем диапазон целых чисел, соответствующих этому разрешению, от 0 до 2^10-1 (до 1023). Это означает, что значение входного аналогового напряжения от 0 до 5 В преобразуется в целое число от 0 до 1023. То есть получаем шаг АЦП равный 5/1024= 4.9 мВ.

В нашем проекте мы будем подключать потенциометр к каналу ‘A0’, а результат аналого-цифрового преобразования на этом канале показывать на жидкокристаллическом (ЖК) дисплее. В радиолюбительской практике наиболее распространены жидкокристаллические (ЖК) дисплеи 16×1 и 16×2. ЖК дисплей 16×1 может отображать 16 символов, расположенных на одной строке. ЖК дисплей 16×2 может в сумме отображать 32 символа на двух строках – 16 символов на первой строке и 16 символов на второй. Здесь необходимо принимать во внимание тот факт, что каждый символ в подобных дисплеях состоит из 5×10=50 пикселов (точек). То есть чтобы отобразить 1 символ все эти 50 пикселов должны работать вместе. Но мы можем об этом не беспокоиться, потому что за их совместную работу отвечает контроллер HD44780 – его визуально можно увидеть на обратной стороне ЖК дисплея.

Необходимые компоненты

Плата Arduino UNO
Источник питаний 5 В
ЖК дисплей 16х2 (JHD_162ALCD)
Конденсатор 100 пФ
Конденсатор 100 нФ
Потенциометр 100 кОм

Работа схемы

Схема устройства представлена на следующем рисунке.

В ЖК дисплее 16×2 если мы хотим задействовать черный цвет, то нам будут нужны все его 16 контактов, в противном случае нам будет достаточно 14 контактов. Эти 2 контакта, отвечающие за черный цвет, можно оставить неиспользованными. Среди оставшихся 14 контактов мы имеем 8 контактов данных (7-14 или D0-D7), 2 контакта для подачи питания (1&2 или VSS&VDD или GND&+5v), 3-й контакт для управления контрастностью (определяет насколько “жирными” будут выглядеть символы на экране дисплея) и 3 управляющих контакта (RS&RW&E).

На представленной схеме можно увидеть, что мы использовали только 2 управляющих контакта – это обеспечивает гибкость в управлении. Бит контраста и READ/WRITE используются редко, поэтому в нашем случае их можно замкнуть на землю – это обеспечивает ЖК дисплею максимальную контрастность и режим чтения. Таким образом, нам необходимо будет контролировать только контакты ENABLE и RS чтобы передавать на ЖК дисплей символы и данные.

В схеме необходимо будет сделать следующие соединения с ЖК дисплеем:
PIN1 или VSS на землю
PIN2 или VDD или VCC к источнику питания +5В
PIN3 или VEE на землю (обеспечивает максимальную контрастность – хорошо для начинающих)
PIN4 или RS (Register Selection) к контакту PIN0 ARDUINO UNO
PIN5 или RW (Read/Write) на землю (переводит ЖК дисплей в режим чтения, что упрощает взаимодействие с ним для начинающих)
PIN6 или E (Enable) к контакту PIN1 of ARDUINO UNO
PIN11 или D4 к контакту PIN8 of ARDUINO UNO
PIN12 или D5 к контакту PIN9 of ARDUINO UNO
PIN13 или D6 к контакту PIN10 of ARDUINO UNO
PIN14 или D7 к контакту PIN11 of ARDUINO UNO

Программная среда ARDUINO IDE позволяет пользователю использовать ЖК дисплей в 4-битном режиме. Этот тип взаимодействия с ЖК дисплеем позволяет сократить использование контактов ARDUINO, к тому же этот режим взаимодействия (4-битный) по умолчанию заложен в ARDUINO. На представленной схеме мы использовали 4-битный режим взаимодействия (контакты D4-D7).

То есть в сумме мы подсоединили 6 контактов ЖК дисплея к нашей плате Arduino, из которых 4 контакта будут использоваться для передачи данных и 2 контакта для целей управления.

Объяснение работы программы

Для того, чтобы полноценно использовать АЦП в Arduino Uno, необходимо сделать следующие вещи:

analogRead(pin);
analogReference();
analogReadResolution(bits);

Прежде всего необходимо отметить что каналы АЦП Arduino Uno имеют по умолчанию опорное значение 5 В (опорное напряжение). Это означает, что максимальное входное значение напряжения для каждого канала АЦП Arduino составляет 5 В. Но некоторые датчики имеют выходное напряжение в диапазоне 0-2,5 В, поэтому если мы будем использовать опорное напряжение по умолчанию (5 В), то мы потеряем в точности измерений. В связи с этим полезно иметь возможность изменения значения опорного напряжения, для Arduino Uno это делается с помощью команды “ analogReference(); ”.

По умолчанию мы имеем разрешающую способность АЦП, равную 10 бит, разрешение АЦП мы также можем изменить используя команду “ analogReadResolution(bits); ”. Это может быть полезно в ряде случаев.

Теперь, если все установки параметров работы АЦП нами сделаны, мы можем считать значение АЦП с канала ‘0’ просто используя инструкцию “analogRead(pin);”, где “pin” означает контакт (вывод), на который мы подаем аналоговый сигнал, в нашем случае это будет контакт “A0”. Значение с выхода АЦП может быть преобразовано в число типа integer, например, с помощью инструкции “ int ADCVALUE = analogRead(A0); ”, в результате выполнения этой инструкции значение с используемого канала АЦП после проведения преобразования (то есть АЦП) сохраняется в переменной целого типа (integer) под названием “ADCVALUE”.

Теперь несколько слов о работе с ЖК дисплеем 16×2. Сначала мы должны подключить необходимый заголовочный файл с помощью команды ‘ #include
’, этот заголовочный файл содержит все необходимые функции для работы с ЖК дисплеем. По умолчанию функционал этого файла настроен для работы с ЖК дисплеем в 4-битном режиме. С помощью этого заголовочного файла нам не нужно будет заботиться о том, чтобы передавать данные в ЖК дисплей бит за битом и писать какие либо собственные функции для работы с ЖК дисплеем.

Далее мы должны указать какой именно тип ЖК дисплея мы будем использовать. Существуют различные типы ЖК дисплеев, например, 20×4, 16×2, 16×1 и т.д. Мы в нашем проекте будем использовать ЖК дисплей 16×2, поэтому мы должны будем записать команду ‘ lcd.begin(16, 2); ’. А если бы у нас был дисплей 16×1, то нам бы пришлось использовать команду ‘lcd.begin(16, 1);’.

Далее мы Arduino Uno должны указать, к каким ее контактам мы подключили ЖК дисплей. В нашем случае мы к Arduino Uno подключили следующие выводы ЖК дисплея: “RS, En, D4, D5, D6, D7”. Мы подключили их к контактам 0, 1, 8, 9, 10, 11 Arduino Uno, поэтому в нашем случае соответствующая команда будет иметь следующий вид: “LiquidCrystal lcd(0, 1, 8, 9, 10, 11);”.

После всего этого мы можем приступит к передаче данных на ЖК дисплей. Сделать это можно, к примеру, с помощью следующей команды: “ lcd.print(“hello, world!”); ”. В результате выполнения этой команды на экран ЖК дисплея будет выведена строка ‘hello, world!’.

Исходный код программы

В этом разделе статьи будет представлен полный код программы для обработки данных с АЦП Arduino Uno и последующего их вывода на ЖК дисплей. Если у вас возникнут вопросы, то вы можете задать их в комментариях к данной статье.

#include

// подключаем необходимый заголовочный файл для работы с ЖК дсиплеем
LiquidCrystal lcd(8, 9, 10, 11, 12, 13); // сообщаем Arduino номера контактов, к которым мы подключили ЖК дисплей
char ADCSHOW[5]; //объявляем переменную для хранения результата АЦП
void setup()
<
// устанавливаем число столбцов и строк для ЖК дисплея
lcd.begin(16, 2);
>
void loop()
<
// устанавливаем курсор в нулевой столбец 1-й строки
lcd.print(” CIRCUIT DIGEST”); //выводим на экран ЖК дисплея строку
lcd.setCursor(0, 1); // устанавливаем курсор в нулевой столбец второй строки
lcd.print(“ADC RESULT:”); // выводим на экран ЖК дисплея строку “ADC RESULT:”
String ADCVALUE = String(analogRead(A0)); //сохраняем значение АЦП в переменной типа “строка”

ADCVALUE.toCharArray(ADCSHOW, 5); // преобразуем эту строку в символьный массив
lcd.print(ADCSHOW); // выводим значение этого символьного массива на экран ЖК дисплея
lcd.print(” “);
lcd.setCursor(0, 0); // устанавливаем курсор в нулевой столбец 1-й строки
>

Видео, демонстрирующее работу схемы

Также можете посмотреть еще одно видео про то, как использовать АЦП в Arduino Uno. Оно на английском языке, но зато очень подробное и доходчивое.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий