First pass at air purifier

This commit is contained in:
Kienan Stewart 2025-09-01 08:33:17 -04:00
parent a13d6233f0
commit 984c659675
2 changed files with 103 additions and 0 deletions

103
air purifier.scad Normal file
View File

@ -0,0 +1,103 @@
filter_x = 368; // mm
filter_y = 494; // mm
filter_z = 44; // mm
module filter() {
// https://airfiltration.ca/collections/pleated-merv-plus/products/merv-13-2inch?variant=19413155348547
// merv-13 15x20x2
cube([filter_x, filter_y, filter_z]);
};
fan_box_x = 255; // mm
fan_box_y = 130; // mm
fan_box_z = 43; // mm
module fan_box() {
cube([fan_box_x, fan_box_y, fan_box_z]);
};
fan_mounting_hole_radius = 3; // mm
fan_mounting_hole_length = 56; // mm
module fan_plate_mounting_hole() {
// 56 mm length, which is 50mm between circle centers
hull() {
circle(fan_mounting_hole_radius, $fn=360);
translate([fan_mounting_hole_length - 2*fan_mounting_hole_radius, 0, 0]) {
circle(fan_mounting_hole_radius, $fn=360);
}
};
}
fan_plate_x = 353; // mm
fan_plate_y = 229; // mm
fan_plate_z = 1; // mm
module fan_plate() {
linear_extrude(fan_plate_z) {
difference() {
offset(r=1, $fn=360) {
// 353x229 but reduced for offset
square([fan_plate_x-1, fan_plate_y-1]);
}
// @TOOD: Fix the translation values
translate([10, 10, 0]) { rotate([0, 0, 45]) { fan_plate_mounting_hole();
}; };
translate([10, 218, 0]) { rotate([0, 0, -45]) { fan_plate_mounting_hole();
}; };
translate([310, 180, 0]) { rotate([0, 0, 45]) { fan_plate_mounting_hole();
}; };
translate([300, 50, 0]) { rotate([0, 0, -45]) { fan_plate_mounting_hole();
}; };
};
};
};
fan_cable_spacing = 30; //mm
fan_box_offset_x = 48; // mm
fan_box_offset_y = 50; // mm
fan_box_offset_z = 1; // mm
module fan() {
// https://acinfinity.com/hvac-home-ventilation/exhaust-fans/crawlspace-basement-fans/airtitan-s7-crawlspace-fan-with-speed-controller-12-inch/
// AirTitan S7 crawlspace fan
union() {
translate([fan_box_offset_x, fan_box_offset_y, fan_box_offset_z]) {
fan_box();
};
fan_plate();
};
};
side_wall_x = 5; // mm
side_wall_y = fan_box_y + 2*filter_z + 2*fan_cable_spacing;
echo("Side wall:", side_wall_y, "by", side_wall_z);
side_wall_z = filter_y; // mm
module side_wall() {
// from rona
cube([side_wall_x, side_wall_y, side_wall_z], center=false);
}
#fan();
// leave 30mm for the power cable gland
// that comes off the fan_box
translate([-(filter_x - fan_plate_x)/2, filter_z - fan_cable_spacing , fan_plate_z]) {
rotate([90, 0, 0]) {
#filter();
}};
// leave 30mm for the power glang
// that comes off the fan_box
translate([-(filter_x - fan_plate_x)/2, fan_plate_y + fan_cable_spacing, fan_plate_z]) {
rotate([90, 0, 0]) {
#filter();
}};
translate([-2, -20, fan_plate_z]) {
#side_wall();};
translate([filter_x, -20, fan_plate_z]) {
#side_wall();};

Binary file not shown.