ESP32 и MicroPython Изчитане на аналогови стойности

Използването на ESP32 и MicroPython за изчитане на аналогови стойности е чудесен начин да съберете данни от сензори и да изградите интелигентни устройства. В тази статия ще ви покажем как да прочетете аналогови стойности от сензори, свързани към ESP32, и как да преобразувате тези стойности в напрежение.

Първото нещо което трябва да направим е да инсталираме MicroPython върху ESP32. Ако все още не сте направили това може да прочетете нашата статия с обяснение за това: Инсталиране на MicroPython върху ESP32

След успешната инсталация трябва да направим схемата на тестовата платформа. Тя е начертана на Fritzing.

ESP32-C3 Super Mini ЦАП/ADC аналогово изчитане с MicroPython

Сурово изчитане на данните

Свързване на сензора

Свържете аналоговия сензор към един от аналоговите входове на ESP32. В този пример ще използваме потенциометър, свързан към пин A1 на ESP32 C3 Super Mini.

Програмиране на ESP32 с MicroPython

  1. Импортиране на нужните библиотеки:
    • За да изчетем аналогови стойности, ще използваме библиотеката machine, която позволява работа с хардуерните компоненти на ESP32.
  2. Написване на кода:

Това е примерен код за изчитане на сурови аналогови стойности от потенциометър:

from machine import Pin, ADC
from time import sleep

pot = ADC(Pin(1))  # Сменете пин 1 с използвания от вас аналогов пин
pot.width(ADC.WIDTH_12BIT)  # Задаване на резолюцията на изчитане 12bit, 0-4095
pot.atten(ADC.ATTN_11DB)    # Използване на пълния обхват на изчитане 0-3.3v


while True:
    pot_value = 0
    print(pot.read())
    
    sleep(0.5)  # 0.5 секунди прекъсване ( изчакване докато се повтори цикъла )

Обяснение на кода

  • Импортиране на библиотеки:
    • Pin и ADC от machine се използват за управление на пиновете и аналогово-цифровия преобразувател.
    • sleep от time се използва за забавяне между четенията.
  • Инициализация на ADC:
    • Създаваме обект ADC/ЦАП, който представлява аналоговия вход на пин А1.
    • Задаваме резолюцията на изчиране 12bit / 0-4095
    • Настройваме обхвата на ADC с pot.atten(ADC.ATTN_11DB), за да можем да измерваме напрежения до 3.3V.
  • Четене и печатане:
    • В безкраен цикъл прочитаме стойността от аналоговия вход с pot.read().
    • Печатаме аналоговата стойност на сериен монитор.
    • Изчакване на 0.5 секунди преди да се повтори цикъла

Кратък клип как работи програмата

Преобразуване на стойностите в напрежение

Програмиране на ESP32 с MicroPython

След като можем да четем суровите стойности от аналоговия вход, ще преобразуваме тези стойности в напрежение.

  1. Написване на кода:

Това примерен код за преобразуване на сурови аналогови стойности в напрежение:

from machine import Pin, ADC
from time import sleep

pot = ADC(Pin(1))  # Сменете пин 1 с използвания от вас аналогов пин
pot.width(ADC.WIDTH_12BIT)  # Задаване на резолюцията на изчитане 12bit, 0-4095
pot.atten(ADC.ATTN_11DB)  # Използване на пълния обхват на изчитане 0-3.3v

while True:
    pot_value = 0

    volt = (pot_value * 3.3) / 4095
    
    print(round(volt, 2))
    sleep(0.5)

Обяснение на кода

  • Импортиране на библиотеки:
    • Pin и ADC от machine се използват за управление на пиновете и аналогово-цифровия преобразувател.
    • sleep от time се използва за забавяне между четенията.
  • Инициализация на ADC:
    • Създаваме обект ЦАП/ADC, който представлява аналоговия вход на пин А1.
    • Задаваме резолюцията на изчиране 12bit / 0-4095
    • Настройваме обхвата на ADC с pot.atten(ADC.ATTN_11DB), за да можем да измерваме напрежения до 3.3V.
  • Четене и изчисляване:
    • В безкраен цикъл прочитаме стойността от аналоговия вход с pot.read().
    • Преобразуваме тази стойност във волтове, като използваме факта, че максималната стойност на ADC е 4095 (за 12-битова резолюция) и обхватът на напрежението е 3.3V. Напрежението се изчислява чрез формулата: voltage = ( analog_value / 4095 ) * 3.3. Тук ще забележите, че в примера посочен горе не съм посочил опорно напрежение от 3.3v a 3.05v. Това се дължи на разлика от офицялното опорно напрежение на процесота и реалното му такова. Този проблем ще го разискваме в по-нататъшните наши статии.
    • Печатаме изчисленото напрежение на сериен монитор. Тук сме използвали функцията “round(volt, 2)“. Тази функция отрязва показанията (изчисленото напрежение) след втората цифра след десетичната запетая.

Кратък клип на кода

Заключение

С помощта на ESP32 и MicroPython, изчитането на аналогови стойности е лесно и ефективно. В първата част на статията разгледахме как да прочетем сурови стойности, а във втората част как да ги преобразуваме в напрежение. Тези основни концепции могат да се използват за различни приложения като мониторинг на сензори които връщат аналогови стойности. Може да забележите че в стойностите или напрежението които измервате има колебания или е неточно. Тези проблеми ще ги разгледаме в следващите статии, като първо намерим точното опорно напрежение на процесора/контролера, осредняваме множество прочетени стойности и накрая ще изгладим показанията като ги прекараме в EMA (Exponential Moving Average) филтър.