ESP32:Примеры/Считывание данных с входных аналоговых контактов ESP32

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Считывание данных с входных аналоговых контактов ESP32

В этом примере мы научимся считывать данные с входных аналоговых контактов ESP32. Это может пригодиться, к примеру, при считывании данных от аналоговых датчиков или регулируемых резисторов вроде потенциометра.

Считывание аналоговых данных при помощи ESP32 – это, по сути, измерение колебаний напряжения между 0 и 3.3 вольтами. Затем считанному напряжению присваивается значение в диапазоне от «0» до «4095», где «0» – это 0 вольт, а «4095» – это 3.3 вольта. Таким образом, любому промежуточному напряжению между 0 и 3.3 вольтами будет присвоено соответствующее промежуточное значение в диапазоне от «0» до «4095».

В идеале от данных, генерируемых АЦП-контактами ESP32, ждешь линейности (равномерности). Но на самом деле они ведут себя как на графике ниже:

Это значит, что ваша ESP32 не видит разницы между напряжением в 3.3 и 3.2 вольта – для того и другого она будет выдавать значение «4095». То же самое происходит и на низком напряжении: для 0 и 0.1 вольт будет выдано значение «0». Это нужно знать, когда работаешь с АЦП-контактами ESP32.

Вот дискуссия на GitHub об этом.

Считывание входных аналоговых данных ESP32 в коде IDE Arduino осуществляется очень просто – при помощи функции analogRead(). У нее лишь один параметр «GPIO», т.е. контакт, данные с которого нужно прочесть:

analogRead(GPIO)

ESP32 поддерживает считывание входных данных с 18 каналов, но на 30-контактной версии платы DEVKIT ESP32 V1 DOIT доступно только 15 из них. Все это – АЦП-контакты. Чтобы узнать, где они находятся, взгляните на распиновку своей ESP32-платы. На схеме ниже они помечены светло-синим цветом.

Данные, считываемые этими входными аналоговыми контактами, имеют 12-битное разрешение. Это значит, что при их считывании значения будут варьироваться от «0» до «4095».

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

Подключите потенциометр к ESP32 согласно схеме. Скопируйте код из раздела снизу.

Этот код просто считывает данные от потенциометра и печатает их в мониторе порта.

В этом коде мы сначала задаем GPIO-контакт, к которому подключен потенциометр. В нашем случае это GPIO34.

const int potPin = 34;

В блоке setup() инициализируем последовательную коммуникацию на скорости 115200 бод.

Serial.begin(115200);

В блоке loop() при помощи функции analogRead() считываем входные аналоговые данные, присланные от контакта «potPin».

potValue = analogRead(potPin);

Наконец, печатаем данные от потенциометра в мониторе порта.

Serial.println(potValue);

Загружаем этот код на ESP32. Перед загрузкой кода всегда проверяйте, правильные ли у вас выбраны плата и COM-порт в IDE Arduino.

Откройте монитор порта на скорости 115200 бод. Поверните ручку потенциометра, чтобы проверить, меняются ли значения в мониторе порта.

Максимальное значение, которое может быть показано в мониторе порта – «4095», а минимальное – «0».

Итак, если вкратце, то в этом примере мы научились следующему:

  • 30-контактная версия платы ESP32 DEVKIT V1 DOIT оснащена 15 АЦП-контактами, которые можно использовать для считывания аналоговых данных;
  • Эти контакты имеют 12-битное разрешение, т.е. вы можете считывать с них значения в диапазоне от «0» до «4095»;
  • В коде IDE Arduino за считывание данных отвечает лишь функция analogRead();
  • Данные с АЦП-контактов ESP32 считываются нелинейно, поэтому вы, вероятно, не сможете отличить 0 от 0.1 вольт, а также 3.2 от 3.3 вольт. Знайте это, работая с АЦП-контактами;

Необходимое оборудование

Схема

Примечание

На данной схеме используется плата ESP32S-HiLetgo, если вы используете другую, сверьтесь с вашей распиновкой.

Средний контакт потенциометра должен быть подключен к контакту GPIO34 платы ESP32. Оставшиеся два контакта соединены с шиной GND и 3.3V.

Код

// потенциометр подключен к контакту GPIO34 (ADC1_CH6) 
const int potPin = 34;

// переменная для хранения данных от потенциометра:
int potValue = 0;

void setup() {
  Serial.begin(115200);
  delay(1000);
}

void loop() {
  // считываем данные от потенциометра:
  potValue = analogRead(potPin);
  Serial.println(potValue);
  delay(500);
}

См.также

Внешние ссылки