Raspberry Pi Pico with Anemometer: Measure Wind Speed (MicroPython)

Learn how to interface an anemometer to measure wind speed with the Raspberry Pi Pico. We’ll cover how to power and connect the sensor to the Pico, and write a simple code to get wind speed values in different units. The Raspberry Pi Pico board will be programmed using MicroPython firmware.

Raspberry Pi Pico with Anemomer: Measure Wind Speed (MicroPython)

New to the Raspberry Pi Pico? Check out our eBook: Learn Raspberry Pi Pico with MicroPython.

Table of Contents

Throughout this guide, we’ll cover the following topics:

Prerequisites – MicroPython Firmware

To follow this tutorial you need MicroPython firmware installed in your Raspberry Pi Pico board. You also need an IDE to write and upload the code to your board.

The recommended MicroPython IDE for the Raspberry Pi Pico is Thonny IDE. Follow the next tutorial to learn how to install Thonny IDE, flash MicroPython firmware, and upload code to the board.

Introducing the Anemometer

An anemometer is a device that allows us to measure wind speed. It is commonly used in weather stations.

Using this sensor is quite easy. It outputs an analog signal, whose voltage is proportional to the wind speed. We’re using an anemometer with three cups like the one in the picture below.

Wind Sensor Anemometer

Anemometer Technical Details

Depending on the manufacturer, the anemometer may have different characteristics. For example, these are the characteristics of the anemometer used in this guide:

  • Input voltage: 12-24V DC
  • Output voltage: 0-5V
  • Measurement range: 0-32.4m/s
  • Resolution: +/- 0.3m/s

This means that when the analog signal is 0, the wind speed is 0. However, in my case, after powering the sensor and applying a voltage regular, I noticed that when the anemometer was not moving, the output voltage was 0,033V and not 0V.

Raspberry Pi Pico Measure Voltage from Wind Sensor with no wind

So, I consider this to be the lowest value measured when the sensor is not moving. I recommend you do the same and figure out the minimum value read from the sensor using a multimeter.

These details might be different depending on the manufacturer. So, you need to take that into account when converting the analog signal to wind speed.

Anemometer Pinout

The anemometer comes with three wires:

Blue WireSignal
Black WireGND
Brown WirePower
Anemometer, Wind Sensor Pinout

Connecting the Anemometer to the Raspberry Pi Pico

The anemometer requires an input voltage of at least 12V. So, you can’t power it directly from the Raspberry Pi Pico, you need an external power source.

12VDC Power Adapter

We’re powering the sensor using a 12V power adapter and connecting it to the anemometer using a power jack. You can use any other suitable power source.

DC power jack adapter

Converting the Data Signal from 5V to 3.3V

In the case of my sensor, it operates in the range of 0 to 5V. However, the Raspberry Pi Pico analog pins can only read a maximum of 3.3V. So, we need to convert the 5V signal to a 3.3V signal. To do that, we can use a voltage divider.

Note: if you’re using an anemometer like the one from Adafruit, you don’t need to worry about this because the maximum output voltage is 2V.

A voltage divider is a simple circuit that reduces a large voltage into a smaller one. Using 2 resistors and an input voltage, we can create an output voltage that is a fraction of the input. Below you can see the formula that you need to use to calculate the resistors that you need in your circuit:

voltage divider formula

If we use a 1k Ohm (R1) and a 2k Ohm (R2) resistor, we’ll get a maximum output of 3.3V, which is the maximum that the Raspberry Pi Pico can read.

So, here’s what the voltage divider circuit looks like (in which 5V is the maximum value of the sensor data pin):

voltage divider 5V to 3.3V

You can use any other combination of resistors, but you need to take into account the maximum output voltage allowed by the combination of resistors used.

Learn more here: How to Level Shift 5V to 3.3V

Wiring the Circuit: Raspberry Pi Pico with Anemometer

Raspberry Pi Pico with Anemometer Wind Sensor Circuit

Here’s a list of the parts you need for this tutorial:

You can use the following diagram as a reference to wire the sensor to the board. Don’t forget to connect the GND pins together.

Raspberry Pi Pico with Wind Sensor Anemometer Circuit Diagram

We’re connecting the data pin to the Raspberry Pi Pico GPIO 26. Other pins you can use are GPIOs 27 and 28.

Recommended reading: Raspberry Pi Pico and Pico W Pinout Guide: GPIOs Explained

If you’re using an anemometer like the one from Adafruit that outputs a maximum of 2V, you can connect the output pin directly to the Raspberry Pi Pico analog pin (you don’t need the voltage divider).

Black WireGND of the Pico board and GND of the power source
Blue WireConnect to Pico analog pin (via voltage divider, if needed), we’re using GPIO 26.
Brown Wire12V power source (+)

Raspberry Pi Pico with the Anemometer – Measure Wind Speed MicroPython Code

The following code reads the analog signal from the anemometer and converts it into wind speed.

You can upload the following code to your Raspberry Pi Pico. You may need to modify some of the variables depending on the parameters of your anemometer.

# Rui Santos & Sara Santos - Random Nerd Tutorials
# Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-anemomer-micropython/

from machine import ADC, Pin
from time import sleep

# Constants
anemometer_pin = 26    # GPIO pin connected to anemometer
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))

while True:
    # Read analog value from anemometer
    adc_value = adc.read_u16() # read value, 0-65535 across voltage range 0.0v - 3.3v
    
    # Convert ADC value to voltage
    voltage = (adc_value / 65535.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)

View raw code

How Does the Code Work?

We start importing the required modules. The ADC and Pin classes from the machine module to set the GPIOs as ADC pins.

from machine import ADC, Pin
from time import sleep

Define the pin where you’re reading the sensor, the minimum and the maximum output voltage of the sensor, and the maximum wind speed. We’re using GPIO 26 to read the analog signal from the wind sensor.

anemometer_pin = 26  # GPIO pin connected to anemometer
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

Then, we have the conversion factors to convert the wind speed from m/s to km/h and mph.

# 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

Create an ADC object on the GPIO you’re using to read the analog sensor.

adc = ADC(Pin(anemometer_pin))

Finally, we have a while loop that gets new wind speed values every second.

First, we read the value on the ADC pin and convert it to a voltage value. To read an analog signal, use the read_u16() function on the adc object.

while True:
    # Read analog value from anemometer
    adc_value = adc.read_u16() # read value, 0-65535 across voltage range 0.0v - 3.3v

The maximum value read on the Pico ADC pin (16-bits) is 65535 that corresponds to 3.3V.

So, we can convert the value to a voltage using the following line:

# Convert ADC value to voltage
voltage = (adc_value / 65535.0) * 3.3

Then, we have the following condition to check if the values read are within the defined range.

# Ensure the voltage is within the anemometer operating range
if voltage < min_voltage:
    voltage = min_voltage
elif voltage > max_voltage:
    voltage = max_voltage

Next, we can easily map the obtained voltage to a wind speed value as follows:

# Map the voltage to wind speed
wind_speed_mps = ((voltage - min_voltage) / (max_voltage - min_voltage)) * max_wind_speed

Then, we convert the values obtained to km/h and mph.

 # 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

Finally, we print the obtained results.

# 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() 

Demonstration

Run or upload the code to your board using Thonny IDE.

Thonny IDE Run Code

On the MicroPython Shell, you should get wind speed data.

Raspberry Pi Pico Measure Wind Speed MicroPythonDemonstration

You may need to do further sensor calibration to get more accurate results.

Wrapping Up

In this tutorial, you learned how to interface an anemometer with the Raspberry Pi Pico programmed with MicroPython to get data about wind speed.

An anemometer is an essential sensor to add to your weather station. If you’d like to create a weather station with the Raspberry Pi Pico, we have other tutorials you may find useful:

We hope you find this guide useful. If you want to learn more about the Raspberry Pi Pico, make sure to take a look at our eBook:

Thanks for reading.



Learn how to build a home automation system and we’ll cover the following main subjects: Node-RED, Node-RED Dashboard, Raspberry Pi, ESP32, ESP8266, MQTT, and InfluxDB database DOWNLOAD »
Learn how to build a home automation system and we’ll cover the following main subjects: Node-RED, Node-RED Dashboard, Raspberry Pi, ESP32, ESP8266, MQTT, and InfluxDB database DOWNLOAD »

Recommended Resources

Build a Home Automation System from Scratch » With Raspberry Pi, ESP8266, Arduino, and Node-RED.

Home Automation using ESP8266 eBook and video course » Build IoT and home automation projects.

Arduino Step-by-Step Projects » Build 25 Arduino projects with our course, even with no prior experience!

What to Read Next…


Enjoyed this project? Stay updated by subscribing our newsletter!

Leave a Comment

Download Our Free eBooks and Resources

Get instant access to our FREE eBooks, Resources, and Exclusive Electronics Projects by entering your email address below.