Float switch
From HacDC Wiki
This is the source code for the float switch 3d printed parts for the water level detector for the Cheap Chinese Laser. It is made in two parts: the head and the base. You also need 4 pieces of 1/4-20 all thread to connect the two of them and 8 nuts. The base is internally threaded. The head needs nuts top and bottom. Washers would be good too.
File:Float-switch-head.stl rendered on 5/1/2017
File:Float-switch-base.stl rendered on 5/7/2017
/*
low water level detector
safety interlock for cheap Chinese laser at Hac DC
This water level detector is a two piece assembly connected by threaded rod. This model uses 1/4-20 rod. The lower foot has a 40mm home in the bottom to insert a pingpong ball as the float.
James Sullivan
4-30-17
Mk 2 - calculated threads
OpenSCAD version 2015.03-1
*/
ppbd=40; //ping pong ball diameter
ppbw=2.7; //ping pong ball weight in grams
shd=2; //switch hole diameter
shp=10; //switch hole pitch, i.e. center to center spacing of mounting holes on microswitch
wlh=200; //water level height
sbw=6; //switch body width
nfw=4; //nut face width, switch mounting nuts
nt=1; //nut thickness, switch mounting nuts
thick=5; //thickness
eps=0.1; //epsilon
tol=0.5; //tolerance
br=50; //base radius
rod=25.4/4; //rod outer diameter
tpi=20; //threads per inch
fph=25.4*5/tpi;//foot pillar height
bfw=ppbd+2*thick; //base flange width
$fn=40;
function mod(num,den) = num - floor(num/den)*den;
//dimensions taken from Front Door Switch Holder
wr=4; //wrench size for nuts width across flats
nh=1; //nut height, depth of nut sockets
//head
module head() {
difference(){
union(){
for(angle=[45:90:315]){
rotate([0,0,angle]) translate([ppbd/2+rod/2+tol,0,0]) cylinder(d=rod+thick*2,h=thick); //leg cylinders
}
cylinder(h=thick,r=ppbd/2+rod/2+tol-thick/2);
}
translate([0,0,-thick/2]) cylinder(h=thick*2,r=ppbd/2+rod/2+tol-3*thick/2);
for(angle=[45:90:315]){
rotate([0,0,angle]) translate([ppbd/2+rod/2+tol,0,-thick/2]) cylinder(d=rod,h=fph); //leg holes
}
}
translate([sbw/2,(ppbd+rod+tol-2*thick)/(-2),0]) cube([thick,ppbd+rod+tol-2*thick,thick]);
translate([sbw/2,shp/2,thick]) difference(){ //switch mounting block, aligned with z-plane and x-plane, centered on y-plane
translate([0,-shp/2-nfw,0]) color("green") cube([thick,shp+2*nfw,2*nfw]);
for (y=[-shp/2,shp/2]) {
translate([thick/2,y,nfw]) rotate([0,90,0]) cylinder(d=shd,h=thick*2,center=true); //screw holes
translate([sbw-nh,y,nfw]) union(){ //nut sockets
for (ang=[0,120,240]) rotate([ang,0,0]) cube([nh*2,wr,wr/sqrt(3)],center=true);
}
}
translate([sbw/2+thick,bfw/2-nfw-shp,nfw]) union(){ //center nut socket
cube([nh*2,wr,wr/sqrt(3)],center=true);
rotate([120,0,0]) cube([nh*2,wr,wr/sqrt(3)],center=true);
rotate([240,0,0]) cube([nh*2,wr,wr/sqrt(3)],center=true);
}
}
}
module socket(nd,tpi,tl,thick) {
//nd = nominal diameter
//tpi = threads per inch
//tl = thread length
ror=nd/2; //rod outer radius
pitch=25.4/tpi; //thread pitch in mm
td=pitch*3/4; //thread depth in mm
rir=ror-td; //rod inner radius
sor=ror+thick; //socket outer radius
vert= [for (ang=[0:360/$fn:720]) ang<=45 ? [cos(ang),sin(ang)]*rir : ang<180 ? [cos(ang),sin(ang)]*(rir+td*(ang-45)/135) : ang<=225 ? [cos(ang),sin(ang)]*ror : ang<360 ?[cos(ang),sin(ang)]*(rir+td*(360-ang)/135) : [cos(ang),sin(ang)]*sor];
path1=[for(p=[0:$fn]) mod(p,$fn) ];
path2=[for(p=[0:$fn]) mod(p,$fn)+$fn ];
difference(){
linear_extrude(height=tl,center=false,convexivity=20,twist=tl/25.4*tpi*360){
polygon(points=vert,paths=[path1,path2]);
}
translate([0,0,tl-ror*tan(30)]) cylinder(r2=ror,r1=0,h=ror*tan(30)); //inlet chamfer
}
}
//foot
module foot(){
difference(){
union(){
translate([0,0,thick/2]) cube([ppbd+2*thick,ppbd+2*thick,thick],center=true);
for (angle=[45:90:315]){
rotate([0,0,angle]){
translate([ppbd/2+rod/2+tol,0,thick]) socket(rod,tpi,fph,thick); //pillar
translate([0,-thick,0]) cube([br-thick,thick*2,thick]); //leg
translate([br-thick,0,0]) cylinder(r=thick,h=thick); //foot
} //end rotate
} //end for
} //end union
translate([0,0,-eps/2]) cylinder(d=ppbd+tol,h=fph+eps+thick); //ping pong ball entry
} //end difference
} //end foot module
foot();
//head();
