Начнем с алгоритма работы нашей программы!
1. Подключим в схеме регулируемый блок питания 0-15В к ESP32.
2. Настроим АЦП ESP32, для измерения напряжения на ножке D4.
3. Задаем ослабление входного напряжения.
4. В бесконечном цикле считываем данные на ножке D4 с помощью функции read в диапазоне (0-4095) и пересчитаем в реальное напряжение.
5. Выводим измеренное напряжение в терминал, с задержкой в 300
6. Подключим oled дисплей к ESP32.
7. Настроим I2C, на ножках D21, D22.
8. Зададим разрешение дисплея.
9. В бесконечном цикле выводим напряжение и текст на экран.

И так схема у нас есть, на ней обозначены микроконтроллер, ножки gnd и питания 3,3В, регулируемый источник напряжения 0-15В подключен к порту D4, через делитель напряжения на резисторах R1, R2, пин D21, D22 - к которым подключен oled (ssd1306) дисплей.
Практически к каждому материалу есть видеоролик на YouTube и RUTUBE каналах, теорию можно прочитать в статье, а как работает устройство в железе, посмотреть в видеоролике!
Вернемся к программе.
Регулируемый источник напряжения 0-15В у нас подключен к порту D4, через делитель напряжения на резисторах R1 = 100кОм, R2 = 27кОм, настроим в программе ножки порта D4 на измерение АЦП, допишем в программе voltmetr = ADC(Pin(4)) - переменная voltmetr равна значению полученному на ножке D4 ,voltmetr.atten(ADC.ATTN_11DB - чтобы считать напряжение выше опорного, применим входное ослабление с помощью аргумента atten из документации Vref = (150mv-2450mv). Дисплей у нас подключен к портам D21(sda), D22(scl) и ножкам питания 3.3В, gnd, настроим в программе ножки портов D21(sda), D22(scl) как шину I2C - i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=10000) и укажем частоту freq=10000, далее создаем переменные ширины (display_width = 128) и высоты (display_height = 64) дисплея, затем опишем разрешение экрана строкой display = ssd1306.SSD1306_I2C(display_width, display_height, i2c).С настройкой портов закончили, далее чтобы наша программа работала добавим в нее модуль import machine, который содержит необходимые функции, для работы платы, строкой from machine import Pin, I2C, ADC укажем чтобы нам постоянно не повторять machine в коде, модуль, который служит нам для формирования задержек import time, а также подключим библиотеку для работы с oled дисплеями import ssd1306, библиотеку можно скачать по ссылке которая закреплена под видео на канале.
Давайте немного поговорим о строчке кода опорного напряжения, откуда мы ее взяли.
ClassADC(pin, *, atten), MicroPython предлагает нам на выбор несколько вариантов ослабления входного напряжения, зависит от задачи в программе:
-
ADC.ATTN_0DB: No attenuation (100mV - 950mV) -
ADC.ATTN_2_5DB: 2.5dB attenuation (100mV - 1250mV) -
ADC.ATTN_6DB: 6dB attenuation (150mV - 1750mV) -
ADC.ATTN_11DB: 11dB attenuation (150mV - 2450mV)
Так как, мы измеряем диапазон напряжения от 0-15В, поэтому выбираем максимально возможный вариант, описанный выше.

В бесконечном цикле while True, командой display.fill(0) заполняем весь экран цветом, считываем АЦП на ножке D4 с помощью функции read в диапазоне (0-4095) - для 12-битного разрешения, преобразуем его в напряжение voltage = voltmetr.read() / 4095 * 15 * 1.1, строкой power = (round(voltage, 1)) округляем полученный результат, до 1 символа после точки и выводим измеренное напряжение в терминал, с задержкой в 300ms. Затем выводим измеренное напряжение на дисплей display.text( str (power), 40, 30) и текстовую строку VOLT с заданными координатами размещения на дисплее display.text('VOLT', 75, 30), записываем содержимое в буфер памяти display.show() с задержкой в одну секунду.
