Low-cost, open-source cell culture chamber for regulating physiologic oxygen levels

Graphical abstract

gas inflow are controlled via solenoids that open and close from a PID controller. The chamber internally contains a sensor housing unit, an aluminum shelf, shelf supports, and a water tray. The sensor housing unit (located in the path of the exhaust) contains the CO 2 sensor (with integrated pressure and relative humidity sensors) and O 2 sensor (with an integrated temperature sensor) and a filter to prevent potential contamination within the chamber. Similar to a cell culture incubator, the water tray maintains a relative humidity level of around 95%. To maintain temperature, the chamber is placed in a 37°C cell culture incubator, or another user-specified temperature-controlled environment. The aluminum shelf containing multiple through-holes allows diffusion of water vapor throughout the chamber and holds the cell culture plates above the water tray. A separate external unit houses the electronics (PBC, Arduino, and Raspberry Pi) that controls the solenoids. These electronics are connected to the GUI, which is used by the operator to input and control the desired concentrations of O 2 and CO 2 , as well as provide a real-time readout of O 2 and CO 2 concentrations, total pressure, temperature, and humidity within the chamber. Design highlights include: Varying container size (flexible design) to hold standard cell culture plates and flasks Fits into a standard cell culture incubator (interior incubator dimensions of 57.6 cm Â 47 cm Â 60.7 cm) and maintains 95% humidity Maintains 5% CO 2 O 2 levels controlled and maintained between 1% and 21% Tunable gas inflow and exhaust rates Low cost (<$850 (USD), see Bill of Materials) Easy maintenance/sterilization using 70% ethanol Intuitive GUI

Design files
The design files include three-dimensional (3D) drawings of all components as STL and Autodesk Ò Fusion 360 files (F3Z and F3D), as well as printed circuit board (PCB) design files, code for the controllers and GUI as outlined and described below and in the Design Files Summary.

3D printed parts
The aluminum shelf supports, sensor housing, electronic housing, and electronic housing lid were all 3D printed using Sindoh 3DWOX PLA filament. We recommend at least a 20% infill for all 3D printed parts, a printing temperature of at least 185°C, and a layer height ranging between 0.2 and 0.3 mm (follow specific printer and material recommendations).

3D modeled parts
The modeled parts were used mainly for visualization purposes, using a 3D computer aided drafting (CAD) assembly. The parts that were modeled include the premade chamber, premade chamber lid, CO 2 sensor, O 2 sensor, MXboard, cell plate (well plate), aluminum shelf, aluminum shelf supports, water tray, sensor housing, RJ45 pinout, full design of electronic housing (including lid) and all pieces of the custom chamber design.

Machined parts
The shelf was machined out of ¼" ± 0.125" aluminum sheet metal.

Electronics
The overall schematic of the system is shown below in Fig. 2. It includes an Arduino Mega, the O 2 and CO 2 sensors, a logic level converter to ensure the 3.3 V UART signals of the sensors can communicate with the 5 V Arduino signals, three solenoids, 1kO resistor, BJT transistor, and a diode for each of the solenoids. The resistor-transistor-diode combination helps ensure that the 5 V Arduino signals will communicate properly with the 12 V solenoids, and that current spikes will not run back through the system when the solenoids close. The Arduino Mega was chosen due to both sensors needing UART serial communication ports. A Raspberry Pi, not pictured, was also used to help with data logging and to run the GUI.

Software
There are two software sets that run the project. The Arduino has two files written in the default Arduino IDE that get compiled together to run and control the Arduino. These files are HypoxiaChamber.ino and ControlFunctions.ino. The Raspberry Pi has a python file that runs the GUI. GUI.py was created using the tkinter library in Python3.   Premade Chamber Full Design: This is a model of the chamber with all other components placed inside. It was used for visualization purposes as well as determining exhaust, input and ethernet connector hole locations. Thus, it may not include all details to exact specifications as found in the final design build and is herein referred to as a prototype model.
Premade Chamber Lid: This is a model of the lid for the airtight plastic container. This is a prototype model that was made solely for visualization purposes.
Pre-Made Chamber Shelf: This file is for the design of the aluminum shelf which supports the cell plates. Humidity_control_support: This is the file for the 3D printed supports which are used to support the shelf in the bottom of the chamber.
Cell Plate: This is a model of one of the cell plates that can be used inside of the chamber. This is a prototype model that was made solely for visualization purposes.
Water Tray: This is a model of the water tray used for maintaining humidity within the chamber. This is a prototype model that was made solely for visualization purposes.
Sensor Housing: Housing and Sensors: This is a prototype model of the sensor housing unit. This model was used to visualize the configuration of each of the sensors and the RJ45 Pinout.
Sensor Housing Bottom: 3D printed bottom piece of the sensor housing unit. Sensor Housing Top: 3D printed top piece of the sensor housing unit. CO 2 Sensor: This is a model of the CO 2 sensor. This is a prototype model that was made solely for visualization purposes. Luminox O2: This is a model of the O 2 sensor. This is a prototype model that was made solely for visualization purposes.
MXBoard: This is a model of the MXBoard that the CO 2 sensor is connected to. This is a prototype model that was made solely for visualization purposes.
O2Sensor Retainer: This file is for a 3D printed piece which holds the O 2 sensor in place in the sensor housing. RJ45 Pinout: This is a model of the RJ45 pinout which allows the sensors inside the sensor housing to be connected via ethernet cable (in this paper this part is also referred to as an ethernet connector). This is a prototype model that was made solely for visualization purposes.
Electronic Housing: Electronic Housing and Lid: This is a model of the electronic housing, lid, Raspberry Pi, PCB, Solenoids, and Arduino. This model was used to represent the configuration of all of these parts together. The Raspberry Pi, PCB, Solenoids, and Arduino are prototype models used for visualization purposes.
Electronic Housing: 3D printed housing unit used to house the Raspberry Pi, PCB, Solenoids, and Arduino. Electronic Housing Lid: 3D printed lid used to cover the top portion of the electronic housing unit.

PCB:
Hypoxia_PCB: These are the schematic (.sch) and board (.brd) views created in Autodesk Eagle software to create the PCB used in this project.
GerberFiles: This zipped folder contains the files required for manufacturing the PCB designed for this project. Simply send this zipped folder to the manufacturer to have the board created as is.

Code:
HypoxiaChamber: This is the main Arduino code to control the system. Contains the setup and main loop of the program. It requires the installation of the Arduino PID library by Brett Beauregard. The following link goes to the GitHub related to this library: https://github.com/br3ttb/Arduino-PID-Library ControlFunctions: This is the auxiliary file for the Arduino code, it contains the command parsing functions, O 2 and CO 2 solenoid control function, and O 2 and CO 2 read functions.
GUI: This is the python3 file to run on the Raspberry Pi which runs the user interface. It is built using the tkinter UI library. The required python libraries are the following: tkinter, serial, time, csv, datetime, shutil.
settings: This is the comma separated values (CSV) file that the GUI uses to store the default settings of the GUI. Place it in the same directory as the GUI.py file before starting the GUI. *Custom Chamber: Custom Hypoxia Chamber: This is a model of the custom chamber that was designed, but never fully implemented. It was included here for users that would prefer a custom-build chamber.
Corner Piece Backside: 3D model of the 4 corner pieces that were used on the back side of the custom chamber.   (Fig. 4 -Component 1, 2 and 3). o B) Drill 4 holes in a rectangular pattern around the gas exhaust hole to anchor fasteners for sensor housing (reference Premade Chamber Full Design design file for specific hole locations) (Fig. 4 -Component 4). o *Use standard safety precautions while using a drill (safety glasses, closed-toe shoes, etc.) and secure the chamber using appropriate clamps. 5.1.2) 1x Shelf o A) Mill out the shelf from stock aluminum (reference Pre-Made Chamber Shelf file) (Fig. 3-Component 7).* Use standard safety precautions while using a mill (safety glasses, closed-toe shoes, etc.) and securely clamp the aluminum in the workspace. 5.1.3) 4x Shelf supports o A) Using the Humidity_contol_support file, print the shelf supports using PLA filament (specifically, we used Sindoh 3DWOX Refill Filament PLA) and a 3D printer. Any printer that can print PLA should suffice (Fig. 3-Component 8).    5.1.7) Insert the quick-connect fittings into the gas input and exhaust holes and use O-rings to seal holes (Fig. 4-Component 1 and 3). 5.1.8) Insert the Ethernet through-wall connector into its hole and use an O-ring to seal the hole (Fig. 4-Component 2).

Bill of materials
Sensor housing construction 5.2.1) Using the Sensor Housing Bottom, Sensor Housing Top, and O2Sensor Retainer files, 3D-print both parts of the sensor housing using PLA filament (specifically, we used Sindoh 3DWOX Refill Filament PLA) (Fig. 5-Component 1, 4 and 9). 5.2.2) Ensure all pieces fit properly together and that the sensors fit into their positions within in the bottom portion of the sensor housing (Fig. 5). 5.2.3) Attach the filter cap (Fig. 5-Component 3). Electronic housing construction 5.3.1) Using the Electronic Housing and Electronic Housing Lid design files, 3D print the electronic housing and the lid using PLA filament (specifically, we used Sindoh 3DWOX Refill Filament PLA). 5.3.2) Mount the Arduino using 4X 6-32 bolts and nuts and mount the Raspberry Pi using 4X 6-32 bolts and nuts.

5.4.3) Set up solenoids:
o A) Ensure the solenoids are sufficiently tightened (hand-tight with an adjustable wrench) where tubing connects to the solenoid to prevent gas leaks. o B) Place solenoids into specified locations in Electronic Housing (Fig. 7 -Component 1, 2, and 3). o C) Attach female-ended wires to solenoid pin headers on PCB, then attach the male ends to the proper solenoids. The orientation of ground and signal wires can be reversed on the solenoid. o D) Attach tubing to input and exhaust ports of chamber (Fig. 4 -Component 1 and 3). o E) Attach CO 2 , N 2 , and chamber exhaust lines into the input valves of the CO 2 , O 2 , and exhaust solenoids, respectively . o G) Attach the chamber input gas tube to the output of wye-connector (Fig. 7 -Component 6 and 9). o H) Attach CO 2 and O 2 solenoid output tubing to the inputs of the wye-connector (Fig. 7 -Component 1, 2, and 6). o I) Ensure output tube from exhaust solenoid exits Electronic Housing (Fig. 7 -Component 3 and 10).
*Potential air leaks can be tested using the process described in section 7.1 and should only be done in a wellventilated space using either air or N 2 . (Fig. 7 -Ethernet Port). o B) Attach other end of Ethernet cable to through-wall connector on chamber (Fig. 4 -Component 2). o C) Epoxy the Ethernet Connector into the sensor housing base so that the screws of the connector are facing away from the O 2 sensor. Hook the removable wire terminals over the ledge of the sensor housing base. o D) Attach male-to-female wires to Ethernet break-out pins, securing them in place by screwing them in. o E) Attach the other (female) ends of these wires to the correct sensor pins for the O 2 and CO 2 sensors (Fig. 8). When connecting the O 2 sensor, pass the wires through the O 2 sensor holder.  o F) Secure the CO 2 sensor, which should come attached to the MXBoard, into the bottom of the sensor housing using the M1.6 bolts and nuts (Fig. 5-Component 7 and 8). o G) Place the O 2 sensor into its sensor holder and cover with the O 2 Sensor retainer (Fig. 5-Component 4, 5, and 6). o H) Zip-Tie the sensor retainer on. o I) Connect Ethernet break-out pins to through-wall ethernet cable inside chamber (Fig. 3-Component 4). o J) Mount bottom half of sensor housing to top half using 4x 6-32 bolts and nuts inserted into their nut holes (Fig. 5-Component 1 and 9). 5.4.5) Ensure chamber is securely closed and all necessary components are inside. 5.4.6) Set up Arduino and Raspberry Pi: o A) Connect both Arduino and Raspberry Pi to their respective power supplies (Fig. 7-Component 7 and 19). & 120 V AC to 12 V 3A power supply with a barrel plug for the Arduino (Fig. 7-Component 19). & 120 V AC to 5.1 V 3A USB-C power supply for the Raspberry Pi (Fig. 7 -Component 7). & *Electric shock hazard -unplug from power until all hardware in secured and covers on the Electronics and Sensor housing are installed.  (Fig. 7 -Component 17 and 18). o F) Attach SD card, loaded with Raspbian or desired Linux environment, to Raspberry Pi (Fig. 7 -Component 11). o G) Connect Raspberry Pi to monitor using proper cables (micro-HDMI to HDMI adapter, then HDMI to VGA cable) (Fig. 7 -Component 8). o H) Connect Raspberry Pi to a mouse and keyboard (Fig. 7 -Component 15 and 16). o I) Download or move the GUI.py and settings.csv files onto a USB or other storage device. o J) Connect the storage device to the Raspberry Pi through one of the USB ports. o K) Use monitor and keyboard/mouse to copy and paste the GUI.py and the settings.csv files from the storage device into the Raspberry Pi's file library. o L) GUI can be run using Python3 on the Raspberry Pi.

Operation instructions
User interface operation 6.1.1) Connect Arduino: o A) The 'Connect Arduino' button in the bottom right will be red if the Arduino has not been connected to the Raspberry Pi and GUI (Fig. 9). When the Arduino is plugged in via USB to the Raspberry Pi ( Fig. 7 -Component 17 and 18), press this button to begin serial communication. If properly connected it will turn green and display 'Arduino Connected'. If the Arduino is connected on startup, it will automatically connect and turn green. o B) The Arduino must be connected prior to setting values or beginning an experiment. 6.1.2) Setting Values: o A) In the appropriate entries, enter the desired CO 2 and O 2 percentages that the chamber will maintain (Fig. 9). o B) Press the 'Set Values' button to submit these values. The system should display a notification indicating that it received these values. If no new values are set, the system will default to run at 5% CO 2 and 1% O 2 . o C) Set a pressure limit value, this will be used to provide notifications if the chamber pressure exceeds the value. o *If pressure limit is exceeded press the 'Pause Experiment' button or 'Press to end Experiment' button and proceed to open the chamber and let the chamber reach a lower pressure before resuming or restarting an experiment. 6.1.3) Saving Files: o A) In the filename box insert the suffix to be used for the filename (Fig. 9). o B) Then browse for a directory that the file can be stored in. A file will be created with a timestamp and then the suffix provided within that directory. (e.g.: ''D:/. . ./MMDDYY_HHMM_FilenameSuffix.csv") o C) Once the file path has been browsed and inserted, press 'submit file path' to save it. o D) The 'Export file' button can be used to copy the experimental file to another directory such as a USB drive. When selected, it will prompt for a new directory path and then copy the current working file to that directory. 6.1.4) Running/Stopping an Experiment: o A) Connect the CO 2 and N 2 gas cylinders to the tubes connected to the CO 2 and N 2 solenoids (Fig. 7 -Component 13  and 14). o B) Set the pressure regulators on the cylinders to about 3-5 PSI. o C) Open the gas cylinders.
*Gas cylinders should always be secured to prevent tip-over. o D) Once a save file has been entered and the parameters have been set, press 'Begin Experiment' to start. This indicates that gas will begin flowing into the chamber as the system works to reach the desired setpoints, and that all data will be logged in the file specified. o E) Select the 'Press to end Experiment' button when the experiment has reached its conclusion. This stops the solenoids in the closed position, prohibiting any gas from flowing into the chamber, and it tells the Raspberry Pi to stop saving data in the specified file. The chamber is now safe to open, and all components can be dismantled and sterilized, if necessary.

6.1.5) Pausing the Experiment: o A)
To open the lid and handle the samples during an experiment, the gas flow must be turned off to prevent excess gas leaking into the room. To do so, press the 'Pause Experiment' button. This stops the solenoids in the closed position, prohibiting any gas from flowing, but continues to record data measurements in the file specified. o B) Once the chamber has been resealed, press the button labeled 'Experiment paused. Press to resume' button to resume gas flow.  6.1.6) PID Settings: o A) Pressing the 'PID Settings' button will open another window where the control algorithm can be modified. The proportional (Kp) and integral (Ki) constants that control the PID loops for both the O 2 and CO 2 setpoints can be modified here, along with modifying how often the system asks the sensors for measurements and runs the PID loops. If none of these settings are modified, the gray placeholder text indicates the presets that the system will use. The default PID equations are:  (Fig. 4 -Component 2). o C) Disconnect the gas input and exhaust tubing (Fig. 4 -Component 1 and 3). o D) Remove the shelf from the chamber (Fig. 3 -Component 7). o E) Remove the shelf supports (Fig. 3 -Component 8). o F) Remove the water tray and pour out remaining contents (Fig. 3 -Component 10). o G) Remove filter cap (Fig. 3 -Component 3). o H) Using a 70% ethanol solution, thoroughly spray or wipe down all parts of the chamber and the components which were removed, this includes the lid of the chamber. Be careful to only wipe down the outside of the sensor housing and the outside of the ethernet cable to avoid damaging the sensors and cable. Allow all pieces to dry before reassembly. 6.2.2) Full Disinfection: * o A) Remove chamber lid. o B) Unplug the ethernet cable connecting the chamber to the electronic housing (Fig. 4 -Component 2). o C) Disconnect the ethernet cable from the through-wall connector and the sensor housing unit (Fig. 3 -Component  5). o D) Disconnect the gas input and exhaust tubing (Fig. 4 -Component 1 and 3). o E) Unmount the sensor housing unit (Fig. 3 -Component 2). o F) Disconnect the input and exhaust quick-connect fittings (Fig. 4 -Component 1 and 3). o G) Completely remove the ethernet through-wall connector (Fig. 4 -Component 2). o H) Remove the shelf (Fig. 3 -Component 7). o I) Remove the shelf supports (Fig. 3 -Component 8). o J) Remove the water tray and pour out remaining contents (Fig. 3 -Component 10). o K) Make sure all O-rings and nuts/bolts have been removed from the chamber. o L) Remove filter cap (Fig. 3 -Component 3). o M) Then follow steps described in 6.2.1) G.
*During disinfection place all parts on a surface that has already been disinfected.
Reassembly of chamber/components 6.3.1) After Partial Disinfection: o A) Replace the filter cap with a new sterile one (Fig. 3 -Component 3). o B) Place chamber into incubator. o C) Fill water tray with sterile water slightly below maximum capacity (Fig. 3 -Component 10). o D) Place the water tray back into the chamber with sterile water. o E) Place the shelf supports into the chamber (Fig. 3 -Component 8). o F) Place the shelf onto the humidity shelf supports (Fig. 3 -Component 7). o G) Pass the tubes and cables through the port in the incubator. o H) Reseal the port with a stopper and further cover the hole with parafilm. o I) Reconnect the gas input and exhaust tubbing (Fig. 4 -Component 1 and 3).  (Fig. 4 -Component 2). o G) Reconnect the ethernet cable from the through wall ethernet connector to the sensor housing unit (Fig. 3 -Component 5). o H) Reconnect both the input and exhaust tubes (Fig. 4 -Component 1 and 3).
Preparation for an experiment 6.4.1) Before beginning an experiment, it is recommended to have the chamber sit inside the incubator for an appropriate amount of time to acclimate (generally, at least one hour). This allows the chamber to acclimate to the temperature, humidity, and CO 2 levels of the incubator. Therefore, after sterilizing the chamber and its components (i.e., the shelf, shelf supports, water tray, sensor housing), set the chamber inside the incubator with the lid off. Leave the chamber to reach the incubator's desired conditions, then place the experimental material (e.g., stem cells in culture plates) inside the chamber, and seal the chamber with the latches on the lid. The experiment can now be started by using the GUI as described above. It is also recommended that the entire system be disinfected after each experiment as described in 6.2.1 and 6.3.1 to limit the potential for contamination. After about 3 to 4 experiments, it is recommended to conduct a full disinfection as described in 6.2.2 and 6.3.2.

Validation and characterization
Airtight 7.1.1) The airtightness of the chamber was tested via placing soapy water around the edges and the holes of the chamber and pumping air into the chamber. No bubbles were formed in these locations, indicating the chamber was airtight. Airtightness is important for this system to reduce N 2 and CO 2 gas usage. However, airtightness is not absolutely critical to the overall functionality of the system. It is more important that there is minimal pressure build-up within the system, which was evaluated in section 7.2.
Validating pressurization and equilibrium 7.2.1) A bike pump was connected to the chamber and all ports, excluding the exhaust port, were blocked. The chamber was filled with three pumps of air via the bike pump, and the pressure was continuously recorded until the chamber dropped back to the starting pressure. The edges of the chamber were covered in soapy water to test if the pressure compromised the airtight seal. This assessment was conducted first with only the exhaust fitting, then with only the filter, and finally with both. The results of each test are shown in Fig. 10. In all three cases, in Fig. 10, the pressure reached equilibrium in under 1 min. The chamber was able to withstand a pressure increase of roughly 12.5 mBar without forming any bubbles, hence not compromising the airtight seal. As described further in Fig. 11 when N 2 gas is input using a tank regulator pressure of around 3 psi, while having the exhaust system functioning, the slightly increased pressure does not result in leaks or breaches of the chamber integrity. We also tracked the pressure in the chamber while performing a test of the entire system, which included inputting both N 2 and CO 2 and exhausting the gas in the chamber until specific O 2 and CO 2 set points were achieved. The results of this test are shown in Fig. 11.
Based on these results, the hypoxia chamber system can withstand the pressure produced through inputting gases. This also shows that once gases reached their set points and the input of gasses stopped (occurring at 36 min) the pressure achieved equilibrium around 7 min later. Note: The jagged peaks in Fig. 11A are indicative of each time gas was injected into the chamber (Fig. 11B, C).
Maintaining O 2 and CO 2 levels 7.3.1) To validate that our chamber can maintain the desired O 2 and CO 2 setpoints for an extended period of time, the chamber was monitored over the course of 5 days while at room temperature. The setpoints used for this test were 5% CO 2 and 1% O 2 . The results of this test (shown in Fig. 12), demonstrates the system successfully reached and maintained the desired setpoints for the duration of the test period with minimal fluctuations in the gas levels. A subsequent experimental test using live cells that were cultured for three days inside the hypoxia chamber was also conducted. Prior to beginning the experiment, the chamber was placed inside the incubator with its lid partially open (i.e., one side was left unhinged) for 24 h to acclimate to incubator conditions. After 24 h, two 12-well plates of a mouse mesenchymal stem cell line (C3H10T1/2, American Tissue and Cell Collection, Manassas, VA) were placed inside the chamber, and it was fully sealed. The setpoint values for the experiment were 5% CO 2 and 5% O 2 . The chamber was then opened  once per day for observation and/or culture medium supplementation over the next three days. These events correspond to peaks in Fig. 13 and Fig. 14.
As seen in Fig. 13, between 25 and 50 h, the CO 2 and O 2 readings fluctuated minimally. The fluctuations began when the chamber was opened on day 2 and ended when it was opened on day 3. It was noted that the lid of the chamber had not been completely sealed after opening it on day 2 causing it to leak. However, even with a poor seal, the system appeared robust and was able to maintain an environment between 4 and 6% CO 2 and 4-5% O 2 , which was within the desired environmental conditions for this experiment.
For each of these tests within the cell culture incubator, the CO 2 concentration was initially benchmarked against the 5% CO 2 of the incubator. Further, the cell culture medium contains a pH indicator (phenol red), which appeared similar to controls grown in a standard cell culture incubator containing 5% CO 2. Together, this helped to demonstrate the system's ability to track and maintain CO 2 in the chamber.
Limitations 7.4.1) While this system successfully meets the requirements for functionality and maintaining the appropriate hypoxic environment, there are still limitations to the current design. One such limitation is not having a controllable time for reaching the desired setpoints. Currently, the system has a set time to reach O 2 and CO 2 setpoints within approximately 30 min. However, this can be tuned using the PID controller and may need to be customized for each application.

7.4.2)
There is no direct control over the temperature or humidity within the chamber, only passive control through the ambient temperature and the water tray. Thus, for mammalian cell culture, this hypoxia chamber cannot be used independently of a cell culture incubator. 7.4.3) The CO 2 sensor was benchmarked against the 5% CO 2 concentration of the cell culture incubator. Similarly, the O 2 sensor was evaluated by benchmarking it against atmospheric levels of O 2, and when it was placed inside a closed container with a lit candle. Initially the O 2 concentration was at atmospheric levels, but as the candle burned O 2 concentration approached zero until the candle was extinguished. A more rigorous multi-point calibration could be warranted.

Recommended changes
The initial design of the hypoxia chamber used laser-cut acrylic sheets that could be assembled to create a custom chamber (Fig. 15). The acrylic sheets were to be held together using a series of dovetail joints sealed with Epoxy and 3D printed corner pieces for stability. A single modified sheet of acrylic could then be combined with an O-ring and external hinges to create an airtight door. Internal chamber housing (e.g., shelves, water tray, electronic) and gas/wiring inputs/outputs would be in the same locations as our final design, as outlined above. The Acrylic was initially selected for its transparency and affordability. Unfortunately, prototype testing found that laser-cut acrylic edges are prone to crazing when in contact with ethanol (which is commonly used for sterilization), compromising the material. However, a different material, such as polycarbonate, could potentially be used in place of acrylic with minimal modifications to the design to resolve these issues. As such, the initial design files can be found in 'Custom Chamber' section for future use and/or modification. Additionally, to evaluate the configuration of a custom chamber design it may be helpful to simulate gas flow (see Supplemental Materials and Fig. S1 for an example). The efficacy of polycarbonate was not assessed because it did not fulfill our design criteria, namely affordability and ease-of-access (i.e., polycarbonate requires milling vs laser-cutting). Thus, the idea to use a premade plastic container was pursued for the final design.
Helpful modifications to the GUI may include adding real-time graphing and remote connectivity. With the current design, stored CSV files created during use of the chamber can later be collected and uploaded to an appropriate program (such as Microsoft Excel) to generate plots and conduct analysis after the experiment has ended. Though the GUI provides real-time reading, real-time graphing of O 2 and CO 2 levels would allow instant troubleshooting and assist in monitoring for potential gas fluctuations throughout the duration of the experiment. Similarly, incorporating remote connectivity with the GUI would benefit efficiency. Remote connectivity could allow users to monitor the system from afar during an experiment. Incorporating remote connectivity with system notifications could, for example, notify if the pressure limits have been exceeded within the chamber or if the system is detecting gas leakage. Potential methods to incorporate this include using a Python program to create a web application that could be accessed remotely or creating an email and/or SMS notification system. Note that both methods require internet connectivity.  Other adjustments include reworking the sensor housing and creating a second PCB for the sensors in order to reduce clutter within the sensor housing. A second PCB would have pin headers in the appropriate places so that the O 2 sensor could plug in, and the CO 2 sensor board could be connected via a ribbon cable. These pin headers would then be routed to an ethernet connector like the one on the PCB that was made for the Arduino. This ethernet connector would then exit the wall of the chamber directly, so that the two PCBs would be connected by a single ethernet cable, effectively removing the need for the through-wall ethernet and breakout adapters. However, the sensor housing itself would need to be redone to accommodate the PCB and ensure that the ethernet connector could exit, which would require another hole to be drilled into the chamber. This redesign could minimize in-housing wiring, ensure good connections to the sensors, and securely hold the sensors in place.
It is also possible to change the design so that an Arduino is not necessary. This could have been done by using the Raspberry Pi 4 0 s ability to support multiple universal asynchronous receiver-transmitter (UART) devices. Using multiple UART devices we could eliminate the need for an Arduino, possibly reducing the cost of the overall system.
Additionally, the shelf could be made from a variety of materials, not just aluminum. In this case, an aluminum shelf was utilized due to ease of access. As long as the material can be sterilized or disinfected, and is compatible with the incubator environment, it can be used in the design (e.g., a 3D printed shelf).

Future work
Overall, we demonstrated a low-cost, open-source, and controllable hypoxia chamber that can fit inside a standard cell culture incubator. Thus, this system can be easily reproduced in other laboratories to advance future work in tissue engineering and regenerative medicine, novel drug discovery and cancer therapies, and cell and tissue pathogenesis. As the system can easily be customized based on the foundation we provided, it could be modified to fit animal cages for conducting in vivo hypoxia studies. Our future research using this hypoxia chamber will be aimed at elucidating the specific downstream targets of HIF-1a for applications in tissue engineering and identifying the impacts of physiological O 2 levels on other potential signaling pathways and differentiation in stem cells.

Human and animal rights
No human or animal studies were conducted in this work.

Declaration of Competing Interest
The authors whose names are listed certify that they have NO affiliations with or involvement in any organization or entity with any financial interest.