Flow-Through Photometer

Flow-Through Photometer © CERN-OHL

Ultra low-cost flow-through photometer for on-line measurements of bacterial density.

  • 851 views
  • 3 comments
  • 11 respects

Components and supplies

Apps and online services

About this project

This module comprises the development of a flow-through photometer and temperature sensor unit for the determination of culture density and temperature.

Design Goals

  • Continuous density measurements
  • Easy to (dis-)assemble
  • Good culture density resolution

Main Idea

The culture is constantly pumped (peristaltic pump) through a glass tube where the OD is constantly measured. The photometer unit is based on a single module of the test tube photometer.

Main Components

  • Arduino or similar microcontroller You need something to read the analog input of the sensors in a measuring routine. I used an Arduino Nano.
  • LCD display This one is optional but nice if you instantly want to see the measured values. It is useful for easy calibration and for discontinuous measurements with the photometer. You can use any available LCD which works well with the microcontroller. I used a standard HD44780 16x2 LCD Display and a I2C backpack.
  • Measuring cell All the components you need to build a measuring cell are listed below.
  • Pasteur pipette tube Be carful not to cut yourself while you prepare your pasteur pipette! Carefully remove the tip of the pipette and melt the edges with heat.
  • Housing Well, this is optional too but it helps to keep the electronics save!

Measuring cell components

  • Cell housing and housing cover You can find the 3D models in this repository. The housing has slots for the LED and the photodiode, which are fixed with the housing cover. If you do not have access to a 3D printer you can find service providers online. I printed it with standard black PLA and I recommend you to use black material, too, because it improves sensitivity of the system significantly. You might have to adjust the parameters of the housing to fit with your pasteur pipette tube!
  • LED It is really important to use a high quality LED because it determines the wavelength you are measuring with. I used a 600 nm LED from Roithner LaserTechnik. If you prefer to measure at a different wavelength choose your LED accordingly!
  • Photodiode This is the heart of the measuring cell. I used an opt101 from Texas Instruments because it contains an on-chip operational amplifier, and responds to light in the range of 300–1100 nm (linear dependence between 400–800 nm!). I added a external potentiometer to achieve a DC gain of up to 2 million volts per ampere to optimize the output voltages.

Build instructions

  • Assemble the cell housing The housing consists out of two parts, the main body and a sleeve. There are two respective holes in the main body in which you can place the sensor and the LED. Slowly pull the sleeve over the main body with the LED and Sensor pins sticking out (see picture above). Please remember the sensor orientation for the correct wiring of the pins!
  • Wiring Now you can start and solder wires to the sensor an LED pins. If you have problems soldering the sensor pins with the housing assembled you can remove the sensor, solder the wires and then assemble the housing. But then you might have to use some force to fit the soldered pins through the gaps. I labeled each wire to make it easier for me to connect them later.

You should end up with five wires from the sensor:

Power (V, pin 1)

Input/Additional Feedback (-In, pin 2)

Power/Ground (-V, pin 3)

Output (Output, pin 5)

Input/Ground (Common, pin 8)

  • Connect it to the microcontroller Connect sensor pin 1 to 5V, pin 3 and 8 to ground. Sensor pin is connected to pin 5 with a potentiometer (or 1 MΩ resistor) in between (see circuit diagram on the right). You can now connect the sensor output (pin 5) to any analog input pin of your microcontroller and you are ready to measure light. Speaking of light, you still have to connect the LED with one of the digital output pins of the microcontroller to switch the light on and off.
  • Insert the pasteur pipette tube Attach tubing to the smaller end of the pasteur pipette tube and insert it into the measuring cell. Try and position it completely inside the cell. The tube should be fixed inside (conical ending)!

  • Assemble the complete module Insert the measuring cell into the housing and attach the LCD display to the housing lid. Connect the LCD and the temperature sensor to the microcontroller and arrange everything inside the housing.

Usage

The finished module can be attached to any peristaltic pump which fits the tube size (we used 6 mm tubing). Both ends of the tubing are inserted into the culture and the liquid should be pumped through the measuring cell. For data transfer the microcontroller can be connected to a single-board computer via a serial connection.

Code

measure_v5.inoArduino
Code for running the photometer. It includes the optional blank button which has to be pressed withing the first 10 seconds. Otherwise the photometer will display the raw signal and send this data via serial to any connected device.
#include <OneWire.h>
#define ONE_WIRE_BUS 4
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x3F, 16, 2);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

float darksig = 0;
float lightsig = 0;
float total_signal = 0;
float total = 0;
float temp = 0;
float blank = 0;
float blanksignal = 0;

bool blanked = false;

int sensor = A0;  // output pin of OPT101 attached to Analog 0
int LEDpin = 2;    // LED + attached to D2
int Buttonpin = 3; // Button attached to D3
int buttonState = 0;

int counter = 0;

void setup() {
  pinMode(Buttonpin, INPUT);
  Serial.begin(9600);
  delay(100);
  // initialize the LCD
  lcd.begin();
  // Turn on the blacklight and print a message.
  lcd.backlight();
  counter = 10;
  for (int dummy = 0; dummy < 10; dummy++)
  {

    buttonState = digitalRead(Buttonpin);
    if (buttonState == HIGH){
      counter = 20;
      for (int dummy = 0; dummy < 10; dummy++){
        lcd.setCursor(0, 0);
        lcd.print("                            ");
        lcd.setCursor(0, 1);
        lcd.print("                            ");
        lcd.setCursor(0, 0);
        lcd.print("Done in: ");
        lcd.print(counter);
        lcd.setCursor(0, 1);
        lcd.print("Blanking...");
        blanksignal = ODblank(1);
        blank = blank + blanksignal;
        
        counter = abs(counter - 1);
      }
      blanked = true;
      break;
    } else {
      blanked = false;
    }
     
    lcd.setCursor(0, 0);
    lcd.print("                            ");
    lcd.setCursor(0, 1);
    lcd.print("                            ");
    
    lcd.setCursor(0, 0);
    lcd.print("Starting in: ");
    lcd.print(counter);
    counter = abs(counter - 1);
    lcd.setCursor(0, 1);
    lcd.print("Press for blank!");
    delay(1000);
  }
  lcd.setCursor(0, 0);
  lcd.print("                                  ");
  lcd.setCursor(0, 0);
  lcd.print("Signal: ");

  lcd.setCursor(0, 1);
  lcd.print("                                  ");
  lcd.setCursor(0, 1);
  lcd.print("Temp: ");
  
  pinMode (2, OUTPUT); //for cell 1 LED
  delay(1000);
}

void loop() {
  delay(100);
  
  ODmeasurement(10);
  Serial.print(',');
  TEMPmeasurement();
  Serial.print('\n');
   
  delay(100);
}

float ODblank(int multiplier) {
  darksig = 0;
  digitalWrite(LEDpin, LOW); //ensures cell 1 LED is off!!!!
  for (int dummy = 0; dummy < multiplier; dummy++)
  {
    delay(100);
    darksig = abs(darksig + analogRead(sensor));
    delay(100);
  }
  delay(100);

  lightsig = 0;
  digitalWrite(LEDpin, HIGH); //turns exp LED on
  delay(1000);
  for (int dummy = 0; dummy < multiplier; dummy++)
  {
    delay(100);
    lightsig = (lightsig + analogRead(sensor));
    delay(100);
  }
  delay(100);
  digitalWrite(LEDpin, LOW); //ensures cell 1 LED is off!!!!
  delay(1000);
  
  total_signal = abs(lightsig - darksig)/multiplier;
  return total_signal;
}

void ODmeasurement(int multiplier) {
  darksig = 0;
  digitalWrite(LEDpin, LOW); //ensures cell 1 LED is off!!!!
  for (int dummy = 0; dummy < multiplier; dummy++)
  {
    delay(100);
    darksig = abs(darksig + analogRead(sensor));
    delay(100);
  }
  delay(100);

  lightsig = 0;
  digitalWrite(LEDpin, HIGH); //turns exp LED on
  delay(1000);
  for (int dummy = 0; dummy < multiplier; dummy++)
  {
    delay(100);
    lightsig = (lightsig + analogRead(sensor));
    delay(100);
  }
  delay(100);
  digitalWrite(LEDpin, LOW); //ensures cell 1 LED is off!!!!
  delay(1000);
  
  total_signal = abs(lightsig - darksig);

  

  lcd.setCursor(0, 0);
  lcd.print("                                  ");
  lcd.setCursor(0, 0);
  lcd.print("Signal: ");
  if(blanked == true){
    total = -log10(total_signal/(blank*multiplier));
    lcd.print(total);
    lcd.print(" OD");
    delay(100);
    Serial.print(total);
  }
  else {
    lcd.print(total_signal);
    delay(100);
    Serial.print(total_signal);
  }
}

void TEMPmeasurement() 
{
  delay(500) ; 
  sensors.requestTemperatures(); // Send the command to get temperature readings
  temp = sensors.getTempCByIndex(0);
  
  lcd.setCursor(0, 1);
  lcd.print("                                  ");
  lcd.setCursor(0, 1);
  lcd.print("Temp: ");
  lcd.print(temp);
  lcd.print(" C");
  Serial.print(temp);
} 

Comments

Similar projects you might like

Stereo NeoPixel Ring VU Meter

Project showcase by ericBcreator

  • 29,176 views
  • 268 comments
  • 70 respects

Morse Code Receiver

Project showcase by Alireza Karkon

  • 3,385 views
  • 5 comments
  • 23 respects

Sun and Moon Times

by Alexander

  • 9,162 views
  • 11 comments
  • 32 respects

Microbial Bioreactor

Project in progress by Team Open Bioeconomy Lab

  • 7,418 views
  • 11 comments
  • 40 respects

Little Rover

Project tutorial by Jeremie

  • 4,259 views
  • 7 comments
  • 17 respects
Add projectSign up / Login