Skip to main content

Pioreactor air bubbler

Add an air-pump / bubbler to your Pioreactor. By default, the pump runs in short bursts: 1 second on, followed by at least 30 seconds off. OD dodging can interrupt or delay a burst; it does not trigger extra bursts.

Usage

pio run air_bubbler

Override pump strength, burst timing, PWM frequency, and OD dodging for one run:

pio run air_bubbler --duty-cycle 15 --burst-duration 1 --rest-duration 60 --enable-dodging-od

Burst duration must be greater than zero and at most 2 seconds. Rest duration must be at least 30 seconds. These limits apply through config, CLI, and live settings. Pump strength is PWM duty cycle, separate from the burst/rest schedule.

Every burst ends with a full rest, even when OD reading stops it early. Missed bursts are not caught up. Stopping OD reading keeps burst operation active. Changing pump strength while resting does not start the pump. Changing burst duration stops an active burst; changing rest duration never shortens a rest already in progress.

These defaults and bounds are initial settings for bench validation, not validated foam-safe limits or a guarantee of sufficient oxygen transfer. Tune pump strength for modest bubbles and observe your culture. Software timing is subject to operating-system scheduling.

Continuous operation — advanced use only

The separate air_bubbler_continuous job has no burst/rest limits. Sustained bubbling can cause foaming, vial-cap leaks, and media-tube contamination. OD dodging alone does not prevent excessive aeration. Use this mode only for a setup where sustained aeration has been deliberately evaluated.

pio run air_bubbler_continuous

OD dodging still applies when enabled. Without active OD dodging, this job pumps continuously. Starting it emits a warning in the job log. It has no UI YAML descriptor and cannot be selected from the normal job UI. The visible air_bubbler job always uses bursts; there is no mode switch.

Both jobs use the same [PWM] assignment named air_bubbler. Stop one before starting the other; the PWM channel lock prevents a second job from claiming an occupied channel.

Continuous-job settings are independent, under [air_bubbler_continuous.config]:

[air_bubbler_continuous.config]
duty_cycle=10
hertz=200
pre_delay_duration=1.5
post_delay_duration=0.75
enable_dodging_od=1

The continuous command accepts --duty-cycle, --hertz, and the OD-dodging flags, but no burst/rest options. Its MQTT settings and job controls use air_bubbler_continuous.

Upgrade behavior: air_bubbler now always uses bursts, even if it previously ran continuously. Pump strength and OD-delay settings retain their configured values. For deliberate continuous operation, stop air_bubbler and start air_bubbler_continuous explicitly.

Installation

Software

From the command line, run:

pio plugins install pioreactor_air_bubbler

(Optional) Edit the following to your config.ini

[PWM]
<the PWM channel you pick>=air_bubbler

[air_bubbler.config]
duty_cycle=10
hertz=200
burst_duration=1
rest_duration=30
pre_delay_duration=1.5
post_delay_duration=0.75
enable_dodging_od=1

Hardware

  1. Connect the PWM channel to the air pump's power source.
  2. Connect a tube between the air pump and a tube in the vial's cap, via luer lock.
  3. The connecting tube in the vial cap can be pushed into the liquid for bubbling, or left in the headspace to exchange air.
  4. Optional: a 0.22 micron filter can be placed along the air path to filter contaminants.

Metadata

Release files for pioreactor-air-bubbler 0.13.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for pioreactor-air-bubbler 0.13.0
File Interpreter ABI Platform
pioreactor_air_bubbler-0.13.0-py3-none-any.whl Python 3 none any Details

Release files / pioreactor_air_bubbler-0.13.0-py3-none-any.whl

Download URL pioreactor_air_bubbler-0.13.0-py3-none-any.whl
Size 7.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0654f9ae1962dd294be399e6994e8d463a201300ce67149382762ad26ba213ee
BLAKE2b-256 checksum
How to use checksums
578407c430cc21addc3b007b5c269c9c12e1978d32ed7634cf8467a5a25716c6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.5

Release history Release notifications | RSS feed

0.13.1

1 release file

This release

0.13.0 This release

1 release file

0.12.1

1 release file

0.12.0

1 release file

0.10.0

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.5.0

1 release file

0.4.2

1 release file

0.4.1

1 release file

0.4.0

1 release file

0.3.3

1 release file

0.3.2

1 release file

0.3.1

1 release file

0.3.0

1 release file

0.2.0

1 release file

0.1.2

1 release file

0.1.1

1 release file

0.1.0

1 release file

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page