This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
projects:lasercutterfilterpdmonitor [2018/12/15 15:29] branth [Design/Construction] |
projects:lasercutterfilterpdmonitor [2024/01/08 13:35] (current) branth [Readings] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Laser Cutter Exhaust Filter Pressure Drop Monitor ====== | ====== Laser Cutter Exhaust Filter Pressure Drop Monitor ====== | ||
- | {{: | + | {{: |
- | {{: | + | {{: |
- | {{: | + | |
===== Purpose ===== | ===== Purpose ===== | ||
* Monitor the performance and effectiveness of filters | * Monitor the performance and effectiveness of filters | ||
Line 10: | Line 9: | ||
* Built/ | * Built/ | ||
* Installed 12/09/18 | * Installed 12/09/18 | ||
+ | * Removed ??? | ||
+ | * Revamped 7/27/23 | ||
===== Readings ===== | ===== Readings ===== | ||
- | ^ Date ^ Stage 1 PD ^ Stage 2 PD ^ Stage 3 PD ^ | + | ^ Date ^ Stage 1 PD ^ Stage 2 PD ^ Stage 3 PD ^ Comments |
- | |12/ | + | |12/ |
- | |12/ | + | |12/15/18| 0.17 | 1.18 | 0.56 | | |
+ | |12/ | ||
+ | |01/ | ||
+ | |01/ | ||
+ | |01/ | ||
+ | |01/ | ||
+ | |01/ | ||
+ | |02/ | ||
+ | |03/ | ||
+ | |03/ | ||
+ | |03/ | ||
+ | |03/ | ||
+ | |03/ | ||
+ | |03/ | ||
+ | |05/ | ||
+ | |07/ | ||
+ | |07/ | ||
+ | |08/ | ||
+ | |10/ | ||
+ | |01/ | ||
+ | |?| ? | ? | ? | Removed| | ||
+ | |07/ | ||
+ | |08/ | ||
+ | |09/ | ||
+ | |09/ | ||
+ | |09/ | ||
+ | |09/ | ||
+ | |10/ | ||
+ | |10/ | ||
+ | |12/ | ||
+ | |12/ | ||
+ | |01/ | ||
+ | |01/ | ||
All values measured in inches of water column (in.w.c.)\\ | All values measured in inches of water column (in.w.c.)\\ | ||
- | Measurements include pressure sensor correction factors | + | The signals used to read this when no air was flowing |
+ | Signal calibration factors are now included in the programming\\ | ||
===== Design/ | ===== Design/ | ||
* Designed/ | * Designed/ | ||
* Uses three differential pressure transducers, | * Uses three differential pressure transducers, | ||
- | * [[https://www.sciplus.com/ | + | * [[https:// |
* [[http:// | * [[http:// | ||
- | * Arduino Uno v.3 with code borrowed from various sources | ||
* Custom shield (a very crappy perforated board with several wire/solder connections) | * 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' | * Scrap metal enclosure box is a salvaged air conditioner relay box from Brant' | ||
+ | * 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() | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | can usually tell them by the 16-pin interface. | ||
+ | |||
+ | This sketch prints "Hello World!" | ||
+ | | ||
+ | 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) | ||
+ | |||
+ | | ||
+ | by David A. Mellis | ||
+ | | ||
+ | by Limor Fried (http:// | ||
+ | | ||
+ | by Tom Igoe | ||
+ | | ||
+ | by Tom Igoe | ||
+ | This example code is in the public domain. | ||
+ | |||
+ | | ||
+ | |||
+ | */ | ||
+ | |||
+ | // include the library code: | ||
+ | #include < | ||
+ | |||
+ | // initialize the library with the numbers of the interface pins | ||
+ | LiquidCrystal lcd(12, 11, 10, 9, | ||
+ | |||
+ | int sensorAPin = A1; | ||
+ | int sensorBPin = A2; | ||
+ | int sensorCPin = A3; | ||
+ | double PDA = 0; | ||
+ | double PDB = 0; | ||
+ | double PDC = 0; | ||
+ | |||
+ | int lifeA = 0; | ||
+ | int lifeB = 0; | ||
+ | int lifeC = 0; | ||
+ | |||
+ | |||
+ | const int numReadingsA = 10; | ||
+ | int readingsA[numReadingsA]; | ||
+ | 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]; | ||
+ | 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]; | ||
+ | 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; | ||
+ | readingsA[thisReading] = 0; | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | // set up the LCD's number of columns and rows: | ||
+ | lcd.begin(20, | ||
+ | // Print a message to the LCD. | ||
+ | | ||
+ | lcd.setCursor(0, | ||
+ | lcd.print(" | ||
+ | |||
+ | lcd.setCursor(0, | ||
+ | lcd.print(" | ||
+ | lcd.print(PDA); | ||
+ | lcd.print(" | ||
+ | lcd.print(lifeA); | ||
+ | lcd.print(" | ||
+ | | ||
+ | lcd.setCursor(0, | ||
+ | lcd.print(" | ||
+ | lcd.print(PDB); | ||
+ | lcd.print(" | ||
+ | lcd.print(lifeB); | ||
+ | lcd.print(" | ||
+ | | ||
+ | lcd.setCursor(0, | ||
+ | lcd.print(" | ||
+ | lcd.print(PDC); | ||
+ | lcd.print(" | ||
+ | lcd.print(lifeC); | ||
+ | lcd.print(" | ||
+ | |||
+ | //adjust for sensor calibration | ||
+ | PDA = abs((averageA / 1023.00 * 5.00) - 0.27); | ||
+ | PDB = abs((averageB / 1023.00 * 5.00) - 0.28); | ||
+ | PDC = abs((averageC / 1023.00 * 5.00) - 0.25); | ||
+ | |||
+ | // 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 | ||
+ | |||
+ | //end of life filter section pressure drops | ||
+ | int deadA = 200; //can filter | ||
+ | int deadB = 150; //HEPA | ||
+ | int deadC = 80; //entry | ||
+ | |||
+ | // estimate remaining life | ||
+ | lifeA = (PDA*100 / deadA) * 100; | ||
+ | lifeB = (PDB*100 / deadB) * 100; | ||
+ | lifeC = (PDC*100 / deadC) * 100; | ||
+ | |||
+ | |||
+ | delay(1000); | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | Old photos:\\ | ||
+ | {{: | ||
+ | {{: | ||
+ | {{: |