Overview
IoT Grow Monitor
Fall is almost here. With temperatures falling, the basil and heirloom tomatoes that you have been growing in your garden to top your dinner with are moving back inside the house for winter. But will they still grow?
Remote Monitoring
This project is a low-cost, easy to build internet-of-things (IoT) device that can help you to remotely monitor your indoor crops or exotic plants. Using Adafruit IO, you can remotely see your sensor data in real time on a mobile device giving you a visual user interface.
DIY 3D Printed Device
The device is designed to be suspended in mid-air, so the no-contact thermometer is pointing towards the leaves or flowers of your plant.
The 3D printed case houses a couple of sensors to calculate your plant's photosynthetic photon flux density (PPFD) and vapor pressure deficit (VPD).
Knowing these data points can help optimize the yield of your indoor crops.
WipperSnapper & Blockly Actions
With Adafruit IO’s new Blockly Actions, you can drag and drop “blocks” to create advanced triggers.
In this project you'll use “Math Blocks” to calculate the PPFD and VPD using advanced formulas and temperature sensor data.
With Wippersnapper, you can easily setup your QT Py ESP32 device with I2C sensors all within the browser with no need for coding. The Adafruit IO site is intuitive and will walk you through the process.
Hardware
The following hardware fasteners are required to assemble this project.
- 4x M3 x 16mm long machine screws
- 8x M3 x 6mm long machine screws
- 6x M2.5 x 6mm long machine screws
- 2x M3 hex nuts
Page last edited October 08, 2025
Text editor powered by tinymce.
CAD Files
3D Printed Parts
Individual 3MF files for 3D printing are oriented and ready to print on FDM machines using PLA filament. Original design source may be downloaded using the links below.
CAD Assembly
The various sensors are secured to a mounting plate. The QT Py is fitted inside a holder that is secured to an additional mount that is vertically attached to the sensor mounting plate. The mounting assembly is secured to the main enclosure. The bottom and top covers are secured to the main enclosure with proper orientation for exposing the USB port and sensors.
Build Volume
The parts require a 3D printer with a minimum build volume of:
- 75mm (X) x 75mm (Y) x 74mm (Z)
Design Source Files
The project assembly was designed in Fusion 360. Once opened in Fusion 360, It can be exported in different formats like STEP, STL and more.
Electronic components like Adafruit's boards, displays, connectors and more can be downloaded from the Adafruit CAD parts GitHub Repo.
Page last edited October 08, 2025
Text editor powered by tinymce.
Wiring
Wiring
The diagram below provides a visual reference for wiring the project's components.
This project uses STEMMA QT cables and connectors to provide a no-soldering solution for wiring. The breakouts all connect to each other, and to the QT Py board, using STEMMA QT cables.
Page last edited October 08, 2025
Text editor powered by tinymce.
WipperSnapper Setup
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 Adafruit.io
You will need an Adafruit IO account to use WipperSnapper on your board. If you do not already have one, head over to io.adafruit.com to create a free account.
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-S2. 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.
Feedback
Adafruit.io WipperSnapper is in beta and you can help improve it!
If you have suggestions or general feedback about the installation process - visit https://io.adafruit.com/support, click "Contact Adafruit IO Support" and select "I have feedback or suggestions for the WipperSnapper Beta".
Troubleshooting
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 https://io.adafruit.com/support. Make sure to click "Contact Adafruit IO Support" and select "There is an issue with WipperSnapper. Something is broken!"
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.
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.
Page last edited October 08, 2025
Text editor powered by tinymce.
Set up an Adafruit IO Device
Before we set up Actions to calculate the VPD and send data to our email, we'll need to attach and configure the QT Py's sensors components.
We'll do this by navigating to the Devices page (https://io.adafruit.com/devices) and clicking the QT Py ESP32-S3.
You will be redirected to the Device Page for your QT Py. From here, you will add and configure the sensors that connect to your QT Py.
Add the SCD40 Component
To add the SCD40 Sensor to your QT Py, click the "+" symbol on the Device Page to bring up the component picker.
- On the Component Picker, Search for the SCD40 and select it.
- Configure the SCD40 to send CO2, temperature and relative humidity readings back to Adafruit IO.
- You can configure how often to send this by clicking the Send Data dropdown.
- Click Create Component.
The SCD40 component should appear on your device page.
Add the VEML7700 Component
To add the VEML7700 Sensor to your QT Py, click the "+" symbol on the Device Page to bring up the component picker.
- On the Component Picker, Search for the VEML7700 and select it.
- Configure the VEML7700 to send Lux readings back to Adafruit IO.
- You can configure how often to send this by clicking the Send Data dropdown.
- Click Create Component.
The VEML7700 component should appear on your device page.
Add the MLX90632 Component
To add the MLX90632 Sensor to your QT Py, click the "+" symbol on the Device Page to bring up the component picker.
- On the Component Picker, Search for the MLX90632 and select it.
- Configure the MLX90632 to send Measured Object Temp (either degrees Celsius or degrees Fahrenheit) readings back to Adafruit IO.
- You can configure how often to send this by clicking the Send Data dropdown.
- Click Create Component.
Before moving on, verify that the the MLX90632 sensor appears and the device page looks like the following:
Page last edited October 08, 2025
Text editor powered by tinymce.
Set Up Adafruit IO Actions
This guide uses multiple Adafruit IO Actions for:
- Calculating the Photosynthetic Photon Flux Density (PPFD) from the VEML7700 sensor.
- Calculating the Vapor Pressure Deficit (VPD) from multiple sensors.
- Sending a SMS Alert when any measurement (we'll use VPD as an example) goes out of bounds
If you do not know what Adafruit IO Actions are - check out this guide here >>>
Create an Action to Calculate VPD
The Vapor Pressure Deficit (VPD) is the measure of the drying power of air. VPD can help a plant grower adjust their watering schedule and even mitigate against crop diseases. It is a measurement that is incredibly important to plant physiology and growth.
First create a new feed to store the resulting PPFD value. Navigate to your Feeds page and click New Feed.
First, let's create a new feed to store the resulting VPD value.
- Navigate to your Feeds page
- Click New Feed
- Name the new feed VPD
- Click Create
After clicking create, you will be brought to the Actions Editor.
The simplest trigger - any data - runs your Action every single time ANY new data arrives at a feed, regardless of what the value is.
Open the Block Toolbox by clicking on the Triggers
Select the any data block and drag it into your root block, placing it underneath the Triggers section.
Change the feed within the Any Data Block to the SCD40's temperature sensor.
Whenever the SCD40's temperature sensor gets a new reading, this Action will execute the blocks underneath the Actions heading.
Next, let's talk math!
The VPD is the difference between the vapor pressure of the leaf and the vapor pressure of the air,
VPD = VPleaf - VPair
Calculate Leaf VPD
To get the vapor pressure of the leaf, use the following formula:
VPleaf = 610.7 * 107.5*leaf_temp/(237.3+leaf_temp) / 1000
While this calculation looks may appear scary, Actions has enough math blocks to get us through this equation without programming! By breaking down these formulas using the order of operations, you're able to create an Action that can combine multiple data sources from different sensors.
First, calculate the value inside the parenthesis: 237.3+leaf_temp
First, create a new variable since we'll reference it later in Blocks.
To create a new variable,
- Click the Variables button on the Toolbox
- Click Create New Variable
- Name the variable something you can remember, like leaf-parens.
- You should now see two blocks for the variable within Variables in your toolbox.
- Select the Set Variable block and connect it to the root block's Actions section.
Next, use this block to calculate the leaf temperature.
- Open the Toolbox and select the Arithmetic Block.
- On the diagram, connect the Arithmetic Block to the Set Variable block.
Change the left-hand side of the Arithmetic Block's equation to 237.3
- Open the Toolbox and select the Get Feed Value block.
- On the diagram, connect the Get Feed Value Block to the right-hand side of the Arithmetic Block.
On the Get Feed Value Block, modify the feed to match the MLX90632 sensor's Measured Object Temperature value.
Your diagram should match the following screenshot.
Create a new variable named leaf-numerator:
- Click the Variables button on the Toolbox
- Click Create New Variable
- Name the variable leaf-numerator
- Drag and drop the Set Variable Block underneath the previous block.
To obtain the value of the leaf numerator:
- Drag and drop the Arithmetic Block into the Set Variable Block.
- Update the number on the left-hand side of the Arithmetic Block to
7.5. - Change the Arithmetic Block's operation to multiply.
- Connect the Get Feed block for the MLX90632 to the right-hand side of the Arithmetic Block.
Your diagram should look like the screenshot below.
Create a new variable named leaf-exponent:
- Click the Variables button on the Toolbox
- Click Create New Variable
- Name the variable leaf-exponent
- Drag and drop the Set Variable Block underneath the previous block.
To obtain the value of the leaf exponent:
- Drag and drop the Arithmetic Block into the Set Variable Block.
- Drag and drop the Get Variable Block (toolbox->variables) for the
leaf-numeratorvariable to the left-hand side of the Arithmetic Block. - Change the Arithmetic Block's operation to division.
- Connect the Variable block for the
leaf-parensvariable to the right-hand side of the Arithmetic Block
Your diagram should look like the screenshot below.
Create a new variable named leaf-10 to hold the value of the exponentiation.
- Click the Variables button on the Toolbox
- Click Create New Variable
- Name the variable leaf-10
- Drag and drop the Set Variable Block underneath the previous block.
To obtain the value of the 10^n operation:
- Drag and drop the Arithmetic Block into the Set Variable Block.
- Set the number on the left-hand side of the Arithmetic Block to 10.
- Change the Arithmetic Block's operation to exponentiation (
^). - Connect the Variable block for the
leaf-exponentvariable to the right-hand side of the Arithmetic Block
Your diagram should look like the screenshot below.
Create a new variable named leaf-vpd:
- Click the Variables button on the Toolbox
- Click Create New Variable
- Name the variable leaf-vpd
- Drag and drop the Set Variable Block underneath the previous block.
Finally, to obtain the value of the Leaf VPD:
- Drag and drop the Arithmetic Block into the Set Variable Block.
- Set the number on the left-hand side of the Arithmetic Block to
0.6107. - Change the Arithmetic Block's operation to multiplication.
- Connect the Variable block for the
leaf-10variable to the right-hand side of the Arithmetic Block
Your diagram should look like the screenshot below.
The final diagram for calculating Leaf VPD should look like the screenshot below.
Calculate Air VPD
Next, to calculate the VPD for the air around the plant. This equation can be modeled as:
VPair = 610.7 * 107.5*Tair/(237.3+Tair)/1000 * RH/100
where:
VPair - vapor pressure of the air in kPaTair - air temperature in CelsiusRH - air relative humidity
Following the Order of Operations, break this equation down into steps on the diagram.
Create a new variable named air-parens:
- Click the Variables button on the Toolbox
- Click Create New Variable
- Name the variable air-parens
- Drag and drop the Set Variable Block underneath the previous block.
To obtain the value for air-parens:
- Drag and drop the Arithmetic Block into the Set Variable Block.
- Set the number on the left-hand side of the Arithmetic Block to
237.3. - Change the Arithmetic Block's operation to addition.
- Connect the Get Feed Block to the right-hand side of the Arithmetic Block.
- Set the feed to the SCD40 Temperature.
Your diagram should look like the screenshot below.
Create a new variable named air-numerator:
- Click the Variables button on the Toolbox
- Click Create New Variable
- Name the variable air-numerator
- Drag and drop the Set Variable Block underneath the previous block.
To obtain the value for air-numerator:
- Drag and drop the Arithmetic Block into the Set Variable Block.
- Set the number on the left-hand side of the Arithmetic Block to
237.3. - Change the Arithmetic Block's operation to addition.
- Connect the Get Feed Block to the right-hand side of the Arithmetic Block.
- Set the feed to the SCD40 Temperature.
Your diagram should look like the screenshot below.
Create a new variable named air-exponent:
- Click the Variables button on the Toolbox
- Click Create New Variable
- Name the variable air-exponent
- Drag and drop the Set Variable Block underneath the previous block.
To obtain the value for air-exponent:
- Drag and drop the Arithmetic Block into the Set Variable Block.
- Add a Get Variable block to the left-hand side of the Arithmetic Block.
- Select the
air-numeratorvalue.
- Select the
- Change the Arithmetic Block's operation to division.
- Add a Get Variable block to the left-hand side of the Arithmetic Block.
- Select the
air-parensvalue.
- Select the
Your diagram should look like the screenshot below.
Create a new variable named air-10:
- Click the Variables button on the Toolbox
- Click Create New Variable
- Name the variable air-10
- Drag and drop the Set Variable Block underneath the previous block.
To obtain the value for air-10:
- Drag and drop the Arithmetic Block into the Set Variable Block.
- Set the value on the right-hand side of the Arithmetic Block to
10. - Change the Arithmetic Block's operation to exponentiation (
^). - Add a Get Variable block to the left-hand side of the Arithmetic Block.
- Select the
air-exponentvalue.
- Select the
Your diagram should look like the screenshot below.
Create a new variable named VPair:
- Click the Variables button on the Toolbox
- Click Create New Variable
- Name the variable VPair
- Drag and drop the Set Variable Block underneath the previous block.
To obtain the value for VPair:
- Drag and drop the Arithmetic Block into the Set Variable Block.
- Set the value on the left-hand side of the Arithmetic Block to
0.006107. - Change the Arithmetic Block's operation to multiplication (
x). - Add a Get Variable block to the right-hand side of the Arithmetic Block.
- Select the
air-10value.
- Select the
Your diagram should look like the screenshot below.
- Drag and drop another Set Variable Block to the diagram, placing it underneath the previous block.
- Configure the Set Variable block to the
VPairvariable. - Drag and drop the Arithmetic Block into the Set Variable Block.
- Set the value on the left-hand side of the Arithmetic Block to the
VPairvariable. - Change the Arithmetic Block's operation to multiplication (
x). - Add a Get Feed Block to the right-hand side of the Arithmetic Block.
- Select the QT PY S3's SCD40 Humidity Sensor value
Your diagram should look like the screenshot below.
Finally, to calculate the VPD. The total VPD is the difference between the leaf VPD and the air VPD.
- On the toolbox, select the Set Feed Value Block and connect it to your diagram.
- Drag and drop the Arithmetic Block into the Set Feed Value Block.
- Set the value on the left-hand side of the Arithmetic Block to the
leaf-VPDvariable. - Change the Arithmetic Block's operation to subtraction (-).
- Set the value on the right-hand side of the Arithmetic Block to the
VPairvariable./
Double-check that your diagram looks like the following diagram before proceeding.
Click the Enable button to Enable, Save, and Run the action.
After running the action, the VPD Feed should show the calculated VPD value.
Create an Action to Calculate PPFD
The next first measurement is Photon Flux Density, or PPFD. While PPFD is best measured using a PAR meter, it can be approximated using the Lux value read by the VEML7700 sensor.
The PPFD measurement is produced by multiplying your lux measurement with a conversion factor. The conversion factor varies depending on the light source.
For example, if the light source is sunlight, the conversion factor (according to this website) is 0.0185. So, multiply the VEML7700 sensor's lux measurement by 0.0185 to obtain a resulting PPFD value.
WipperSnapper doesn't allow you to do math directly on the Device Page so quickly assemble an Action to do this conversion and store it on a new feed called PPFD.
First, create a new feed to store the resulting PPFD value.
- Navigate to your Feeds page
- Click New Feed
- Name the new feed PPFD
- Click Create
Next, navigate to your Actions page.
- Click + New Action
- Name the new feed, Calculate PPFD
- Click Create
After clicking create, you will be brought to the Actions Editor.
The simplest trigger - any data - runs your Action every single time ANY new data arrives at a feed, regardless of what the value is.
Open the Block Toolbox by clicking on the Triggers
Select the any data block and drag it into your root block.
After connecting the any block to the trigger section of the root block, change the feed to your VEML7700 light sensor.
The Set Feed Value Block publishes a data point to a Feed. You'll want to publish the calculated PPFD value to the PPFD feed.
- On the toolbox, click Feeds
- Click the Set Feed Value Block
- Connect the Set Feed Value Block to the Actions block.
The arithmetic block can perform mathematical calculations using sensor data, feed values, or any numbers. You will use it to calculate the PPFD value.
- On the Toolbox, click Math
- Click the arithmetic block
- Connect the arithmetic block to the right-hand side of the Set Feed Value Block.
The Get Feed Value block obtains the last value of a feed or component. You will use to to get the lux measurement from the VEML7700.
- On the toolbox, click Feeds
- Select the Get Feed Value Block
- Connect the Get Feed Value block to the left-hand side of the arithmetic block.
On the arithmetic block, change the operation to multiplication. Then enter 0.0185 (the conversion factor) on the right-hand side of the arithmetic block.
Pause here and verify your diagram looks like the following image:
Above the diagram, click Save and Run.
Enable the Action and run it.
Check that the run report shows a successful run, indicated by Validation: Succeeded.
If validation succeeded, the Action's output is saved on the PPFD feed.
Page last edited October 08, 2025
Text editor powered by tinymce.
Build an Adafruit IO Dashboard
Adafruit IO Dashboards start out as a blank webpage. From this page, you can add blocks to create an dynamic (no more staring at static charting dashboards!) interactive webpage to interact with (or view) this grow monitor electronics project. You can also share this dashboard with friends, classmates, students, or colleagues.
For more info about Adafruit IO Dashboards, check out the guide below.
Create a new Dashboard
When you log in to your io.adafruit.com account, you will be directed to your account overview page. Click the Dashboards link in the header to navigate to the "dashboards" page.
Your list of dashboards will only have the Welcome Dashboard when it is first loaded. You can start the dashboard creation process by clicking the New Dashboard button.
Enter the name and description of your new dashboard, then, click the Create button once you are finished.
Once the new dashboard has been created, click on the name of your new dashboard to visit its page.
You should now see your new, blank, dashboard.
Add Gauge Block for VPD
Next, add a block to your dashboard. Blocks are widgets that you can add to your dashboard.
The block you want to use to quickly display VPD is the Gauge Block. The gauge block allows you to quickly view the current value of a numeric feed, like the calculated VPD feed. The gauge will update automatically whenever a new value is pushed to the feed.
To add a new block to your Dashboard, click the New Block button on the top right of the dashboard page.
From the New Block pop-up, select the Gauge Block
On the pop-up modal, select the Gauge Block. Then, click Next Step.
On the Connect a Feed page, search for "VPD" and select the VPD feed. Click Next Step.
Next, you'll need to configure the gauge block.
- Set the Block Title to VPD
The VPD can range from 0-2kPa.
- Set the Gauge Min. Value to 0
- Set the Gauge Max Value to 2
- Set the Gauge Label to kPA
The minimum alert level is when the VPD falls under 0.4kPa and the maximum alert level is if the VPD goes over 1.7kPa. These are configurable values, you can set them according to your horticultural requirements.
- Set the Low Warning Value to 0.4kPa
- Set the High Warning Value to 1.7kPa
Finally, let's give the gauge a graphic.
- Click "Show Icon" and search for the leaf
Click Create Block
Your dashboard should look like the following screenshot.
Add a Gauge Block for PPFD
Repeat the steps above to add a gauge to display the PPFD value. You can use the Edit Layout Button to move the blocks around.
Your dashboard should look similar to the screenshot below.
Add a Line Chart Block
The line graph block allows you to visualize numeric data over time. The line chart is used to graph one or more feeds. You can set the time range in hours that the chart will load, and set the labels for each axis of the chart. The chart will update dynamically whenever new values are pushed to the feed.
You will use it to track the temperature and humidity over time.
Click New Block
Select the Line Chart Block
Under the QT Py, select the following feeds:
- MLX 90632 Measured Object Temperature
- SCD40: Temperature Sensor
- SCD40: Humidity Sensor
Configure the block's settings and click Create Block.
Your dashboard should look similar to the screenshot below. Keep in mind that you can edit the dashboard at any time.
Page last edited October 08, 2025
Text editor powered by tinymce.
Assembly
Connect Sensors
Use the short (50mm length) STEMMA QT cables to connect the various sensors together.
Use the longer (100mm length) STEMMA QT cable to connect the QT Py ESP32-S3.
Install QT Py
Orient the QT Py's USB-C Port with the mounting tabs on 3D printed holder.
Insert the QT Py into the holder at an angle so one side of the PCB are fitted under the corner tabs.
Then, slightly flex the holder to allow the other side of the PCB to fit under the corner tabs.
Installed QT Py
Check the PCB is fitted under all four corners on the 3D printed holder.
Take a moment to ensure the QT Py is in the correct orientation and the STEMMA QT cable is connected.
Secure QT PY Holder
Place the QT PY holder over two mounting holes on the QT Py mounting plate (either side, holes are symmetrical).
Insert and fasten two M3 x 6mm long screws. Secure the parts together using M3 hex nuts.
Sensor Mount
Get the 3D printed sensor mount, sensors and hardware screws ready to assemble.
- 6x M2.5 x 6mm long machine screws
Secure SCD40
Place the SCD40 sensor onto the standoffs on the sensor mount. Reference the photo for the correct orientation
Insert and fasten two M2.5 x 6mm long machine screws to secure the SCD40 to the sensor mount.
Secure MLX90632
Place the MLX90632 sensor onto the standoffs on the sensor mount. Reference the photo for the correct orientation.
Inert and fasten two M2.5 x 6mm long machine screws to secure the MLX90632 to the sensor mount.
Secure VEML7700
Place the VEML7700 sensor onto the standoffs on the sensor mount. Reference the photo for the correct orientation.
Inert and fasten two M2.5 x 6mm long machine screws to secure the VEML7700 to the sensor mount.
Secured PCBs
Take a moment to ensure the various PCBs have been properly secured to their 3D printed mounts.
Use the following hardware to secure the QT Py mounting plate to the sensor mount.
- 2x M3 x 6mm long machine screws
Attach Mounting Plate
Place the QT Py mounting plate to the mounting tab on the sensor mount with the two mounting holes lined up.
Double check the orientation of the parts are correct following the assembly photo.
Insert and fasten two M3 x 6mm long machine screws to secure the parts together.
Connect QT Py to Sensors
Plug in the STEMMA QT cable from the QT Py to the available port on the SCD40 sensor.
Double check the placement of all the sensors and QT Py are in the correct orientation.
Install Sensors to Case
Orient the 3D printed case with the sensor mount assembly.
Insert the sensor mount assembly into the case with the four mounting holes lined up.
Double check the orientation of the parts are correct.
Install Bottom Cover
Use the following hardware to secure the bottom cover to the case.
- 4x M3 x 16mm long machine screws
Secure Bottom Cover
Orient the bottom cover with the various sensors so the cutouts are lined up with the components.
Insert and fasten the four M3 x 16mm long machine screws to secure the bottom cover to the sensor mount and case.
Install Top Cover
Use the following hardware to secure the top cover to the case.
- 4x M3 x 6mm long machine screws
Secure Top Cover
Orient the top cover with the QT Py's USB-C port and place it onto the case with the four mounting holes lined up.
Insert and fasten the four M3 x 6mm long machine screws to secure the top cover to the case.
Hanging Grow Monitor
Depending on your setup, you'll want to decide how to suspend your grow monitor over your plant. Ideally, the sensors should be position above your plant.
Page last edited October 08, 2025
Text editor powered by tinymce.
Usage
Plug in the Grow Monitor to a USB C cable and power supply. The QT Py ESP32-S3 will receive power and automatically begin logging and sending data to Adafruit IO.
Over time, you'll see data from your sensor begin to populate your Adafruit IO Feeds and appear on your Adafruit IO Dashboard.
Going Further
If you want to extend this project to add an email/SMS when the VPD or PPFD levels reach a certain value, you can follow our Adafruit IO Actions Learning System Guide which has an example of this usage.
If you want to learn more about IO Actions and the available blocks, visit the IO Actions Documentation: https://io.adafruit.com/actions-docs.
Page last edited October 08, 2025
Text editor powered by tinymce.