User Tools

Site Tools


projects:lasercutterfilterpdmonitor

Laser Cutter Exhaust Filter Pressure Drop Monitor

Purpose

  • Monitor the performance and effectiveness of filters
  • Determine end of life for filter media
  • Help determine when to order new filters

History

  • Built/tested 11/25/18
  • Installed 12/09/18

Readings

Date Stage 1 PD Stage 2 PD Stage 3 PD Comments
12/12/18 0.40 2.15 0.90
12/15/18 0.17 1.18 0.56
12/29/18 0.19 1.25 0.54
01/02/19 0.22 1.20 0.62
01/12/19 0.28 1.16 0.32 Markus changed out the Stage 1 filter

All values measured in inches of water column (in.w.c.)
The analog signals read the following when no air is flowing (Stg1=-0.26, Stg2=-0.28, Stg3=-0.24)
Analog signal correction factors are not included in the code just yet because I am le tired

Design/Construction

  • Designed/built by BrantH
  • Uses three differential pressure transducers, 5 VDC, 20 mA
  • Custom shield (a very crappy perforated board with several wire/solder connections)
  • Scrap metal enclosure box is a salvaged air conditioner relay box from Brant's attic
  • Arduino Uno v.3 with code borrowed from various sources ( Smoothing by David A. Mellis, LCD Library by Limor Fried and Tom Igoe )
  • Arduino takes 10 readings from each sensor, averages them, then displays the average, updates once every second
/*
  LiquidCrystal Library - display() and noDisplay()
 
 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the 
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 
 This sketch prints "Hello World!" to the LCD and uses the 
 display() and noDisplay() functions to turn on and off
 the display.
 
 The circuit:
 * LCD RS pin 4 to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe 
 modified 22 Nov 2010
 by Tom Igoe

 This example code is in the public domain.

 http://arduino.cc/en/Tutorial/LiquidCrystalDisplay

 */

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 10, 9,8,7,6,5,4,3,2);

int sensorAPin = A1;    
int sensorBPin = A2;    
int sensorCPin = A3;    
double PDA = 0;
double PDB = 0;
double PDC = 0;

const int numReadingsA = 10;
int readingsA[numReadingsA];      // the readings from the analog inputs
int readIndexA = 0;              // the index of the current readings
int totalA = 0;                  // the running total
int averageA = 0;                // the average

const int numReadingsB = 10;
int readingsB[numReadingsB];      // the readings from the analog inputs
int readIndexB = 0;              // the index of the current readings
int totalB = 0;                  // the running total
int averageB = 0;                // the average

const int numReadingsC = 10;
int readingsC[numReadingsC];      // the readings from the analog inputs
int readIndexC = 0;              // the index of the current readings
int totalC = 0;                  // the running total
int averageC = 0;                // the average

void setup() {




  for (int thisReading = 0; thisReading < numReadingsA; thisReading++) {
  readingsA[thisReading] = 0;
 
}

}

void loop() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(20, 4);
  // Print a message to the LCD.
  lcd.print("Filter PD Monitor   ");
  lcd.print("Stage2: ");
  lcd.print(PDB);
  lcd.print(" in.w.c.");
  lcd.print("Stage1: ");
  lcd.print(PDA);
  lcd.print(" in.w.c.");
  lcd.print("Stage3: ");
  lcd.print(PDC);
  lcd.print(" in.w.c.");

  // SENSOR A
  // subtract the last reading:
  totalA = totalA - readingsA[readIndexA];
  // read from the sensor:
  readingsA[readIndexA] = analogRead(sensorAPin);
  // add the reading to the total:
  totalA = totalA + readingsA[readIndexA];
  // advance to the next position in the array:
  readIndexA = readIndexA + 1;
  // if we're at the end of the array...
  if (readIndexA >= numReadingsA) {
    // ...wrap around to the beginning:
    readIndexA = 0;}
  // calculate the average:
  averageA = totalA / numReadingsA;

  // SENSOR B
  // subtract the last reading:
  totalB = totalB - readingsB[readIndexB];
  // read from the sensor:
  readingsB[readIndexB] = analogRead(sensorBPin);
  // add the reading to the total:
  totalB = totalB + readingsB[readIndexB];
  // advance to the next position in the array:
  readIndexB = readIndexB + 1;
  // if we're at the end of the array...
  if (readIndexB >= numReadingsB) {
    // ...wrap around to the beginning:
    readIndexB = 0;}
  // calculate the average:
  averageB = totalB / numReadingsB;
  // send it to the computer as ASCII digits

    // SENSOR C
  // subtract the last reading:
  totalC = totalC - readingsC[readIndexC];
  // read from the sensor:
  readingsC[readIndexC] = analogRead(sensorCPin);
  // add the reading to the total:
  totalC = totalC + readingsC[readIndexC];
  // advance to the next position in the array:
  readIndexC = readIndexC + 1;
  // if we're at the end of the array...
  if (readIndexC >= numReadingsC) {
    // ...wrap around to the beginning:
    readIndexC = 0;}
  // calculate the average:
  averageC = totalC / numReadingsC;
  // send it to the computer as ASCII digits


  PDA = (averageA / 1023.00 * 5.00);
  PDB = (averageB / 1023.00 * 5.00);
  PDC = (averageC / 1023.00 * 5.00);
  delay(1000);

}
projects/lasercutterfilterpdmonitor.txt · Last modified: 2019/01/14 05:14 by branth