Използването на ESP32 и MicroPython за изчитане на аналогови стойности е чудесен начин да съберете данни от сензори и да изградите интелигентни устройства. В тази статия ще ви покажем как да прочетете аналогови стойности от сензори, свързани към ESP32, и как да преобразувате тези стойности в напрежение.
Първото нещо което трябва да направим е да инсталираме MicroPython върху ESP32. Ако все още не сте направили това може да прочетете нашата статия с обяснение за това: Инсталиране на MicroPython върху ESP32
След успешната инсталация трябва да направим схемата на тестовата платформа. Тя е начертана на Fritzing.
![ESP32-C3 Super Mini ЦАП/ADC аналогово изчитане с MicroPython](http://ardudevelop.eu/wp-content/uploads/2024/07/ESP32-C3-Super-Mini-потенциометър-1.png)
Сурово изчитане на данните
Свързване на сензора
Свържете аналоговия сензор към един от аналоговите входове на ESP32. В този пример ще използваме потенциометър, свързан към пин A1 на ESP32 C3 Super Mini.
Програмиране на ESP32 с MicroPython
- Импортиране на нужните библиотеки:
- За да изчетем аналогови стойности, ще използваме библиотеката machine, която позволява работа с хардуерните компоненти на ESP32.
- Написване на кода:
Това е примерен код за изчитане на сурови аналогови стойности от потенциометър:
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
След като можем да четем суровите стойности от аналоговия вход, ще преобразуваме тези стойности в напрежение.
- Написване на кода:
Това примерен код за преобразуване на сурови аналогови стойности в напрежение:
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) филтър.