ESP32 АЦП – чтение аналоговых значений в Arduino IDE
В этой статье показано, как считывать аналоговые входы с ESP32 с помощью Arduino IDE. Аналоговое чтение полезно для считывания значений с переменных резисторов, таких как потенциометры, или с аналоговых датчиков.
Считывание аналоговых входов с ESP32 так же просто, как использование функции analogRead(GPIO), которая принимает в качестве аргумента GPIO, который вы хотите считать.
У нас также есть другие руководства по использованию аналоговых выводов с платами ESP:
Аналоговые входы (АЦП)
Считывание аналогового значения с ESP32 означает, что вы можете измерять изменяющиеся уровни напряжения от 0 В до 3,3 В.
Измеренное напряжение затем преобразуется в значение от 0 до 4095, где 0 В соответствует 0, а 3,3 В соответствует 4095. Любое напряжение между 0 В и 3,3 В получит соответствующее промежуточное значение.
АЦП нелинеен
В идеале вы ожидали бы линейное поведение при использовании выводов АЦП ESP32. Однако этого не происходит. Вместо этого вы получите поведение, показанное на следующем графике:
Такое поведение означает, что ваш ESP32 не может различить 3,3 В и 3,2 В. Для обоих напряжений вы получите одинаковое значение: 4095.
То же самое происходит для очень низких значений напряжения: для 0 В и 0,1 В вы получите одинаковое значение: 0. Это необходимо учитывать при использовании выводов АЦП ESP32.
Обсуждение этой темы ведётся на GitHub.
Функция analogRead()
Считывание аналогового входа с ESP32 с помощью Arduino IDE так же просто, как использование функции analogRead(). Она принимает в качестве аргумента GPIO, который вы хотите считать:
analogRead(GPIO);
ESP32 поддерживает измерения по 18 различным каналам. Только 15 доступны на плате DEVKIT V1 DOIT (версия с 30 GPIO).
Возьмите распиновку вашей платы ESP32 и найдите выводы АЦП. Они выделены красной рамкой на рисунке ниже.
Подробнее о GPIO ESP32: ESP32 Pinout Reference.
Эти аналоговые входные выводы имеют 12-битное разрешение. Это означает, что при чтении аналогового входа его диапазон может варьироваться от 0 до 4095.
Примечание
Выводы ADC2 нельзя использовать, когда используется Wi-Fi. Поэтому, если вы используете Wi-Fi и у вас возникают проблемы с получением значения от GPIO ADC2, вы можете рассмотреть возможность использования GPIO ADC1 – это должно решить вашу проблему.
Другие полезные функции
Существуют и другие более продвинутые функции для использования с выводами АЦП, которые могут быть полезны в других проектах.
analogReadResolution(resolution): устанавливает разрядность и разрешение выборки. Может быть значением от 9 (0 – 511) до 12 бит (0 – 4095). По умолчанию – 12-битное разрешение.analogSetWidth(width): устанавливает разрядность и разрешение выборки. Может быть значением от 9 (0 – 511) до 12 бит (0 – 4095). По умолчанию – 12-битное разрешение.analogSetCycles(cycles): устанавливает количество циклов на выборку. По умолчанию – 8. Диапазон: от 1 до 255.analogSetSamples(samples): устанавливает количество выборок в диапазоне. По умолчанию – 1 выборка. Имеет эффект увеличения чувствительности.analogSetClockDiv(attenuation): устанавливает делитель для тактовой частоты АЦП. По умолчанию – 1. Диапазон: от 1 до 255.analogSetAttenuation(attenuation): устанавливает входное затухание для всех выводов АЦП. По умолчанию –ADC_11db. Допустимые значения:ADC_0db: без затухания. АЦП может измерять до приблизительно 800 мВ (вход 1 В = показание АЦП 1088).ADC_2_5db: входное напряжение АЦП будет ослаблено, расширяя диапазон измерения до приблизительно 1100 мВ (вход 1 В = показание АЦП 3722).ADC_6db: входное напряжение АЦП будет ослаблено, расширяя диапазон измерения до приблизительно 1350 мВ (вход 1 В = показание АЦП 3033).ADC_11db: входное напряжение АЦП будет ослаблено, расширяя диапазон измерения до приблизительно 2600 мВ (вход 1 В = показание АЦП 1575).
analogSetPinAttenuation(pin, attenuation): устанавливает входное затухание для указанного вывода. По умолчанию –ADC_11db. Значения затухания те же, что и в предыдущей функции.adcAttachPin(pin): присоединяет вывод к АЦП (также очищает любой другой аналоговый режим, который мог быть включён). Возвращает результат TRUE или FALSE.adcStart(pin),adcBusy(pin)иresultadcEnd(pin): запускает преобразование АЦП на шине присоединённого вывода. Проверяет, выполняется ли в данный момент преобразование на шине АЦП вывода (возвращает TRUE или FALSE). Получает результат преобразования: возвращает 16-битное целое число.
Есть очень хорошее видео, объясняющее эти функции, которое вы можете посмотреть здесь.
Чтение аналоговых значений с потенциометра на ESP32
Чтобы увидеть, как всё работает вместе, мы создадим простой пример для чтения аналогового значения с потенциометра.
Для этого примера вам понадобятся следующие компоненты:
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Схема подключения
Подключите потенциометр к вашему ESP32. Средний вывод потенциометра должен быть подключён к GPIO 34. Вы можете использовать следующую схему в качестве справки.
Код
Мы будем программировать ESP32 с помощью Arduino IDE, поэтому убедитесь, что у вас установлено дополнение ESP32, прежде чем продолжить:
Инструкции для Windows – установка платы ESP32 в Arduino IDE
Инструкции для Mac и Linux – установка платы ESP32 в Arduino IDE
Откройте Arduino IDE и скопируйте следующий код.
// Potentiometer is connected to GPIO 34 (Analog ADC1_CH6)
const int potPin = 34;
// variable for storing the potentiometer value
int potValue = 0;
void setup() {
Serial.begin(115200);
delay(1000);
}
void loop() {
// Reading potentiometer value
potValue = analogRead(potPin);
Serial.println(potValue);
delay(500);
}
Этот код просто считывает значения с потенциометра и выводит эти значения в Serial Monitor.
В коде вы начинаете с определения GPIO, к которому подключён потенциометр. В данном примере – GPIO 34.
const int potPin = 34;
В setup() инициализируйте последовательную связь со скоростью 115200 бод.
Serial.begin(115200);
В loop() используйте функцию analogRead() для чтения аналогового входа с potPin.
potValue = analogRead(potPin);
Наконец, выведите значения, считанные с потенциометра, в серийный монитор.
Serial.println(potValue);
Загрузите приведённый код в ваш ESP32. Убедитесь, что в меню Tools выбраны правильная плата и COM-порт.
Тестирование примера
После загрузки кода и нажатия кнопки сброса ESP32 откройте Serial Monitor на скорости 115200 бод. Поворачивайте потенциометр и наблюдайте за изменением значений.
Максимальное значение, которое вы получите – 4095, а минимальное – 0.
Заключение
В этой статье вы узнали, как считывать аналоговые входы с помощью ESP32 и Arduino IDE. Подведём итоги:
Плата ESP32 DEVKIT V1 DOIT (версия с 30 выводами) имеет 15 выводов АЦП, которые можно использовать для чтения аналоговых входов.
Эти выводы имеют разрешение 12 бит, что означает, что вы можете получать значения от 0 до 4095.
Для чтения значения в Arduino IDE вы просто используете функцию
analogRead().Выводы АЦП ESP32 не имеют линейного поведения. Вы, вероятно, не сможете отличить 0 от 0,1 В или 3,2 от 3,3 В. Это необходимо учитывать при использовании выводов АЦП.
Мы надеемся, что это краткое руководство было полезным. Если вы хотите узнать больше об ESP32, запишитесь на наш курс: Learn ESP32 with Arduino IDE.
Другие руководства по ESP32, которые могут вам понравиться:
Спасибо за чтение.