Build an IOT CO2 sensing bird to alert you of the air quality levels! This bird alerts you when it detects high levels of CO2.

Much like the canaries that were kept in coal mines to detect gases, this build uses a CO2 sensor to detect if the air quality and Adafruit.IO / WipperSnapper will automatically move a servo up and down.

When the air quality is poor, the bird will drop, until you open your windows and bring it back to life:

  • When the level of CO2 in a room is above 1000 ppm, a CO2-sensor activates a motor that will make this bird drop down.
  • When the level of CO2 is below 1000 ppm, the bird will rise back up!

Reactive Servo Actions

IoT projects just got a whole lot easier! With Adafruit’s WipperSnapper, you can connect I2C sensors and do useful things with your data.

WipperSnapper is Adafruit’s No-Code solution for making IoT projects with support for dozens of WiFi enabled dev boards.

With Reactive Actions, make a feed turn something on, like a motor based on the CO2 levels among other environmental variables! 


Angled shot of purple square-shaped microcontroller.
This dev board is like when you're watching a super-hero movie and the protagonist shows up in a totally amazing costume in the third act and you're like 'OMG! That's...
In Stock
Micro servo with three pin cable
Tiny little servo can rotate approximately 180 degrees (90 in each direction) and works just like the standard kinds you're used to but smaller. You can use any servo...
In Stock
Angled shot of Adafruit SCD-41 - NDIR CO2 Temperature and Humidity Sensor.
Take a deep breath slowly breathe out. Mmm isn't it wonderful? All that air around us, which we bring into our lungs, extracts oxygen from and then breathes out carbon...
In Stock
Angled of of JST SH 4-Pin Cable.
This 4-wire cable is 50mm / 1.9" long and fitted with JST SH female 4-pin connectors on both ends. Compared with the chunkier JST PH these are 1mm pitch instead of 2mm, but...
In Stock
2 x M2.5x5mm Screws
QTPY mount Screws M2.5x5mm
2 x M2.5x8mm Screws
Wall hook Screws M2.5x8mm
4 x M3x5mm Screws
Sensor Screws M3x5mm
1 x M2x12mm Screws
Servo Screws M2x12mm

The wiring diagram below provides a visual reference for connecting the components. It is not true to scale, it is just meant to be used as reference. This diagrams was created using the Fritzing software package.

Take a moment to review the components in the circuit diagram. This illustration is meant for referencing wired connections - the length of wire, position and size of components are not exact. 

Wired Connections


  • Red wire to 5V on QT Py
  • Black wire to GND on QT Py
  • Yellow wire to pin A1 on QT Py


  • Stemma port to Stemma port on QT Py
The WipperSnapper firmware and ecosystem are in BETA and are actively being developed to add functionality, more boards, more sensors, and fix bugs. We encourage you to try out WipperSnapper with the understanding that it is not final release software and is still in development. If you encounter any bugs, glitches, or difficulties during the beta period, or with this guide, please contact us via

What is WipperSnapper

WipperSnapper is a firmware designed to turn any WiFi-capable board into an Internet-of-Things device without programming a single line of code. WipperSnapper connects to Adafruit IO, a web platform designed (by Adafruit!) to display, respond, and interact with your project's data.

Simply load the WipperSnapper firmware onto your board, add credentials, and plug it into power. Your board will automatically register itself with your Adafruit IO account.

From there, you can add components to your board such as buttons, switches, potentiometers, sensors, and more! Components are dynamically added to hardware, so you can immediately start interacting, logging, and streaming the data your projects produce without writing code.

Sign up for

You will need an Adafruit IO account to use WipperSnapper on your board. If you do not already have one, head over to to create a free account.

Install USB Driver

Install CP2104 / CP2102N USB Driver

Many ESP32 boards have a USB-to-Serial converter that talks to the chip itself, and will need a driver on your computer's operating system. The driver is available for Mac, Windows, and Linux.

Install CH9102 / CH34X USB Driver

Newer ESP32 boards have a different USB-to-serial converter that talks to the chip itself, and will need a driver on your computer's operating system. The driver is available for Mac and Windows. It is already built into Linux.

If you would like more detail, check out the guide on installing these drivers.

Add a New Device to Adafruit IO

Log into your Adafruit IO account. Click the New Device button at the top of the page.

After clicking New Device, you should be on the board selector page. This page displays every board that is compatible with the WipperSnapper firmware.

In the board selector page's search bar, search for the QT Py ESP32 Pico. Once you've located the board you'd like to install WipperSnapper on, click the Choose Board button to bring you to the self-guided installation wizard.

Follow the step-by-step instructions on the page to install Wippersnapper on your device and connect it to Adafruit IO.

If the installation was successful, a popover should appear displaying that your board has successfully been detected by Adafruit IO.

Give your board a name and click "Continue to Device Page".

You should be brought to your board's device page.

Next, Visit this guide's WipperSnapper Essentials pages to learn how to interact with your board using Adafruit IO.

Feedback WipperSnapper is in beta and you can help improve it!

If you have  suggestions or general feedback about the installation process - visit, click "Contact Adafruit IO Support" and select "I have feedback or suggestions for the WipperSnapper Beta".


If you encountered an issue during installation, please try the steps below first.

If you're still unable to resolve the issue, or if your issue is not listed below, get in touch with us directly at Make sure to click  "Contact Adafruit IO Support" and select "There is an issue with WipperSnapper. Something is broken!"

I don't see my board on Adafruit IO, it is stuck connecting to WiFi

First, make sure that you selected the correct board on the board selector.

Next, please make sure that you entered your WiFi credentials properly, there are no spaces/special characters in either your network name (SSID) or password, and that you are connected to a 2.4GHz wireless network.

If you're still unable to connect your board to WiFi, please make a new post on the WipperSnapper technical support forum with the error you're experiencing, the LED colors which are blinking, and the board you're using.

I don't see my board on Adafruit IO, it is stuck "Registering with Adafruit IO"

Try hard-resetting your board by unplugging it from USB power and plugging it back in.

If the error is still occurring, please make a new post on the WipperSnapper technical support forum with information about what you're experiencing, the LED colors which are blinking (if applicable), and the board you're using.

"Uninstalling" WipperSnapper 

WipperSnapper firmware is an application that is loaded onto your board. There is nothing to "uninstall". However, you may want to "move" your board from running WipperSnapper to running Arduino or CircuitPython. You also may need to restore your board to the state it was shipped to you from the Adafruit factory. 

Moving from WipperSnapper to CircuitPython

Follow the steps on the Installing CircuitPython page to install CircuitPython on your board running WipperSnapper.

  • If you are unable to double-tap the RST button to enter the UF2 bootloader, follow the "Factory Resetting a WipperSnapper Board" instructions below.

Uploading this sketch will overwrite WipperSnapper. If you want to re-install WipperSnapper, follow the instructions at the top of this page.

Moving from WipperSnapper to Arduino

If you want to use your board with Arduino, you will use the Arduino IDE to load any sketch onto your board.

First, follow the page below to set up your Arduino IDE environment for use with your board.

Then, follow the page below to upload the "Arduino Blink" sketch to your board.

Uploading this sketch will overwrite WipperSnapper. If you want to re-install WipperSnapper, follow the instructions at the top of this page.

Factory Resetting a WipperSnapper Board

Sometimes, hardware gets into a state that requires it to be "restored" to the original state it shipped in. If you'd like to get your board back to its original factory state, follow the guide below.

Ok - you've connected your board to WipperSnapper. Now what?

This page will give you a quick tour of Adafruit IO WipperSnapper and its core features.

WipperSnapper Device List

The Device List page provides a list of the devices you've connected to Adafruit IO WipperSnapper along with their connection status.

Think of it as a virtual inventory for your boards! 

You can visit this page at any time by navigating to

Wippersnapper Device Page

Clicking on a device from the Devices List page will bring you to its device page. This page is an interface to configure and interact with anything physically connected to your device.

You may think of it as the state of your device at any given time. 

When you register a device for the first time, this page will be empty, it's a clean slate!

WipperSnapper Components 

A "component" in WipperSnapper denotes anything which is physically connected to your hardware.

This can include sensors, buttons, LEDs, NeoPixels, displays, and more!

When you click New Component, your hardware will automatically connect to and configure the component using the settings you specified. No coding required! 

Additionally, a component also sets up a unique Adafruit IO feed to store the component's data stream on the web.

Do I need to set up my components every time I use WipperSnapper?

Nope! WipperSnapper remembers each component's configuration for each of your boards. The "state" of your board's configuration is saved to its device page.

When you re-connect a board to WipperSnapper, it will automatically re-configure every component listed on the Device Page. The most recent value stored on each component's feed will be sent to the device.

I do not see my the component I want to use listed in the component picker pop-up

We're actively working towards adding more components and component types to Adafruit Wippersnapper.

We also gladly take community contributions to Adafruit IO - You can add your own component by following this guide.

Set up Reactive Actions


After setting up the board and sensor component, click on the Action link on the top Nav bar.

On the Action page, select the +New Action button to add a new reactive action. 

Define reaction settings

If: The first section will list the board and sensor.

Is: Readings greater or equal to 1000ppm 

Then: publish a message to

Feed: Servo from choose board

With: 2200 Position (down)

Limit: read every 10 secs

To bring the Bird back to life (rotate up) follow the settings below:

If: The first section will list the board and sensor.

Is: Readings less or equal to 1000ppm 

Then: publish a message to

Feed: Servo from choose board

With: 500 Position (up)

Limit: read every 10 secs

Test Position 

Click on your board on the device page.

The slider for the Servo component will allow you to test the settings for rotating the bird.

Parts List

STL files for 3D printing are oriented to print "as-is" on FDM style machines. Parts are designed to 3D print without any support material. Original design source may be downloaded using the links below.

Slice with settings for PLA material 

The parts were sliced using CURA using the slice settings below.

  • PLA filament 220c extruder
  • 0.2 layer height
  • 10% gyroid infill
  • 60mm/s print speed
  • 60c heated bed


  • Support Extrusion Width: .2
  • Support Density: 4%
  • Support Overhang Angle: 50
  • Support Z Height: .21
  • Interface: On
  • Support Roof: On
  • Support Pattern: Zig Zag

Build Plate Adhesion

  • Type: skirt
  • Line Count: 8

Mount QTPY

Angle one side of the QT Py board at an angle. The board snap fits into the corners.

Attach Servo holder

Align the servo holder, as shown, to the screw holes on the QT Py mount.

Use two M2.5x5mm screws to attach the parts.

Assemble sensor mount

Align the inner screw mounts to the screw mounts on servo holder.

Use two M2.5x5mm screws to secure.

Attach sensor

The SCD40/41 sensor is secured with two or four M3x5mm screws.

Press fit servo

Align the wire to the cutout on the servo holder. Slide the servo into the holder with the shaft facing outward. 

Connect Sensor 

Use a short Stemma cable to connect the sensor to the QT Py.

Attach Servo


Solder the servo to the QT Py directly or by adding short female headers with jumper cables for a modular build.  

Attach lid


Fit the cutout on the lid to the shape of the servo housing. 

Use M2x12mm screws to attach the servo to the lid.

Slide the lid assembly inside the case. Align the sensor to the center square cutout on the case.

Press fit the snaps on the case to the snaps on the lid to securely attach. 

Attach wall hook


Use M2.5x8mm screws to attach the wall hook to the back of the case.


Assemble wings


Lay the bird on top of the wing with a nub. Place the wing with a hole on top of the bird. Use heat to soften the tip of the nub. Use a small spatula to flatten the nub. This will create a rivet to secure the wings together. 

Attach bird horn


First set the servo position to "up". Align and press fit the bird "horn" to the servo shaft. 


This guide was first published on Sep 20, 2022. It was last updated on May 13, 2024.