Начнем с алгоритма работы нашей программы!
1. Подключим в схеме три кнопки к ESP32.
2. Настроим ножки D18, D5, D4 на вход сигнала от кнопок.
3. Подключим oled дисплей к ESP32.
4. Настроим I2C, на ножках D21, D22.
5. Зададим разрешение дисплея.
6. Создадим функции обработки нажатия кнопок.
7. В бесконечном цикле выводим частоту и скважность на экран.
И так схема у нас есть, на ней обозначены микроконтроллер, ножки gnd и питания 3,3В, кнопки SB1, SB2, SB3- подключены к портам D4, D5, D18, X1 разъем для подключения осциллографа, пин D21, D22 - к которым подключен oled (ssd1306) дисплей.
Практически к каждому материалу есть видеоролик на YouTube и RUTUBE каналах, теорию можно прочитать в статье, а как работает устройство в железе, посмотреть в видеоролике!
Настраиваем пин 23 для генерации ШИМ-сигнала pwm = PWM(Pin(23)), укажем начальную частоту 100 Гц pwm.freq(100) и скважность 50% pwm.duty(512), кнопки SB1, SB2, SB3- подключены к портам D4, D5, D18,с подтягивающим резистором программно - button_duty = Pin(4, Pin.IN, Pin.PULL_UP), button_plus = Pin(5, Pin.IN, Pin.PULL_UP), button_minus = Pin(18, Pin.IN, Pin.PULL_UP). Дисплей у нас подключен к портам 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, PWM укажем чтобы нам постоянно не повторять machine в коде, а также подключим библиотеку для работы с oled дисплеями import ssd1306, библиотеку можно скачать по ссылке которая закреплена под видео на канале.
Создадим три функции для обработки кнопок и вывода информации на дисплей:
1. Функция для увеличения частоты ШИМ-сигнала def frequency_plus():, если кнопка SB2 нажата if not button_plus.value():, увеличиваем частоту на 100 Гц pwm.freq(pwm.freq() + 100), выводим частоту на дисплей display.text("Freq: {} Hz".format(pwm.freq()), 0, 0).
2. Функция для уменьшения частоты ШИМ-сигнала def frequency_minus():, если кнопка SB3 нажата if not button_minus.value():, уменьшаем частоту на 100 Гц new_freq = pwm.freq() - 100, создадим условие - если частота меньше 100 Гц if new_freq < 100:, то частота равна 100 Гц new_freq = 100, pwm.freq(new_freq) так как базовая частота может варьироваться от 1 Гц до 40 МГц, но есть сбалансированность; по мере увеличения базовой частоты, разрешение заполнения уменьшается. Более подробную информацию можно почитать в документации к языку программирования MicroPython. Выводим частоту на дисплей display.text("Freq: {} Hz".format(int(new_freq)), 0, 0).
3. Функция для изменения скважности ШИМ-сигнала def duty_cycle():, если кнопка SB1 нажата if not button_duty.value():, увеличиваем скважность на 25% new_duty = pwm.duty() + 64, создадим условие - если скважность больше 1023 if new_duty > 1023:, То скважность равна 0 new_duty = 0 так как рабочий цикл находится в диапазоне от 0 (все выключено) до 1023 (все включено), причем 512 соответствует 50% нагрузке. Значения, выходящие за пределы этого минимального/максимального значения, будут обрезаны. Более подробную информацию можно почитать в документации к языку программирования MicroPython. Выводим скважность на дисплей в % display.text("Duty: {}%".format(int(new_duty / 10.24)), 0, 20).
В бесконечном цикле while True, запишем функции обработки кнопок и вывода информации на дисплей frequency_plus(), frequency_minus(), duty_cycle().