Léonard RousselElizabeth Henaff
Published © MIT

Real-time Microbiome Monitoring

Our environment includes an ubiquitous microbial component. We'll prototype a sensor which detects it in real time based on DNA signatures.

AdvancedWork in progress12 hours781
Real-time Microbiome Monitoring

Things used in this project

Hardware components

peristaltic pump
×1
General Purpose Transistor NPN
General Purpose Transistor NPN
×1
1N4007 – High Voltage, High Current Rated Diode
1N4007 – High Voltage, High Current Rated Diode
×1
phenolphtaleine
×1
Intel Edison
Intel Edison
×1
SparkFun Block for Intel® Edison - Arduino
SparkFun Block for Intel® Edison - Arduino
×1
Camera (generic)
×1
9V battery (generic)
9V battery (generic)
×2

Software apps and online services

Maker service
IFTTT Maker service
OpenCV
OpenCV

Hand tools and fabrication machines

Form Labs 3D printer

Story

Read more

Custom parts and enclosures

CAD files for microfluidic prototype

Print on Form2 with translucent resin

Schematics

Render of millifluidic device

plug it in
5aalg8poqe44qugc668i

Code

DNA detector

Python
This script runs the pump, camera, processes images with openCV and sends a text message with results via IFTTT
#!/usr/bin/env python

import mraa
import time
import numpy as np 
import cv2
import os


button = mraa.Gpio(6)
button.dir(mraa.DIR_IN)

pump = mraa.Gpio(11)
pump.dir(mraa.DIR_OUT)
pump.write(0)

led = mraa.Gpio(12)
led.dir(mraa.DIR_OUT)
led.write(0)

buzzer = mraa.Gpio(4)
buzzer.dir(mraa.DIR_OUT)
buzzer.write(0)

cap = cv2.VideoCapture(0)
ret, frame = cap.read()

# delays
pumpDelay = 45
soakDelay = 15

# iteration = 0


# define range of pink color in HSV
lower_pink = np.array([110,50,50])
upper_pink = np.array([130,255,255])


def captureImage():
        # Take each frame
        ret, frame = cap.read()
        print "read ret: " + str(ret)

        # Convert BGR to HSV
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        return hsv

def readImage(imgname):
        print "read image" + imgname
        img = cv2.imread(imgname,0)
        # Convert BGR to HSV
        hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
        return hsv


def calculatePinkPixels(image):
        mask = cv2.inRange(image, lower_pink, upper_pink)
        return cv2.countNonZero(mask)



def getButtonPress():
        while True:
                if (button.read() == 1):
			print "Button Pressed %f" % (time.time())
                        return
                else:
                        time.sleep(0.05)

def sendCurl(message):
        command = "curl -X POST -H \"Content-Type: application/json\" -d '{\"value1\":\"%s\"}' https://maker.ifttt.com/trigger/dnaDetected/with/key/cTs_Jqc-oa-NLl-jo6dKL1" % (message)
        os.system(command)

def chirpBuzz():
	buzzer.write(1)
	time.sleep(0.05)
        buzzer.write(0)

def takeMeasurement(iteration):
        print "...cap img 1"
        img1 = captureImage()
        # img1 = readImage("test_img#1.jpg")
        cv2.imwrite('/home/root/programs/it%d-img1.jpg' % (iteration), img1, [cv2.IMWRITE_JPEG_QUALITY, 90])
        
        print "...pump 1"
        pump.write(1)
        time.sleep(pumpDelay)

        print "...pump 0"
        pump.write(0)

        time.sleep(soakDelay)
        
        print "...cap img 2"
        img2 = captureImage()
        # img1 = readImage("test_img#2.jpg")
        cv2.imwrite('/home/root/programs/it%d-img2.jpg' % (iteration), img2, [cv2.IMWRITE_JPEG_QUALITY, 90])

        print "...calc pixels"
        diffPinkPixels = calculatePinkPixels(img2) - calculatePinkPixels(img1)
        print "...diff pink pixels %d" % (diffPinkPixels)

        if diffPinkPixels > 100:
                message = "DETECTED"
        else:
                message = "UNDETECTED"

        print "...send curl"
        sendCurl(message)

def run():
        iteration = 0
        while True:
                getButtonPress()

                print "buttonPressed"
                led.write(1)
                print "led on"
                print "start measurement"
                takeMeasurement(iteration)
                print "end measurement"
                led.write(0)
                iteration = iteration + 1



def end():
        print "releasing camera"
        cap.release()        
        

try:
        run()
finally:
        end()

Credits

Léonard Roussel

Léonard Roussel

1 project • 0 followers
Acoustic engineer, sound designer. Grew up in Europe, live in NYC, want to do more sound art by adding behavior to physical or artificial objects.
Elizabeth Henaff

Elizabeth Henaff

1 project • 0 followers

Comments