# FunHouse IoT Fume Extractor and Air Quality Sensor

## Overview

https://youtu.be/3rwHkWDBnlA

https://youtu.be/B5svMzlKLrY

## Smart Fume Extractor

Build a smart DIY fume extractor with an Adafruit FunHouse and CircuitPython. Use a PWM fan and the EMC2101 controller to change the speed based on readings from an SPG30 air quality sensor.

![3d_printing_hero-desk-angle.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/563/medium640/3d_printing_hero-desk-angle.jpg?1622732218)

## Adafruit IO & Data Logging

Use CircuitPython libraries and ESP32-S2 to connect to WiFi and log sensor data to a feed and display it on a dashboard with Adafruit IO. Use the FunHouse's built-in TFT to display bitmap graphics with fan speed and air quality. Use the built-in buttons to select options like choosing to log data. CircuitPython makes it easy to customize features, experiment with other hardware and quickly iterate.

![3d_printing_hero-display.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/564/medium640/3d_printing_hero-display.jpg?1622732238)

![3d_printing_hero-sensor.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/654/medium640/3d_printing_hero-sensor.jpg?1622852104)

## Fun Features

The electronics are housed in a 3D printed enclosure that snap fits together. Use a carbon activated filter to adsorb smoke from solder fumes. The fan controller and air quality sensor are connect with STEMMA QT cables for a plug-and-play circuit. A mini fan mounted in front of the air quality sensor directs fumes for sampling and measuring. The ports on the FunHouse make it easy to power 5V peripheral.

![3d_printing_hero-side.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/653/medium640/3d_printing_hero-side.jpg?1622852035)

![3d_printing_hero-back.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/655/medium640/3d_printing_hero-back.jpg?1622852134)

![](https://cdn-learn.adafruit.com/assets/assets/000/102/562/medium800/3d_printing_hero-desk.jpg?1622732184)

## Parts
Parts to build this project.

- [FunHouse ESP32-S2](https://www.adafruit.com/product/4985)
- [Noctua PWM Fan - 140mm](https://www.amazon.com/dp/B07DXR1Y73)
- [5V Mini Fan](https://www.adafruit.com/product/3368)
- [EMC12101 PWM Fan Controller](https://www.adafruit.com/product/4808)
- [SGP30 Air Quality Sensor](https://www.adafruit.com/product/3709)
- [STEMMA QT Cable - 200mm](https://www.adafruit.com/product/4401)
- [STEMMA QT Cable - 100mm](https://www.adafruit.com/product/4210)
- [Carbon Filter](https://www.adafruit.com/product/3836)
- [M2.5 Hardware Kit](https://www.adafruit.com/product/3299)
- [M3 Hardware Kit](https://www.adafruit.com/product/4685)

![3d_printing_parts.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/581/medium640/3d_printing_parts.jpg?1622747324)

### Adafruit FunHouse - WiFi Home Automation Development Board

[Adafruit FunHouse - WiFi Home Automation Development Board](https://www.adafruit.com/product/4985)
Home is where the heart is...it's also where we keep all our electronic bits. So why not wire it up with sensors and actuators to turn our house into an electronic wonderland. Whether it's tracking the environmental temperature and humidity in your laundry room, or notifying you when...

Out of Stock
[Buy Now](https://www.adafruit.com/product/4985)
[Related Guides to the Product](https://learn.adafruit.com/products/4985/guides)
![Top-down video of Adafruit Funhouse PCB. The TFT display shows a data readout, and the NeoPixel LEDs glow rainbow colors.](https://cdn-shop.adafruit.com/product-videos/640x480/4985-00.jpg)

### Miniature 5V Cooling Fan for Raspberry Pi (and Other Computers)

[Miniature 5V Cooling Fan for Raspberry Pi (and Other Computers)](https://www.adafruit.com/product/3368)
Looking for another way to keep your [Raspberry Pi](https://www.adafruit.com/products/3055)&nbsp;_cool_? Hook up this&nbsp; **5V Mini Cooling Fan** &nbsp;and prevent your hard-working Pi from overheating! Of course, it's also great for use with any small...

In Stock
[Buy Now](https://www.adafruit.com/product/3368)
[Related Guides to the Product](https://learn.adafruit.com/products/3368/guides)
![Miniature 5V Cooling Fan for Raspberry Pi and Other Computers](https://cdn-shop.adafruit.com/640x480/3368-00.jpg)

### Adafruit EMC2101 I2C PC Fan Controller and Temperature Sensor

[Adafruit EMC2101 I2C PC Fan Controller and Temperature Sensor](https://www.adafruit.com/product/4808)
Cooling fans...They're everywhere, and they serve the important purpose of keeping things cool, generally electronics. One might rightfully think: "these fans are pretty good at moving air to keep things cool; maybe I can use one of these neat computer fans to keep my widget...

Out of Stock
[Buy Now](https://www.adafruit.com/product/4808)
[Related Guides to the Product](https://learn.adafruit.com/products/4808/guides)
![Adafruit EMC2101 I2C PC Fan Controller and Temperature Sensor wired up to Feather with OLED wing and a PC fan. A hand slows down the fan and the RPM display decreases. ](https://cdn-shop.adafruit.com/product-videos/640x480/4808-05.jpg)

### Adafruit SGP30 Air Quality Sensor Breakout - VOC and eCO2

[Adafruit SGP30 Air Quality Sensor Breakout - VOC and eCO2](https://www.adafruit.com/product/3709)
Breathe easy with the SGP30 Multi-Pixel Gas Sensor, a fully integrated MOX gas sensor. This is a very fine air quality sensor from the sensor experts at Sensirion, with I2C interfacing and fully calibrated output signals with a typical accuracy of 15% within...

Out of Stock
[Buy Now](https://www.adafruit.com/product/3709)
[Related Guides to the Product](https://learn.adafruit.com/products/3709/guides)
![Angled shot of a Adafruit SGP30 Air Quality Sensor Breakout.](https://cdn-shop.adafruit.com/640x480/3709-07.jpg)

### Carbon Filter for Solder Smoke Absorption

[Carbon Filter for Solder Smoke Absorption](https://www.adafruit.com/product/3836)
If you do a lot of soldering&nbsp;indoors, a **Carbon Filter** is essential for absorbing that solder smoke and leaving your air smelling fresh.

These measure about 13 x 13cm but are easy to trim&nbsp;with scissors or a utility knife. It took us no time to crop one to fit...

Out of Stock
[Buy Now](https://www.adafruit.com/product/3836)
[Related Guides to the Product](https://learn.adafruit.com/products/3836/guides)
![Black spongy Carbon Filter](https://cdn-shop.adafruit.com/640x480/3836-00.jpg)

### Black Nylon Machine Screw and Stand-off Set – M3 Thread

[Black Nylon Machine Screw and Stand-off Set – M3 Thread](https://www.adafruit.com/product/4685)
Totaling **420 pieces** , this **M3 Screw Set** &nbsp;is a must-have for your workstation.&nbsp;You'll have enough screws, nuts, and hex standoffs to fuel your maker tendencies&nbsp;for days on end! M3 size screws fit a number of&nbsp;Adafruit breakout/dev board...

In Stock
[Buy Now](https://www.adafruit.com/product/4685)
[Related Guides to the Product](https://learn.adafruit.com/products/4685/guides)
![Opened box showing many nylon screws](https://cdn-shop.adafruit.com/640x480/4685-01.jpg)

### Black Nylon Machine Screw and Stand-off Set – M2.5 Thread

[Black Nylon Machine Screw and Stand-off Set – M2.5 Thread](https://www.adafruit.com/product/3299)
Totaling 380 pieces, this **M2.5 Screw Set** &nbsp;is a must-have for your workstation.&nbsp;You'll have enough screws, nuts, and hex standoffs to fuel your maker tendencies&nbsp;for days on end! M2.5 size screws fit almost all of the Adafruit breakout/dev board mounting holes...

In Stock
[Buy Now](https://www.adafruit.com/product/3299)
[Related Guides to the Product](https://learn.adafruit.com/products/3299/guides)
![Black Nylon Screw and Stand-off Set with M2.5 Threads, kit box](https://cdn-shop.adafruit.com/640x480/3299-00.jpg)

### STEMMA QT / Qwiic JST SH 4-Pin Cable - 200mm Long

[STEMMA QT / Qwiic JST SH 4-Pin Cable - 200mm Long](https://www.adafruit.com/product/4401)
This 4-wire cable is a little over 200mm / 7.8" 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 still have a nice latching feel, while being easy to insert and remove.

<a...></a...>

In Stock
[Buy Now](https://www.adafruit.com/product/4401)
[Related Guides to the Product](https://learn.adafruit.com/products/4401/guides)
![Angled shot of JST SH 4-Pin Cable - 200mm Long.](https://cdn-shop.adafruit.com/640x480/4401-04.jpg)

### STEMMA QT / Qwiic JST SH 4-pin Cable - 100mm Long

[STEMMA QT / Qwiic JST SH 4-pin Cable - 100mm Long](https://www.adafruit.com/product/4210)
This 4-wire cable is a little over 100mm / 4" 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 still have a nice latching feel, while being easy to insert and remove.

<a...></a...>

Out of Stock
[Buy Now](https://www.adafruit.com/product/4210)
[Related Guides to the Product](https://learn.adafruit.com/products/4210/guides)
![Angled shot of STEMMA QT / Qwiic JST SH 4-pin Cable.](https://cdn-shop.adafruit.com/640x480/4210-00.jpg)

### Part: Noctua PWM Fan
quantity: 1
140mm Noctua PWM Fan
[Noctua PWM Fan](https://www.amazon.com/dp/B07DXR1Y73)

# FunHouse IoT Fume Extractor and Air Quality Sensor

## CircuitPython

[CircuitPython](https://github.com/adafruit/circuitpython)&nbsp;is a derivative of&nbsp;[MicroPython](https://micropython.org/)&nbsp;designed to simplify experimentation and education on low-cost microcontrollers. It makes it easier than ever to get prototyping by requiring no upfront desktop software downloads. Simply copy and edit files on the&nbsp; **CIRCUITPY** &nbsp;drive to iterate.

## Set Up CircuitPython

Follow the steps to get CircuitPython installed on your FunHouse.

[Download the latest CircuitPython for your board from circuitpython.org](https://circuitpython.org/board/adafruit_funhouse/)
 **Click the link above and download the latest .BIN and .UF2 file**

(depending on how you program the ESP32S2 board you may need one or the other, might as well get both)

Download and save it to your desktop (or wherever is handy).

![sensors_Download_Firmware.png](https://cdn-learn.adafruit.com/assets/assets/000/101/512/medium640/sensors_Download_Firmware.png?1618531628)

Plug your FunHouse into your computer using a known-good USB cable.

**A lot of people end up using charge-only USB cables and it is very frustrating! So make sure you have a USB cable you know is good for data sync.**

![sensors_4985-06.jpg](https://cdn-learn.adafruit.com/assets/assets/000/101/513/medium640/sensors_4985-06.jpg?1618531771)

## Option 1 - Load with UF2 Bootloader

This is by far the easiest way to load CircuitPython.&nbsp;**However it requires your board has the UF2 bootloader installed. Some early boards do not (we hadn't written UF2 yet!) - in which case you can load using the built in ROM bootloader.**

Still, try this first!

### Try Launching UF2 Bootloader

Loading CircuitPython by drag-n-drop UF2 bootloader is the easier way and we recommend it.

![sensors_Boot_Mode.jpg](https://cdn-learn.adafruit.com/assets/assets/000/101/514/medium640/sensors_Boot_Mode.jpg?1618534416)

Launch UF2 by&nbsp; **double-clicking** &nbsp;the Reset button (the one next to the USB C port). You may have to try a few times to get the timing right.

**About a half second pause between clicks while the DotStars are purple seems to work well.**

![sensors_Press_Reset.jpg](https://cdn-learn.adafruit.com/assets/assets/000/101/519/medium640/sensors_Press_Reset.jpg?1618586167)

If the UF2 bootloader is installed, you will see a new disk drive appear called&nbsp; **HOUSEBOOT**

![sensors_Windows_Drives.png](https://cdn-learn.adafruit.com/assets/assets/000/101/521/medium640/sensors_Windows_Drives.png?1618588909)

Copy the&nbsp; **UF2** &nbsp;file you downloaded at the first step of this tutorial onto the&nbsp; **HOUSEBOOT** &nbsp;drive

![sensors_Windows_Drag_Firmware.png](https://cdn-learn.adafruit.com/assets/assets/000/101/522/medium640/sensors_Windows_Drag_Firmware.png?1618589080)

If you're using Windows and you get an error at the end of the file copy that says&nbsp; **Error from the file copy, Error 0x800701B1: A device which does not exist was specified.&nbsp;** You can ignore this error, the bootloader sometimes disconnects without telling Windows, the install completed just fine and you can continue. [If its really annoying, you can also upgrade the bootloader (the latest version of the UF2 bootloader fixes this warning)](https://learn.adafruit.com/adafruit-funhouse/install-uf2-bootloader)

Your board should auto-reset into CircuitPython, or you may need to press reset. A&nbsp; **CIRCUITPY** &nbsp;drive will appear. You're done! Go to the next pages.

![sensors_Windows_CircuitPy.png](https://cdn-learn.adafruit.com/assets/assets/000/101/523/medium640/sensors_Windows_CircuitPy.png?1618589269)

## Option 2 - Use Chrome Browser To Upload BIN file
Warning: 

The next best option is to try using the Chrome-browser version of esptool we have written. This is handy if you don't have Python on your computer, or something is really weird with your setup that makes esptool not run (which happens sometimes and isn't worth debugging!) You can follow along on the&nbsp;[Install UF2 Bootloader](https://learn.adafruit.com/adafruit-funhouse/install-uf2-bootloader)&nbsp;page and either load the UF2 bootloader and then come back to Option 1 on this page, or you can download the CircuitPython BIN file directly using the tool in the same manner as the bootloader.

## Option 3 - Use esptool to load BIN file

For more advanced users, you can upload with&nbsp; **esptool** &nbsp;to the ROM (hardware) bootloader instead!

Follow the initial steps found in the&nbsp;[Run esptool and check connection section of the Install UF2 Bootloader page](https://learn.adafruit.com/adafruit-funhouse/install-uf2-bootloader)&nbsp;to verify your environment is set up, your board is successfully connected, and which port it's using.

**In the final command to write a binary file to the board, replace the port with your port, and replace "firmware.bin" with the the file you downloaded above.**

The output should look something like the output in the image.

![sensors_adafruit_products_Metro_ESP32_S2_binary_install.png](https://cdn-learn.adafruit.com/assets/assets/000/101/524/medium640/sensors_adafruit_products_Metro_ESP32_S2_binary_install.png?1618589586)

Press reset to exit the bootloader.

Your&nbsp; **CIRCUITPY** &nbsp;drive should appear!

You're all set! Go to the next pages.

![sensors_adafruit_products_Metro_ESP32_S2_CIRCUITPY.png](https://cdn-learn.adafruit.com/assets/assets/000/101/525/medium640/sensors_adafruit_products_Metro_ESP32_S2_CIRCUITPY.png?1618589627)

# FunHouse IoT Fume Extractor and Air Quality Sensor

## Code the FunHouse Fume Extractor

## Installing Project Code

To use with CircuitPython, you need to first install a few libraries, into the lib folder on your **CIRCUITPY** drive. Then you need to update **code.py** with the example script.

Thankfully, we can do this in one go. In the example below, click the **Download Project Bundle** button below to download the necessary libraries and the **code.py** file in a zip file. Extract the contents of the zip file, open the directory **FunHouse\_Fume\_Extractor/** and then click on the directory that matches the version of CircuitPython you're using and copy the contents of that directory to your **CIRCUITPY** drive.

Your **CIRCUITPY** drive should now look similar to the following image:

![CIRCUITPY](https://adafruit.github.io/Adafruit_Learning_System_Guides/FunHouse_Fume_Extractor.png )

https://github.com/adafruit/Adafruit_Learning_System_Guides/blob/main/FunHouse_Fume_Extractor/code.py

# FunHouse IoT Fume Extractor and Air Quality Sensor

## Adafruit IO Setup

Before you begin logging your fume extractor data, you need to do some setup in Adafruit IO.

First, check out [this Learn guide](https://learn.adafruit.com/welcome-to-adafruit-io/getting-started-with-adafruit-io) if you've never used Adafruit IO before to see how to get started.

## Creating the Feeds
For this project you'll need two feeds: **fumes** and **fan-speed**.

Go to **Feeds** and then click on **+ New Feed**.

![3d_printing_newFeed.png](https://cdn-learn.adafruit.com/assets/assets/000/102/669/medium640/3d_printing_newFeed.png?1623084549)

Name the feed **"fumes"** and then click Create.

Repeat this process to create the **"fan-speed"** feed.

![3d_printing_fumesFeed.png](https://cdn-learn.adafruit.com/assets/assets/000/102/670/medium640/3d_printing_fumesFeed.png?1623084587)

Afterwards, you should see both feeds in your list.

![3d_printing_feedsInList.png](https://cdn-learn.adafruit.com/assets/assets/000/102/671/medium640/3d_printing_feedsInList.png?1623084639)

## Creating the Dashboard
Go to **Dashboards** and then click on **+ New Dashboard**.

![3d_printing_newDashboard.png](https://cdn-learn.adafruit.com/assets/assets/000/102/672/medium640/3d_printing_newDashboard.png?1623084696)

Name the dashboard and then click **Create**.

![3d_printing_nameDashboard.png](https://cdn-learn.adafruit.com/assets/assets/000/102/673/medium640/3d_printing_nameDashboard.png?1623084790)

Click on the dashboard to add the feeds.

![3d_printing_clickDashboard.png](https://cdn-learn.adafruit.com/assets/assets/000/102/674/medium640/3d_printing_clickDashboard.png?1623084855)

## Adding the Feeds to Your Dashboard
On your dashboard page, click on the **cog wheel** on the right-hand side of the screen. Then click **+ Create New Block**.

![3d_printing_createNewBlock.png](https://cdn-learn.adafruit.com/assets/assets/000/102/675/medium640/3d_printing_createNewBlock.png?1623084910)

Click on the **Line Chart** block, outlined in red in the picture.

![3d_printing_newBlockLine.png](https://cdn-learn.adafruit.com/assets/assets/000/102/677/medium640/3d_printing_newBlockLine.png?1623085123)

Check-off the **fumes** feed.

![3d_printing_fumesChecked.png](https://cdn-learn.adafruit.com/assets/assets/000/102/678/medium640/3d_printing_fumesChecked.png?1623085165)

Then click **Next step**.

![3d_printing_nextStep.png](https://cdn-learn.adafruit.com/assets/assets/000/102/679/medium640/3d_printing_nextStep.png?1623085212)

Name the block and then click **Create block**.

![3d_printing_createBlock.png](https://cdn-learn.adafruit.com/assets/assets/000/102/680/medium640/3d_printing_createBlock.png?1623085257)

Repeat this process for the **fan-speed** feed. Afterwards, you should have two line chart blocks on your dashboard for both feeds.

![](https://cdn-learn.adafruit.com/assets/assets/000/102/681/medium800/3d_printing_fumesDashboard.png?1623085291)

# FunHouse IoT Fume Extractor and Air Quality Sensor

## CircuitPython Code Walkthrough

## Libraries
The code begins by importing the libraries.

```python
import time
import board
import simpleio
import adafruit_sgp30
import displayio
import adafruit_imageload
from adafruit_emc2101 import EMC2101
from adafruit_funhouse import FunHouse
```

## STEMMA Sensor Setup
Next, I2C and the two STEMMA sensors, the **SGP30** and **EMC2101** , are setup.

```python
i2c = board.I2C()

#  setup for SGP30 sensor
sgp30 = adafruit_sgp30.Adafruit_SGP30(i2c)
#  setup for fan controller
emc = EMC2101(i2c)

print("SGP30 serial #", [hex(i) for i in sgp30.serial])

#SGP30 start-up
sgp30.iaq_init()
sgp30.set_iaq_baseline(0x8973, 0x8AAE)
```

[For more information on the Adafruit SGP30 TVOC/eCO2 Gas Sensor, check out this Learn guide](https://learn.adafruit.com/adafruit-sgp30-gas-tvoc-eco2-mox-sensor)
[For more information on the EMC2101 Fan Controller and Temperature Sensor, check out this Learn guide](https://learn.adafruit.com/emc2101-fan-controller-and-temperature-sensor)
## Graphics
The `adafruit_funhouse` library has a `FunHouse` object that can be used for `displayio`.

Following that import, the five bitmaps are setup with `displayio`. There are three background images that will be shown depending on where you are in the code. The remaining two bitmaps are icons to show whether or not you are sending data to Adafruit IO.&nbsp;

```python
#  FunHouse setup
funhouse = FunHouse(default_bg=0x0F0F00)
#  start-up bitmap
bitmap, palette = adafruit_imageload.load("/scene1_fume.bmp",
                                         bitmap=displayio.Bitmap,
                                         palette=displayio.Palette)
tile_grid = displayio.TileGrid(bitmap, pixel_shader=palette)
#  connecting bitmap
bitmap2, palette2 = adafruit_imageload.load("/scene2_fume.bmp",
                                         bitmap=displayio.Bitmap,
                                         palette=displayio.Palette)
grid2 = displayio.TileGrid(bitmap2, pixel_shader=palette2)
#  default background
bitmap3, palette3 = adafruit_imageload.load("/scene3_fume.bmp",
                                         bitmap=displayio.Bitmap,
                                         palette=displayio.Palette)
grid3 = displayio.TileGrid(bitmap3, pixel_shader=palette3)
#  internet connection icon
bitmap4, palette4 = adafruit_imageload.load("/connect_icon.bmp",
                                         bitmap=displayio.Bitmap,
                                         palette=displayio.Palette)
icon1 = displayio.TileGrid(bitmap4, pixel_shader=palette4, x = 2, y = 2)
#  red x icon
bitmap5, palette5 = adafruit_imageload.load("/x_icon.bmp",
                                         bitmap=displayio.Bitmap,
                                         palette=displayio.Palette)
icon2 = displayio.TileGrid(bitmap5, pixel_shader=palette5, x = 2, y = 2)
```

Following the bitmap imports, a display `group` is setup and the first bitmap is added to the `group`. Then two text objects are created, `fume_text` and `fan_text`, that will display the data output from the SGP30 and EMC2101 sensors.

```python
#  display group
group = displayio.Group()
#  adding start-up bitmap to group
group.append(tile_grid)
funhouse.graphics.root_group.append(group)
#  text for fume data
fume_text = funhouse.add_text(
    text="    ",
    text_position=(110, 90),
    text_anchor_point=(0.5, 0.5),
    text_color=0xf57f20,
    text_font="fonts/Arial-Bold-24.pcf",
)
#  text for fan RPM data
fan_text = funhouse.add_text(
    text="    ",
    text_position=(110, 165),
    text_anchor_point=(0.5, 0.5),
    text_color=0x7fffff,
    text_font="fonts/Arial-Bold-24.pcf",
)
#  showing graphics
funhouse.display.root_group = funhouse.graphics.root_group
```

## State Machines and Variables
A few state machines and variables are setup for use in the loop. Their functions are commented below.

```python
#  state machines
run = False #  state if main code is running
connected = False #  checks if connected to wifi
start_up = False #  state for start-up
clock = 0 #  time.monotonic() device
```

## Adafruit IO Functions
Two functions are created to send data to Adafruit IO. `send_fume_data()` sends data from the SGP30 and `send_fan_data()` sends data from the ECM2101.

For these functions to work properly, you need to have feeds setup in Adafruit IO called "`fumes`" and "`fan-speed`". Be sure to follow the steps on the [Adafruit IO Setup page](https://learn.adafruit.com/funhouse-fume-extractor/adafruit-io-setup) in this guide.

```python
#  function for sending fume data to adafruit.io
def send_fume_data(solder_fumes):
    funhouse.network.push_to_io("fumes", solder_fumes)

#  function for sending fan rpm to adafruit.io
def send_fan_data(fan_rpm):
    funhouse.network.push_to_io("fan-speed", fan_rpm)
```

## The Loop
The loop begins by checking if the main program is running with the `run` state. If the main program is not running, then the start-up graphic is shown on the FunHouse and you need to press either the middle or bottom button to begin the fume extraction. The buttons determine whether or not you connect to WiFi and send your fume data to Adafruit IO

![](https://cdn-learn.adafruit.com/assets/assets/000/102/682/medium800/3d_printing_scene1_fume.bmp?1623085933)

## Pressing the Down Button (Not Connecting to WiFi)
If you press the down button, the start-up bitmap is removed from `group` and the main program bitmap is added to `group` for display. Additionally, the red x icon is also added to `group` to show that you are not connected to WiFi. Finally, `run` is set to `True` so that the fume extraction and data display can begin.

```python
#  if you press the down button
        if funhouse.peripherals.button_down:
            print("run")
            #  remove start-up bitmap
            group.remove(tile_grid)
            #  add main bitmap
            group.append(grid3)
            #  add red x icon to show not connected to internet
            group.append(icon2)
            #  change state for main program
            run = True
```

## Pressing the Select Button (Connecting to WiFi)
If you press the select button (in the middle of the FunHouse's three buttons), the start-up bitmap is removed from `group` and the "connecting..." bitmap is added to group.

![3d_printing_scene2_fume.bmp](https://cdn-learn.adafruit.com/assets/assets/000/102/684/medium640/3d_printing_scene2_fume.bmp?1623086034)

Then, the function `funhouse.network.connect()` is called. This connects the FunHouse to WiFi.&nbsp;

After a network connection has been established, the `start_up` state is set to `True` and `clock` is reset with `time.monotonic()`.

```python
#  if you press the middle button
        if funhouse.peripherals.button_sel:
            #  remove start-up bitmap
            group.remove(tile_grid)
            #  add connecting... bitmap
            group.append(grid2)
            #  connect to the network
            funhouse.network.connect()
            print("connecting")
            #  change state for network
            connected = True
            #  start main program
            start_up = True
            #  start time.monotonic()
            clock = time.monotonic()
```

The start-up state exists so that after the FunHouse connects to WiFi, the connecting graphic can be removed from `group` and replaced with the main graphic. Additionally, the internet icon is added to show that you're sending data to Adafruit IO. Finally, `run` is set to `True`.

```python
#  after connecting to the internet
        if start_up:
            #  remove connecting bitmap
            group.remove(grid2)
            #  add main bitmap
            group.append(grid3)
            #  add internet icon
            group.append(icon1)
            #  start main program
            run = True
            #  reset start-up state
            start_up = False
```

![](https://cdn-learn.adafruit.com/assets/assets/000/102/685/medium800/3d_printing_scene3_fume.bmp?1623086062)

## The Main Program
The main program takes readings from the SGP30 to affect the fan's RPM speed. This is done with the `simpleio.map_range()` function. You can either use the SGP30's eCO2 readings or TVOC readings. You'll just need to comment and uncomment certain lines to change this.

The data from the SGP30's readings and the fan's RPM are updated for the `fume_text` and `fan_text` objects to display on the screen.&nbsp;

```python
#  fumes variable for reading from SGP30
        #  comment out either TVOC or eCO2 depending on data preference
        fumes = sgp30.TVOC
        #  fumes = sgp30.eCO2

        #  mapping fumes data to fan RPM
        #  value for TVOC
        mapped_val = simpleio.map_range(fumes, 10, 1000, 10, 100)
        #  value for eCO2
        #  mapped_val = simpleio.map_range(fumes, 400, 2500, 10, 100)

        #  adding fume text
        #  PPB is for TVOC, PPM is for eCO2
        funhouse.set_text("%d PPB" % fumes, fume_text)
        #  funhouse.set_text("%d PPM" % fumes, fume_text)

        #  adding fan's RPM text
        funhouse.set_text("%d%s" % (mapped_val, "%"), fan_text)
        #  printing fan's data to the REPL
        print("fan = ", mapped_val)
        #  setting fan's RPM
        emc.manual_fan_speed = int(mapped_val)
```

## Sending Data to Adafruit IO
Every fifteen seconds, the data from the SGP30 and EMC2101 are sent to feeds on Adafruit IO. After the data is sent, `clock` is reset with `time.monotonic()`.

```python
#  if you're connected to wifi and 15 seconds has passed
        if connected and ((clock + 15) &lt; time.monotonic()):
            #  send fume data to adafruit.io
            send_fume_data(fumes)
            #  send fan RPM to adafruit.io
            send_fan_data(mapped_val)
            #  REPL printout
            print("data sent")
            #  reset clock
            clock = time.monotonic()
```

## Connecting and Disconnecting from WiFi
If you decide after booting up the FunHouse that you want to connect or disconnect from WiFi, you can press the up button on the FunHouse next to the icon in the top left corner of the screen.

The connection is affected by changing the `connected` state. The icon also changes to show the connection status visually.

```python
#  if you're connected to wifi and you press the up button
        if connected and funhouse.peripherals.button_up:
            #  the internet icon is removed
            group.remove(icon1)
            #  the red x icon is added
            group.append(icon2)
            #  reset connected state - no longer sending data to adafruit.io
            connected = False
            #  REPL printout
            print("disconnected")
            #  1 second delay
            time.sleep(1)
        #  if you're NOT connected to wifi and you press the up button
        if not connected and funhouse.peripherals.button_up:
            #  the red x icon is removed
            group.remove(icon2)
            #  the internet icon is added
            group.append(icon1)
            #  the connection state is true - start sending data to adafruit.io
            connected = True
            #  REPL printout
            print("connected")
            #  1 second delay
            time.sleep(1)
```

# FunHouse IoT Fume Extractor and Air Quality Sensor

## Circuit Diagram

The diagram below provides a visual reference for wiring of the components. This diagram was created using the software package [Fritzing](http://fritzing.org/download/).

## Adafruit Library for Fritzing

Use Adafruit's Fritzing parts library to create circuit diagrams for your projects. Download the library or just grab individual parts. Get the library and parts from [GitHub - Adafruit Fritzing Parts](https://github.com/adafruit/Fritzing-Library/tree/master/parts).

![](https://cdn-learn.adafruit.com/assets/assets/000/102/656/medium800/3d_printing_circuit-diagram.jpg?1622852223)

## Wired Connections

The Noctua PWM fan and 5V mini fan are powered by the 5V and ground pins on the FunHouse's **A0** and **A1** ports. The FunHouse can be powered by 5V USB hub or 5V 1A USB battery bank.

5V Mini Fan

- Ground to A1 ground
- Voltage to A1 voltage

Noctua Fan

- Wire 1 ground to A0 ground
- Wire 2 voltage to A0 voltage
- Wire 3 tach to TACH on EMC2101
- Wire 4 PWM to FAN on EMC2101

FunHouse

- I2C to EMC2101
- SGP30 to EMC2101

# FunHouse IoT Fume Extractor and Air Quality Sensor

## CAD Files

## 3D Printed 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.

- front-cover.stl
- back-cover.stl
- minifan-cover.stl
- fan-grill.stl
- filter-holder.stl
- sensor-mount.stl
- pcb-mount.stl
- minifan-cover.stl
- frame.stl

![3d_printing_3d-parts.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/582/medium640/3d_printing_3d-parts.jpg?1622748138)

[Download STLs.zip](https://cdn-learn.adafruit.com/assets/assets/000/102/688/original/STLs.zip?1623089275)
[Download CAD-source.zip](https://cdn-learn.adafruit.com/assets/assets/000/102/691/original/CAD-source.zip?1623090086)
## CAD Assembly

The FunHouse is secured to the **pcb-mount** with M3 screws. The **pcb-mount** is attached to the **frame** using M3 screws and hexnuts. The EMC2101 breakout is secured to the **pcb-mount** with M2.5 screws. The 140mm fan is secured to the **back-cover** with M4 screws and hex nuts. The **back-cover** snap fits over the frame. The carbon filter is press fitted into the **front-cover**. The SGP30 sensor is secured to the center of the **sensor-mount** using M2.5 screws and hex nuts. The **sensor-mount** is secured to the front cover using M3 screws and hex nuts. The **front-cover** snap fits over the frame.&nbsp;

![3d_printing_cad-explode.gif](https://cdn-learn.adafruit.com/assets/assets/000/102/457/medium640thumb/3d_printing_cad-explode.jpg?1622229000)

## Slicing Parts

Minimum build volume required 154mm x 154mm. No supports are required. Slice with setting for PLA material.&nbsp;

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

![3d_printing_slice-154mm.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/689/medium640/3d_printing_slice-154mm.jpg?1623089907)

## Slicing Fan Grill

The fan grill mesh is created by using the slicing softwares infill pattern. Set the Top/Bottom layers to 0 and choose your preferred infill settings. Use a minimum of 10% infill. Gyroid patter is used in the screenshot.

![3d_printing_slice-fan-grill.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/690/medium640/3d_printing_slice-fan-grill.jpg?1623089945)

## Design Source Files

The project assembly was designed in Fusion 360. This can be downloaded in different formats like STEP, STL and more. Electronic components like Adafruit's board, displays, connectors and more can be downloaded from the [Adafruit CAD parts GitHub Repo](https://github.com/adafruit/Adafruit_CAD_Parts).

![3d_printing_Adafruit-Funhouse.gif](https://cdn-learn.adafruit.com/assets/assets/000/102/458/medium640thumb/3d_printing_Adafruit-Funhouse.jpg?1622229487)

# FunHouse IoT Fume Extractor and Air Quality Sensor

## Wiring Mini Fan

## Wires for 5V Mini Fan

Use a piece of 2-wire ribbon to connect the 3-pin JST connector to the 5V fan. Use the following wire lengths.

- 2-wire ribbon - 112mm
- 3-pin JST cable - 38mm
- mini fan cable - 38mm

![3d_printing_minifan-wires.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/593/medium640/3d_printing_minifan-wires.jpg?1622826830)

## Wiring JST Cable

Solder the 2-wire ribbon cable to the 3-pin JST cable. Be sure to add heat shrink before soldering!&nbsp;

![3d_printing_minifan-wiring-jst.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/594/medium640/3d_printing_minifan-wiring-jst.jpg?1622826875)

## Wiring Mini 5V Fan Cable

Solder the 2-wire ribbon cable to the cable on the 5V mini fan.&nbsp;

![3d_printing_minifan-wiring-cable.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/595/medium640/3d_printing_minifan-wiring-cable.jpg?1622826911)

## Wired Mini 5V Fan

Double check the ground and voltage wires polarity is correct.

![3d_printing_minifan-wired.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/596/medium640/3d_printing_minifan-wired.jpg?1622826947)

# FunHouse IoT Fume Extractor and Air Quality Sensor

## Wiring Noctua Fan

## Wires fro Noctua Fan

Cut the cable from the fan short and use a piece of 4-wire ribbon cable to connect to the 3-pin JST cable.

- noctua fan cable - 50mm
- noctua fan 4-wire ribbon - 106mm
- noctua fan 3-wire jst - 38mm

![3d_printing_noctua-wires.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/597/medium640/3d_printing_noctua-wires.jpg?1622826999)

## Connect 4-Wire Cable

Solder the 4-wire cable to the wires on the Noctua fan.

![3d_printing_noctua-wiring-4.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/598/medium640/3d_printing_noctua-wiring-4.jpg?1622827123)

## Solder JST Cable

Connect the JST cable to the black and yellow wires on the fan. The ground wire connects to the black wire. The red wire, voltage, connects to the yellow wire on the fan.

![3d_printing_noctua-wiring-jst.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/599/medium640/3d_printing_noctua-wiring-jst.jpg?1622827173)

## Connect EMC2101 to Fan

The remaining wires connect to the Tach and Fan pins on the EMC2101 fan controller.

![3d_printing_noctua-emc2101.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/600/medium640/3d_printing_noctua-emc2101.jpg?1622827201)

## Connect Wires to EMC2101

Solder the fourth wire from the fan to the FAN pin. Connect the third wire from the fan to the TACH pin on the EMC2101 board.

![3d_printing_noctua-wiring-emc2101.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/601/medium640/3d_printing_noctua-wiring-emc2101.jpg?1622827220)

## Wired EMC2101 and Noctua Fan

Double check the connects are solid.

![3d_printing_noctua-emc2101-wired.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/602/medium640/3d_printing_noctua-emc2101-wired.jpg?1622827244)

# FunHouse IoT Fume Extractor and Air Quality Sensor

## Assembly

## Back Cover and Fan

Place the fan grill over the back cover and line up the mounting holes. The Noctua fan is placed over the grill with the cable lined up with the wire cutout.

![3d_printing_backcover-noctua-preinstall.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/613/medium640/3d_printing_backcover-noctua-preinstall.jpg?1622847975)

![3d_printing_backcover-noctua-cable-hole.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/616/medium640/3d_printing_backcover-noctua-cable-hole.jpg?1622848108)

## Secure Fan to Back Cover

Insert M4 screws through the mounting holes while fastening hex nuts. Repeat for the other screws.

- 4x M4 x 10mm
- 4x M4 Hex nuts

![3d_printing_backcover-fan-screws.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/614/medium640/3d_printing_backcover-fan-screws.jpg?1622848061)

![3d_printing_backcover-noctua-screw-install.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/615/medium640/3d_printing_backcover-noctua-screw-install.jpg?1622848087)

## Secured Fan

Double check all of screws are tightly fastened.

![3d_printing_backcover-noctua-screws-installed.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/617/medium640/3d_printing_backcover-noctua-screws-installed.jpg?1622848168)

## Sensor Mount Hardware

Use the following hardware to secure the sensor to the bracket. Insert M2.5 screws through the four inner holes and fasten hex on the other side of the bracket.

- M2.5 x 10mm screws
- 8x M2.5 hex nuts

![3d_printing_sensor-mount-screws.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/618/medium640/3d_printing_sensor-mount-screws.jpg?1622848192)

![3d_printing_sensor-mount-screws-installing.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/619/medium640/3d_printing_sensor-mount-screws-installing.jpg?1622848683)

## Secured Sensor

Place the SPG30 sensor over the screws and fit through the mounting holes. Insert and fasten hex nuts to secure the PCB to the screws.

![3d_printing_sensor-mount-sgp30-secured.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/620/medium640/3d_printing_sensor-mount-sgp30-secured.jpg?1622848319)

## Mini Fan Hardware

Use the following hardware to secure the mini fan to the sensor bracket. Insert the M2.5 6mm long screws through the outer holes on the sensor bracket and fasten the M2.5 standoffs.

- 4x M2.5 FF Standoffs – 12mm
- 4x M2.5 screws – 6mm
- 4x M2.5 screws – 12mm

![3d_printing_minifan-screws.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/621/medium640/3d_printing_minifan-screws.jpg?1622848417)

![3d_printing_sensor-mount-standoffs-install.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/622/medium640/3d_printing_sensor-mount-standoffs-install.jpg?1622848476)

## Connect STEMMA Cable

Plug in the 200mm long STEMMA QT cable to the SGP30 sensor.

![3d_printing_sensor-mount-stemma.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/623/medium640/3d_printing_sensor-mount-stemma.jpg?1622848532)

## Mini Fan Cover Install

Fit the mini fan into the fan cover with the fan blades facing down. Orient the mini fan so the cable is fitted through the wire cutout. Place the fan cover over the sensor bracket with the cables matching in orientation.

![3d_printing_minifan-cover-install.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/624/medium640/3d_printing_minifan-cover-install.jpg?1622848610)

![3d_printing_minifan-sensor-install.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/625/medium640/3d_printing_minifan-sensor-install.jpg?1622848674)

## Secure Mini Fan to Sensor Bracket

Line up the mounting holes and insert the longer M2.5 screws. Fasten the four screws tightly to secure the fan and cover to the sensor bracket.

![3d_printing_minifan-sensor-screwing.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/626/medium640/3d_printing_minifan-sensor-screwing.jpg?1622848706)

![3d_printing_minifan-sensor-mount-installed.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/627/medium640/3d_printing_minifan-sensor-mount-installed.jpg?1622848773)

## Secure PCB Mount to Frame

Use two M3 x 8mm long screws and hex nuts to secure the PCB mount to the side of the frame.

![3d_printing_frame-pcbmount-screws.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/630/medium640/3d_printing_frame-pcbmount-screws.jpg?1622850735)

![3d_printing_frame-pcbmount-install.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/631/medium640/3d_printing_frame-pcbmount-install.jpg?1622849263)

## Secured PCB Mount

Double check the orientation of the PCB mount and the frame. Use the cut out to line up the parts.

![3d_printing_frame-pcbmount-secured.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/632/medium640/3d_printing_frame-pcbmount-secured.jpg?1622849273)

## Install Frame to Back Cover

Place the frame over the back cover with the walls snap fitting into the channels. Fit the fan's cable through the wire cutout in the back cover.

![3d_printing_frame-backcover-install.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/633/medium640/3d_printing_frame-backcover-install.jpg?1622850536)

![3d_printing_frame-backcover-cable.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/634/medium640/3d_printing_frame-backcover-cable.jpg?1622849443)

## Install Carbon Filter

Press fit the carbon filter into recess the back of the cover. The filter cover is snap fitted over the filter to keep it secured and away from the fan blades.

![3d_printing_frontcover-filter-install.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/628/medium640/3d_printing_frontcover-filter-install.jpg?1622848860)

![3d_printing_frontcover-filter-secure.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/629/medium640/3d_printing_frontcover-filter-secure.jpg?1622849086)

## Secure Sensor Bracket to Front Cover

Use the following hardware to attach the sensor bracket to the front cover.

- 4x M3 x 8mm screws
- 4x M3 hex nuts

![3d_printing_frontcover-sensor-mount-screws.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/635/medium640/3d_printing_frontcover-sensor-mount-screws.jpg?1622849456)

## Installing Sensor Bracket

Hex nuts are placed into the recesses on the back of the cover. Place the sensor bracket over the front cover and line up the mounting tabs. Insert and fasten the M3 screws to secure the sensor bracket to the front cover.

![3d_printing_frontcover-sensor-mount-installing.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/637/medium640/3d_printing_frontcover-sensor-mount-installing.jpg?1622849541)

![3d_printing_frontcover-sensor-mount-nuts.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/638/medium640/3d_printing_frontcover-sensor-mount-nuts.jpg?1622849578)

## Sensor and Mini Fan Assembled

Double check the screws are tightly fastened and secured.

![3d_printing_frontcover-sensor-mount-installed.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/639/medium640/3d_printing_frontcover-sensor-mount-installed.jpg?1622849612)

## Install Front Cover to Frame

The front cover can now be snap fitted over the frame.

![3d_printing_frontcover-frame-preinstall.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/640/medium640/3d_printing_frontcover-frame-preinstall.jpg?1622849636)

![3d_printing_frontcover-frame-installing.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/641/medium640/3d_printing_frontcover-frame-installing.jpg?1622849713)

## EMC2101 Hardware

Use the following hardware to secure the fan controller to the PCB mount. Insert the M2.5 screws through the two mounting holes on the PCB mount. Fasten hex nuts over the screws to secure them to the mount.

- 2x M2.5 x 10mm screws
- 4x M2.5 hex nuts

![3d_printing_emc2101-screws.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/642/medium640/3d_printing_emc2101-screws.jpg?1622849757)

![3d_printing_emc2101-screws-installing.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/643/medium640/3d_printing_emc2101-screws-installing.jpg?1622850639)

## Secure EMC2101 to PCB Mount

The fan controller is fitted onto the PCB mount and secured with hex nuts.

![3d_printing_emc2101-secured.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/644/medium640/3d_printing_emc2101-secured.jpg?1622849885)

## Connect JST Cables to FunHouse

Plug in the JST cable from the mini fan to the A0 port on the FunHouse. Then connect the JST cable from the Noctua fan to the A1 port.

![3d_printing_emc2101-pwr-plug.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/645/medium640/3d_printing_emc2101-pwr-plug.jpg?1622849939)

![3d_printing_minifan-pwr-plug.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/646/medium640/3d_printing_minifan-pwr-plug.jpg?1622849979)

## Connect STEMMA to FunHouse

Connect the 200mm STEMMA QT cable to the EMC2101 board. Connect the 100mm STEMMA QT cable to the available connector on the EMC2101. Then, connect the other end to the I2C port on the FunHouse. Double check the daisy chain order is correct.

![3d_printing_emc2101-stemma-connect.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/647/medium640/3d_printing_emc2101-stemma-connect.jpg?1622850005)

![3d_printing_funhouse-stemma-connect.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/648/medium640/3d_printing_funhouse-stemma-connect.jpg?1622850031)

## Secure FunHouse to PCB Mount

Place the FunHouse over the PCB mount and line up the mounting holes. Insert and fasten 4x M3 x 6mm screws to secure the PCB.

![3d_printing_funhouse-pcbmount-installing-alt.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/649/medium640/3d_printing_funhouse-pcbmount-installing-alt.jpg?1622850116)

![3d_printing_funhouse-pcbmount-installing.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/650/medium640/3d_printing_funhouse-pcbmount-installing.jpg?1622850146)

## Secured FunHouse

Adjust the cables and double check the wires are no being pinched or kinking.&nbsp;

![3d_printing_funhouse-pcbmount-installed.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/651/medium640/3d_printing_funhouse-pcbmount-installed.jpg?1622850155)

## Final Build

Congratulations on your build! Use a USB type C cable and a 5V power supply to power on the FunHouse. Don't forget to check the on/off switch.

![3d_printing_funhouse-final.jpg](https://cdn-learn.adafruit.com/assets/assets/000/102/652/medium640/3d_printing_funhouse-final.jpg?1622850174)


## Featured Products

### Adafruit FunHouse - WiFi Home Automation Development Board

[Adafruit FunHouse - WiFi Home Automation Development Board](https://www.adafruit.com/product/4985)
Home is where the heart is...it's also where we keep all our electronic bits. So why not wire it up with sensors and actuators to turn our house into an electronic wonderland. Whether it's tracking the environmental temperature and humidity in your laundry room, or notifying you when...

Out of Stock
[Buy Now](https://www.adafruit.com/product/4985)
[Related Guides to the Product](https://learn.adafruit.com/products/4985/guides)
### Adafruit EMC2101 I2C PC Fan Controller and Temperature Sensor

[Adafruit EMC2101 I2C PC Fan Controller and Temperature Sensor](https://www.adafruit.com/product/4808)
Cooling fans...They're everywhere, and they serve the important purpose of keeping things cool, generally electronics. One might rightfully think: "these fans are pretty good at moving air to keep things cool; maybe I can use one of these neat computer fans to keep my widget...

Out of Stock
[Buy Now](https://www.adafruit.com/product/4808)
[Related Guides to the Product](https://learn.adafruit.com/products/4808/guides)
### Adafruit SGP30 Air Quality Sensor Breakout - VOC and eCO2

[Adafruit SGP30 Air Quality Sensor Breakout - VOC and eCO2](https://www.adafruit.com/product/3709)
Breathe easy with the SGP30 Multi-Pixel Gas Sensor, a fully integrated MOX gas sensor. This is a very fine air quality sensor from the sensor experts at Sensirion, with I2C interfacing and fully calibrated output signals with a typical accuracy of 15% within...

Out of Stock
[Buy Now](https://www.adafruit.com/product/3709)
[Related Guides to the Product](https://learn.adafruit.com/products/3709/guides)
### Carbon Filter for Solder Smoke Absorption

[Carbon Filter for Solder Smoke Absorption](https://www.adafruit.com/product/3836)
If you do a lot of soldering&nbsp;indoors, a **Carbon Filter** is essential for absorbing that solder smoke and leaving your air smelling fresh.

These measure about 13 x 13cm but are easy to trim&nbsp;with scissors or a utility knife. It took us no time to crop one to fit...

Out of Stock
[Buy Now](https://www.adafruit.com/product/3836)
[Related Guides to the Product](https://learn.adafruit.com/products/3836/guides)
### Black Nylon Machine Screw and Stand-off Set – M3 Thread

[Black Nylon Machine Screw and Stand-off Set – M3 Thread](https://www.adafruit.com/product/4685)
Totaling **420 pieces** , this **M3 Screw Set** &nbsp;is a must-have for your workstation.&nbsp;You'll have enough screws, nuts, and hex standoffs to fuel your maker tendencies&nbsp;for days on end! M3 size screws fit a number of&nbsp;Adafruit breakout/dev board...

In Stock
[Buy Now](https://www.adafruit.com/product/4685)
[Related Guides to the Product](https://learn.adafruit.com/products/4685/guides)
### Black Nylon Machine Screw and Stand-off Set – M2.5 Thread

[Black Nylon Machine Screw and Stand-off Set – M2.5 Thread](https://www.adafruit.com/product/3299)
Totaling 380 pieces, this **M2.5 Screw Set** &nbsp;is a must-have for your workstation.&nbsp;You'll have enough screws, nuts, and hex standoffs to fuel your maker tendencies&nbsp;for days on end! M2.5 size screws fit almost all of the Adafruit breakout/dev board mounting holes...

In Stock
[Buy Now](https://www.adafruit.com/product/3299)
[Related Guides to the Product](https://learn.adafruit.com/products/3299/guides)
### STEMMA QT / Qwiic JST SH 4-Pin Cable - 200mm Long

[STEMMA QT / Qwiic JST SH 4-Pin Cable - 200mm Long](https://www.adafruit.com/product/4401)
This 4-wire cable is a little over 200mm / 7.8" 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 still have a nice latching feel, while being easy to insert and remove.

<a...></a...>

In Stock
[Buy Now](https://www.adafruit.com/product/4401)
[Related Guides to the Product](https://learn.adafruit.com/products/4401/guides)
### STEMMA QT / Qwiic JST SH 4-pin Cable - 100mm Long

[STEMMA QT / Qwiic JST SH 4-pin Cable - 100mm Long](https://www.adafruit.com/product/4210)
This 4-wire cable is a little over 100mm / 4" 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 still have a nice latching feel, while being easy to insert and remove.

<a...></a...>

Out of Stock
[Buy Now](https://www.adafruit.com/product/4210)
[Related Guides to the Product](https://learn.adafruit.com/products/4210/guides)

## Related Guides

- [EMC2101 Fan Controller and Temperature sensor](https://learn.adafruit.com/emc2101-fan-controller-and-temperature-sensor.md)
- [Adafruit FunHouse](https://learn.adafruit.com/adafruit-funhouse.md)
- [Track a Turtle with WipperSnapper](https://learn.adafruit.com/track-a-turtle-with-wippersnapper.md)
- [PyPortal Pet Planter with Adafruit IO](https://learn.adafruit.com/pyportal-pet-planter-with-adafruit-io.md)
- [PyPortal Weather Station](https://learn.adafruit.com/pyportal-weather-station.md)
- [Chilled Drinkibot](https://learn.adafruit.com/chilled-drinkibot.md)
- [NeoPixel Mini VU Meter](https://learn.adafruit.com/neopixel-mini-vu-meter.md)
- [Sketch Drawing Toy with CircuitPython](https://learn.adafruit.com/sketch-drawing-toy.md)
- [CircuitPython OLED Watch Clock](https://learn.adafruit.com/circuitpython-oled-watch.md)
- [Lemon Mechanical Keypad](https://learn.adafruit.com/qtpy-lemon-mechanical-keypad-macropad.md)
- [Walkmp3rson: Personal MP3 'Tape' Player](https://learn.adafruit.com/walkmp3rson-personal-mp3-tape-player.md)
- [Programmable Wireless BLE Gesture Mouse](https://learn.adafruit.com/ble-wireless-gesture-mouse.md)
- [Raspberry Pi HQ Camera Case](https://learn.adafruit.com/raspberry-pi-hq-camera-case.md)
- [PyPortal Titano Weather Station](https://learn.adafruit.com/pyportal-titano-weather-station.md)
- [Raspberry Pi Zero Stand](https://learn.adafruit.com/raspberry-pi-zero-stand.md)
- [BrainCraft Camera Case](https://learn.adafruit.com/braincraft-camera-case.md)
