MicroPython: ESP32/ESP8266 с анемометром (датчик ветра)
В этом руководстве вы узнаете, как подключить анемометр для измерения скорости ветра к платам ESP32 и ESP8266 NodeMCU, запрограммированным с помощью MicroPython. Мы рассмотрим, как запитать и подключить датчик к платам ESP32 и ESP8266, а также напишем простой код для получения значений скорости ветра в различных единицах измерения.
Содержание:
В этом руководстве мы рассмотрим следующие темы:
ESP32 с анемометром — код на MicroPython для измерения скорости ветра
ESP8266 с анемометром — код на MicroPython для измерения скорости ветра
Впервые работаете с MicroPython? Ознакомьтесь с нашей электронной книгой: MicroPython Programming with ESP32 and ESP8266 eBook (2nd Edition)
Необходимые условия
Для выполнения этого руководства вам необходимо, чтобы на ваших платах ESP32 или ESP8266 была установлена прошивка MicroPython. Вам также понадобится IDE для написания и загрузки кода на плату. Мы рекомендуем использовать Thonny IDE или uPyCraft IDE:
Thonny IDE:
uPyCraft IDE:
Узнайте больше о MicroPython: MicroPython Programming with ESP32 and ESP8266
Знакомство с анемометром
Анемометр — это устройство, которое позволяет измерять скорость ветра. Он обычно используется на метеостанциях.
Использовать этот датчик довольно просто. Он выдаёт аналоговый сигнал, напряжение которого пропорционально скорости ветра. Мы используем анемометр с тремя чашками, как на фотографии ниже.
Технические характеристики анемометра
В зависимости от производителя анемометр может иметь различные характеристики. Например, вот характеристики анемометра, используемого в этом руководстве:
Входное напряжение: 12-24 В постоянного тока
Выходное напряжение: 0-5 В
Диапазон измерения: 0-32,4 м/с
Разрешение: +/- 0,3 м/с
Это означает, что когда аналоговый сигнал равен 0, скорость ветра составляет 0. Однако в моём случае, после подачи питания на датчик и применения делителя напряжения, я заметил, что когда анемометр не двигался, выходное напряжение составляло 0,033 В, а не 0 В.
Таким образом, я считаю это минимальным значением, измеренным, когда датчик неподвижен. Рекомендую вам сделать то же самое и определить минимальное значение, считываемое с датчика, с помощью мультиметра.
Эти характеристики могут отличаться в зависимости от производителя. Поэтому вам нужно учитывать это при преобразовании аналогового сигнала в скорость ветра.
Распиновка анемометра
Анемометр поставляется с тремя проводами:
Синий провод |
Сигнал |
Чёрный провод |
GND |
Коричневый провод |
Питание |
Подключение анемометра к ESP32 и ESP8266
Анемометр требует входного напряжения не менее 12 В. Поэтому вы не можете запитать его непосредственно от ESP32 или ESP8266 — вам нужен внешний источник питания.
Мы питаем датчик с помощью блока питания 12 В и подключаем его к анемометру через разъём питания. Вы можете использовать любой другой подходящий источник питания.
Преобразование сигнала данных с 5 В до 3,3 В
В случае нашего датчика он работает в диапазоне от 0 до 5 В. Однако аналоговые пины ESP32 и ESP8266 могут считывать максимум 3,3 В. Поэтому нам нужно преобразовать сигнал 5 В в сигнал 3,3 В. Для этого мы можем использовать делитель напряжения.
Примечание: если вы используете анемометр, подобный тому, что продаётся Adafruit, вам не нужно беспокоиться об этом, потому что максимальное выходное напряжение составляет 2 В.
Делитель напряжения — это простая схема, которая уменьшает большое напряжение до меньшего. Используя 2 резистора и входное напряжение, мы можем создать выходное напряжение, которое является долей входного. Ниже вы можете увидеть формулу, которую нужно использовать для расчёта резисторов, необходимых в вашей схеме:
Если мы используем резистор 1 кОм (R1) и 2 кОм (R2), мы получим максимальное выходное напряжение 3,3 В — это максимум, который может считать ESP32.
Вот как выглядит схема делителя напряжения (где 5 В — максимальное значение с вывода данных датчика):
Вы можете использовать любую другую комбинацию резисторов, но вам нужно учитывать максимальное выходное напряжение, допускаемое используемой комбинацией резисторов.
Подробнее: How to Level Shift 5V to 3.3V
Схема подключения: ESP32 и ESP8266 с анемометром
Вот список компонентов, необходимых для этого руководства:
Вы можете использовать следующие схемы для подключения датчика к платам. Не забудьте соединить выводы GND вместе.
ESP32
Для ESP32 мы используем GPIO34 для чтения аналогового сигнала от датчика, но вы можете использовать любой другой подходящий GPIO для аналогового чтения.
ESP8266
ESP8266 имеет только один аналоговый пин — A0. Поэтому вы должны использовать именно этот пин для чтения аналогового сигнала от датчика.
Если вы используете анемометр, подобный тому, что от Adafruit, с максимальным выходным напряжением 2 В, вы можете подключить выходной пин непосредственно к аналоговому пину ESP (делитель напряжения не нужен).
Чёрный провод |
GND платы ESP и GND источника питания |
Синий провод |
Подключите к аналоговому пину ESP32/ESP8266 (через делитель напряжения, если необходимо), мы используем GPIO 34 для ESP32 и A0 для ESP8266. |
Коричневый провод |
Источник питания 12 В (+) |
ESP32 с анемометром — код на MicroPython для измерения скорости ветра
Следующий код считывает аналоговый сигнал от анемометра и преобразует его в скорость ветра.
Вы можете загрузить следующий код на ваш ESP32. Возможно, вам потребуется изменить некоторые переменные в зависимости от параметров вашего анемометра.
# Rui Santos & Sara Santos - Random Nerd Tutorials
# Complete project details at https://RandomNerdTutorials.com/micropython-esp32-esp8266-anemometer-wind-sensor/
from machine import ADC, Pin
from time import sleep
# Constants
# GPIO pin connected to anemometer (ESP32)
anemometer_pin = 34
min_voltage = 0.033 # Voltage corresponding to 0 m/s
max_voltage = 3.3 # Voltage corresponding to 32.4 m/s (max speed when using voltage divider)
max_wind_speed = 32.4 # Maximum wind speed in m/s
# Conversion factors
mps_to_kmh = 3.6 # 1 m/s = 3.6 km/h
mps_to_mph = 2.23694 # 1 m/s = 2.23694 mph
# Set up the ADC
adc = ADC(Pin(anemometer_pin))
adc.atten(ADC.ATTN_11DB) # Configure ADC to read full 3.3V range (11dB attenuation)
adc.width(ADC.WIDTH_12BIT) # Set resolution to 12 bits (0-4095)
while True:
# Read analog value from anemometer (ADC value between 0-4095)
adc_value = adc.read()
# Convert ADC value to voltage
voltage = (adc_value / 4095.0) * 3.3
# Ensure the voltage is within the anemometer operating range
if voltage < min_voltage:
voltage = min_voltage
elif voltage > max_voltage:
voltage = max_voltage
# Map the voltage to wind speed
wind_speed_mps = ((voltage - min_voltage) / (max_voltage - min_voltage)) * max_wind_speed
# Convert wind speed to km/h and mph
wind_speed_kmh = wind_speed_mps * mps_to_kmh
wind_speed_mph = wind_speed_mps * mps_to_mph
# Print wind speed
print("Wind Speed:")
print("{:.2f} m/s".format(wind_speed_mps))
print("{:.2f} km/h".format(wind_speed_kmh))
print("{:.2f} mph".format(wind_speed_mph))
print()
sleep(1)
Код для ESP8266 немного отличается — продолжайте читать, чтобы увидеть код для ESP8266.
ESP8266 с анемометром — код на MicroPython для измерения скорости ветра
Следующий код делает то же самое, что и предыдущий, но адаптирован для плат ESP8266 NodeMCU.
# Rui Santos & Sara Santos - Random Nerd Tutorials
# Complete project details at https://RandomNerdTutorials.com/micropython-esp32-esp8266-anemometer-wind-sensor/
from machine import ADC, Pin
from time import sleep
# Constants
min_voltage = 0.033 # Voltage corresponding to 0 m/s
max_voltage = 3.3 # Voltage corresponding to 32.4 m/s (max speed when using voltage divider)
max_wind_speed = 32.4 # Maximum wind speed in m/s
# Conversion factors
mps_to_kmh = 3.6 # 1 m/s = 3.6 km/h
mps_to_mph = 2.23694 # 1 m/s = 2.23694 mph
# Set up the ADC
adc = ADC(0)
while True:
# Read analog value from anemometer (ADC value between 0-1023)
adc_value = adc.read()
# Convert ADC value to voltage
voltage = (adc_value / 1023.0) * 3.3
# Ensure the voltage is within the anemometer operating range
if voltage < min_voltage:
voltage = min_voltage
elif voltage > max_voltage:
voltage = max_voltage
# Map the voltage to wind speed
wind_speed_mps = ((voltage - min_voltage) / (max_voltage - min_voltage)) * max_wind_speed
# Convert wind speed to km/h and mph
wind_speed_kmh = wind_speed_mps * mps_to_kmh
wind_speed_mph = wind_speed_mps * mps_to_mph
# Print wind speed
print("Wind Speed:")
print("{:.2f} m/s".format(wind_speed_mps))
print("{:.2f} km/h".format(wind_speed_kmh))
print("{:.2f} mph".format(wind_speed_mph))
print()
sleep(1)
Как работает код?
Мы начинаем с импорта необходимых модулей. Классы ADC и Pin из модуля machine для настройки GPIO в качестве пинов АЦП.
from machine import ADC, Pin
from time import sleep
Определите пин, на котором вы считываете показания датчика, минимальное и максимальное выходное напряжение датчика, а также максимальную скорость ветра. В случае ESP32 мы используем GPIO 34 для чтения аналогового сигнала от датчика ветра.
# GPIO pin connected to anemometer (ESP32)
anemometer_pin = 34
min_voltage = 0.033 # Voltage corresponding to 0 m/s
max_voltage = 3.3 # Voltage corresponding to 32.4 m/s (max speed when using voltage divider)
max_wind_speed = 32.4 # Maximum wind speed in m/s
В случае ESP8266 единственный доступный аналоговый пин — A0. Поэтому нам нужно передать его в объект ADC() следующим образом:
adc = ADC(0)
Затем у нас есть коэффициенты пересчёта для преобразования скорости ветра из м/с в км/ч и мили/ч.
# Conversion factors
mps_to_kmh = 3.6 # 1 m/s = 3.6 km/h
mps_to_mph = 2.23694 # 1 m/s = 2.23694 mph
Создайте объект ADC на GPIO, который вы используете для чтения аналогового датчика. Для ESP32 это выглядит так:
adc = ADC(Pin(anemometer_pin))
А для ESP8266 — так:
adc = ADC(0)
При использовании ESP32 нам также нужно добавить следующие две строки.
adc.atten(ADC.ATTN_11DB) # Configure ADC to read full 3.3V range (11dB attenuation)
adc.width(ADC.WIDTH_12BIT) # Set resolution to 12 bits (0-4095)
Первая строка означает, что мы хотим считывать напряжение от 0 до 3,3 В. Это соответствует установке коэффициента ослабления 11 дБ.
Вторая строка кода устанавливает разрешение в 12 бит. Таким образом, мы будем считывать число от 0 до 4095 на аналоговом пине.
Наконец, у нас есть цикл while, который получает новые значения скорости ветра каждую секунду.
Сначала мы считываем значение на пине АЦП и преобразуем его в значение напряжения. Максимальное значение, считываемое на пине АЦП ESP32, равно 4095, что соответствует 3,3 В.
while True:
# Read analog value from anemometer (ADC value between 0-4095)
adc_value = adc.read()
Таким образом, мы можем преобразовать значение в напряжение с помощью следующей строки:
# Convert ADC value to voltage
voltage = (adc_value / 4095.0) * 3.3
Затем у нас есть следующее условие для проверки, находятся ли считанные значения в определённом диапазоне.
# Ensure the voltage is within the anemometer operating range
if voltage < min_voltage:
voltage = min_voltage
elif voltage > max_voltage:
voltage = max_voltage
Далее мы можем легко преобразовать полученное напряжение в значение скорости ветра следующим образом:
# Map the voltage to wind speed
wind_speed_mps = ((voltage - min_voltage) / (max_voltage - min_voltage)) * max_wind_speed
Затем мы преобразуем полученные значения в км/ч и мили/ч.
# Convert wind speed to km/h and mph
wind_speed_kmh = wind_speed_mps * mps_to_kmh
wind_speed_mph = wind_speed_mps * mps_to_mph
Наконец, мы выводим полученные результаты.
# Print wind speed
print("Wind Speed:")
print("{:.2f} m/s".format(wind_speed_mps))
print("{:.2f} km/h".format(wind_speed_kmh))
print("{:.2f} mph".format(wind_speed_mph))
print()
Демонстрация
Запустите или загрузите код на вашу плату с помощью Thonny IDE.
В MicroPython Shell вы должны увидеть данные о скорости ветра.
Возможно, вам потребуется дополнительная калибровка датчика для получения более точных результатов.
Заключение
В этом руководстве вы узнали, как подключить анемометр к платам ESP32 и ESP8266, запрограммированным с помощью MicroPython, для получения данных о скорости ветра.
Надеемся, что это краткое руководство оказалось полезным. У нас есть руководства по другим датчикам и модулям, которые могут вам пригодиться:
Чтобы узнать больше о MicroPython, ознакомьтесь с нашими ресурсами: