MicroPython: анемометр (датчик ветра) на ESP32/ESP8266

Перевод статьи MicroPython: ESP32/ESP8266 with Anemometer (Wind Sensor) — Rui Santos & Sara Santos, Random Nerd Tutorials.
Из этого руководства вы узнаете, как подключить анемометр для измерения скорости ветра к платам ESP32 и ESP8266 NodeMCU, запрограммированным на MicroPython. Разберём, как запитать датчик и соединить его с платами ESP32 и ESP8266, а затем напишем простой код, который выдаёт скорость ветра в разных единицах.
Что нужно заранее#
Чтобы повторить это руководство, на плату ESP32 или ESP8266 должна быть залита прошивка MicroPython. Ещё понадобится среда для написания и загрузки кода на плату. Рекомендуем 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 В, а 0,033 В.
Поэтому я считаю это значение минимальным для неподвижного датчика. Рекомендую поступить так же и определить мультиметром минимальное значение, которое выдаёт ваш датчик.
Эти параметры могут отличаться у разных производителей. Так что учитывайте это при переводе аналогового сигнала в скорость ветра.
Распиновка анемометра#
У анемометра три провода:
| Провод | Назначение |
|---|---|
| Синий | сигнал (Signal) |
| Чёрный | земля (GND) |
| Коричневый | питание (Power) |

Три провода анемометра.
Подключение анемометра к ESP32 и ESP8266#
Анемометру требуется входное напряжение не менее 12 В. Поэтому запитать его напрямую от ESP32 или ESP8266 не получится — нужен внешний источник питания.

Блок питания на 12 В.
Мы питаем датчик от блока питания на 12 В и подключаем его к анемометру через разъём питания (power jack). Можно взять любой другой подходящий источник.

Переходник с гнездом питания DC.
Приведение сигнала данных с 5 В к 3,3 В#
В моём случае датчик работает в диапазоне от 0 до 5 В. Однако аналоговые пины ESP32 и ESP8266 могут читать максимум 3,3 В. Значит, сигнал 5 В нужно привести к 3,3 В. Для этого воспользуемся делителем напряжения.
Обратите внимание: если у вас анемометр вроде того, что продаёт Adafruit, об этом можно не беспокоиться — его максимальное выходное напряжение составляет 2 В.
Делитель напряжения — это простая схема, понижающая большое напряжение до меньшего. С помощью двух резисторов и входного напряжения мы получаем выходное напряжение, которое составляет долю от входного. Ниже — формула для расчёта резисторов, нужных в вашей схеме:

Формула расчёта делителя напряжения.
Если взять резистор на 1 кОм (R1) и на 2 кОм (R2), на выходе получим максимум 3,3 В — как раз столько, сколько может прочитать ESP32.
Вот как выглядит схема делителя напряжения (здесь 5 В — максимальное значение на сигнальном пине датчика):

Схема делителя: 5 В на входе, 3,3 В на выходе.
Можно использовать и любую другую комбинацию резисторов, но нужно учитывать максимальное выходное напряжение, которое эта комбинация допускает.
Подробнее: How to Level Shift 5V to 3.3V.
Схема подключения: ESP32 и ESP8266 с анемометром#

Схема в сборе на макетной плате.
Вот список деталей, которые понадобятся для этого руководства:
- плата ESP32 или плата ESP8266;
- анемометр (датчик скорости ветра);
- блок питания на 12 В постоянного тока;
- переходник с разъёмом питания DC;
- резистор на 1 кОм и резистор на 2 кОм;
- макетная плата;
- провода-джамперы;
- мультиметр.
Схемы ниже можно использовать как ориентир при подключении датчика к платам. Не забудьте соединить пины GND вместе.
ESP32#
Для ESP32 мы читаем аналоговый сигнал с датчика через GPIO34, но можно взять любой другой подходящий для аналогового чтения GPIO.

Схема подключения для ESP32.
ESP8266#
У ESP8266 всего один аналоговый пин — A0. Значит, читать аналоговый сигнал с датчика придётся именно через него.

Схема подключения для ESP8266.
Если у вас анемометр вроде адафрутовского, выдающий максимум 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 NodeMCU с анемометром — код на 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 как пины АЦП (ADC).
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.

Запускаем код в Thonny IDE.
В консоли MicroPython (Shell) должны появиться данные о скорости ветра.

Скорость ветра в консоли MicroPython.
Чтобы результаты были точнее, датчик, возможно, потребуется дополнительно откалибровать.
Итого#
В этом руководстве вы научились подключать анемометр к платам ESP32 и ESP8266 на MicroPython и получать данные о скорости ветра.
Похожие руководства по другим датчикам и модулям на MicroPython: