Перевод статьи 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:

Подробнее про 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 В.

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

Переходник с разъёмом питания DC

Переходник с гнездом питания 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 В

Схема делителя: 5 В на входе, 3,3 В на выходе.

Можно использовать и любую другую комбинацию резисторов, но нужно учитывать максимальное выходное напряжение, которое эта комбинация допускает.

Подробнее: How to Level Shift 5V to 3.3V.

Схема подключения: ESP32 и ESP8266 с анемометром#

Собранная на макетной плате схема ESP32 с анемометром

Схема в сборе на макетной плате.

Вот список деталей, которые понадобятся для этого руководства:

Схемы ниже можно использовать как ориентир при подключении датчика к платам. Не забудьте соединить пины GND вместе.

ESP32#

Для ESP32 мы читаем аналоговый сигнал с датчика через GPIO34, но можно взять любой другой подходящий для аналогового чтения GPIO.

Схема подключения ESP32 к датчику ветра — анемометру

Схема подключения для ESP32.

ESP8266#

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

Схема подключения ESP8266 к датчику ветра — анемометру

Схема подключения для 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

Запускаем код в Thonny IDE.

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

Данные о скорости ветра в консоли MicroPython

Скорость ветра в консоли MicroPython.

Чтобы результаты были точнее, датчик, возможно, потребуется дополнительно откалибровать.

Итого#

В этом руководстве вы научились подключать анемометр к платам ESP32 и ESP8266 на MicroPython и получать данные о скорости ветра.

Похожие руководства по другим датчикам и модулям на MicroPython: