$fa = 0.5; $fs = 0.5; esp_w = 26; esp_l = 34.5; esp_t = 4.8; esp_tt = 8; wall = 2; overlap = 9.5; // Pir sizes pirL = 33; pirH = 25; pirP = 15; pirHole = 24; screw_holes = [ [esp_w - overlap / 2, overlap / 2], [overlap / 2, esp_l + overlap * 0.5] ]; // color("WHITE") // entire_case(); rotate([180, 0, 0]) lid(); //case(); //entire_case(); //mount(); //pir(); module mount() { union() { difference() { minkowski() { cube([esp_w, esp_l + overlap, 12]); sphere(r = wall * 2); } minkowski() { cube([esp_w, esp_l + overlap, 12]); sphere(r = wall + 0.1); } translate([esp_w / 2, (esp_l + overlap) / 2 + 1.1, -4.08]) cylinder(d1 = 4.3, d2 = 7.3, h = 2); // ================ 0.2 translate([-5, -5, 2]) cube([100, 100, 100]); translate([-5, -5, -5]) cube([100, esp_l / 2 + 6, 100]); translate([-5, esp_l / 2 + 10.7, -5]) cube([100, esp_l / 2 + 5, 100]); // ================ 0.1 // translate([-0.5, -10, -wall]) // cube([esp_w + 1, esp_l + overlap, 30]); // translate([-0.5, -10, -wall]) // cube([esp_w - 3, esp_l + overlap + 20, 30]); // translate([-10, 4, -wall]) // cube([esp_w + 20, esp_l + overlap - 8, 30]); // translate([5, 10, -wall]) // cube([esp_w + 20, esp_l + overlap - 10, 30]); } // =================== 0.2 translate([-2, esp_l / 2 + 3, 2]) difference() { scale([0.5, 1, 1]) sphere(r = 1.5); translate([-5, -5, 0]) cube([10, 10, 10]); } translate([-2, esp_l / 2 + 8.7, 2]) difference() { scale([0.5, 1, 1]) sphere(r = 1.5); translate([-5, -5, 0]) cube([10, 10, 10]); } translate([esp_w + 2, esp_l / 2 + 3, 2]) difference() { scale([0.5, 1, 1]) sphere(r = 1.5); translate([-5, -5, 0]) cube([10, 10, 10]); } translate([esp_w + 2, esp_l / 2 + 8.7, 2]) difference() { scale([0.5, 1, 1]) sphere(r = 1.5); translate([-5, -5, 0]) cube([10, 10, 10]); } } } module entire_case(){ case(); translate([0,0,20]) lid(); } /** tsl sensor ** color("GRAY") translate([esp_w, esp_l + overlap, esp_t + 6 - 1.6]) rotate([0, 0, 180]) tsl2561(); /* */ /** dht sensor ** color("GRAY") translate([15.4, 25.3 + pirH, esp_t + 6 - 1.6]) rotate([0, 0, 180]) dht22(); /* */ module lid(){ union(){ difference() { // base minkowski() { cube([pirL, esp_l + overlap+pirH, 13]); sphere(r = wall); } translate([-5, -5, -5]) cube([100, 100, esp_t + 6 + 5]); //tsl sensor difference(){ translate([esp_w, esp_l + overlap+pirH, esp_t + 6 - 0.6]) rotate([0, 0, 180]) tsl2561(); translate([esp_w, esp_l + overlap+pirH, esp_t + 6 - 0.6]) rotate([0, 0, 180]) cube([20, 11, 4]); } translate([esp_w - 5.5, esp_l + overlap - 4.1+pirH, esp_t + 6 - 0.1]) rotate([0, 0, 180]) cube([3, 2, 0.9]); //tsl sensor window translate([esp_w - 8.3, esp_l + overlap - 9.1+pirH, esp_t + 6 - 0.1]) hull(){ cube([3, 2, 0.1]); translate([-2.5, -3, 4]) cube([8, 8, 0.1]); } //dht sensor translate([15.4, 25.3+pirH, esp_t + 6 - 1.6]) rotate([0, 0, 180]) hull(){ difference() { dht22(); translate([0, 20.5, 0]) cube([20, 8, 5]); } sphere(r = 0.2); } //pir sensor translate([16.5, 12, esp_t + 6 - 1.6 - pirP+5]) rotate([0, 0, 180]) pir(); translate([wall + 0.3, 25.2+pirH, esp_t + 6 - 0.1]) cube([13.1, 5.1, 1.5]); //screws translate([0, pirH, 10]) cylinders(d = 3.2, h = 5, pos = screw_holes); translate([0, pirH, 13]) cylinders(d = 6, h = 5, pos = screw_holes); translate([0, pirH, 12.41]) cylinders(d2 = 6, d1 = 3.2, h = 0.6, pos = screw_holes); } } } module case(){ union() { difference() { // base minkowski() { cube([pirL, esp_l + overlap + pirH, 20]); sphere(r = wall); } //slot for esp translate([7, overlap+pirH, 0]) difference(){ cube([esp_w, esp_l, esp_t]); cube([esp_w, 4, 2.7]); translate([esp_w / 2 - 1.5, 0, 2.7]) cube([3, 1, 1]); } //chamfered edge for inserting esp translate([0, overlap+pirH, 0]) hull() { translate([0, 10, 0]) cube([pirL, esp_l - overlap, esp_t]); translate([0, 10, 0]) cube([pirL, esp_l - 10 - overlap, esp_t + 3.2]); } //hole to insert esp translate([0, overlap+pirH, 4]) cube([pirL, esp_l - overlap, 20]); //cut off the top translate([-10, -10, esp_t + 6]) cube([100, 100, 100]); //tsl sensor translate([esp_w+7, esp_l + overlap+pirH, esp_t + 6 - 1.6]) rotate([0, 0, 180]) tsl2561(); //dht sensor translate([15.4, 25.3+pirH, esp_t + 6 - 1.6]) rotate([0, 0, 180]) dht22(); //pir sensor translate([16.5, 12, esp_t + 6 - 1.6 - pirP+5]) rotate([0, 0, 180]) pir(); translate([0, 0+pirH, esp_t + 1]) cylinders(4.6, 6, screw_holes); //cross cut //translate([-5, -5, -5]) //cube([esp_w / 2 + 5, 100, 100]); //reset button translate([esp_w - 0.1 + 7, esp_l + overlap - 10 - 2 +pirH, 0]) cube([5, 10, 0.4]); translate([esp_w - 0.1 + 7, esp_l + overlap - 10 - 2 +pirH, 3.5]) cube([5, 10, 0.4]); translate([esp_w - 0.1 + 7, esp_l + overlap - 2+pirH, 0]) cube([5, 0.4, 3.9]); //usb port translate([9.75 + 7, esp_l + overlap - 1+pirH, 1.5]) hull(){ translate([1.75, 5, 0]) rotate([90, 0, 0]) cylinder(d = 3.5, h = 5); translate([7.5-1.75, 5, 0]) rotate([90, 0, 0]) cylinder(d = 3.5, h = 5); } //vents translate([-5, esp_l / 2 + 3+pirH, 0]) rotate([45, 0, 0]){ translate([16, 0, 0]) cube([100, 3, 3]); translate([16, -4, 4]) cube([100, 3, 3]); translate([16, -4, 8]) cube([100, 3, 3]); translate([0, 4, 0]) cube([100, 3, 3]); translate([0,4, 4]) cube([100, 3, 3]); translate([0, 0, 8]) cube([100, 3, 3]); translate([16, 0, 4]) cube([100, 3, 3]); translate([0, 4, -4]) cube([100, 3, 3]); translate([0, 8, -4]) cube([100, 3, 3]); translate([0, 8, 0]) cube([100, 3, 3]); } //extra sensor cable guide translate([7, -5+pirH, esp_t-1 ]) cube([4, 20, 3.6]); } //extra wemos positiong block translate([0, (pirH*2)+9, 0 ]) cube([7, 10, 3]); //extra pin to positioning translate([5, pirH + esp_l + overlap + 3, esp_t ]) rotate([90,0,0]) cylinder(r1=2,r2=3,h=4,center=true,$fn=96); translate([5, -3, esp_t ]) rotate([90,0,0]) cylinder(r1=3,r2=2,h=4,center=true,$fn=96); //reset button translate([esp_w - 0.9 + 7, esp_l + overlap - 6.5+pirH, 0.5]) hull() { translate([0, 0, 1]) cube([0.9, 4.5, 2]); translate([0.9, 0, 0]) cube([0.1, 4.5, 3]); } translate([esp_w + wall + 7, esp_l + overlap - 3.5+pirH, 2]) scale([0.5, 1, 1]) sphere(d = 3); } } module dht22() { dht_w = 15.4; dht_l = 20.3; dht_t = 8; dht_lip = 5; dht_lip_t = 1.7; union(){ cube([dht_w, dht_l, dht_t]); translate([0, dht_l, 0]) difference() { hull() { translate([0, -0.1, 0]) cube([dht_w, 0.1, dht_lip_t]); translate([(dht_w - 10.5) / 2, dht_lip - 0.1, 0]) cube([10.5, 0.1, dht_lip_t]); } translate([dht_w / 2, 2.4, -1]) cylinder(d = 2.8, h = 3); } } } module tsl2561(){ tsl_w = 13.4; tsl_l = 18.6; tsl_t = 1.6; tsl_hoh = 8.5; difference() { cube([tsl_w, tsl_l, tsl_t + 0.01]); translate([(tsl_w - tsl_hoh) / 2, 3, -1]) cylinder(d = 2.9, h = 3); translate([(tsl_w - tsl_hoh) / 2 + tsl_hoh, 3, -1]) cylinder(d = 2.9, h = 3); } } module pir(){ difference(){ union() { translate([0,0,pirP/2]) cube([pirL+1,pirH+1,pirP],center=true); translate([0,0,pirP+1]) sphere(r=pirHole/2,$fn=25); } translate([(pirL/2)-2,0,pirP/2])cylinder(r=1,h=pirP*2,center=true,$fn=96); translate([-(pirL/2)+2,0,pirP/2])cylinder(r=1,h=pirP*2,center=true,$fn=96); translate([(pirL/2)-2,0,(pirP)-.4])cylinder(r1=1,r2=3,h=2,center=true,$fn=96); translate([-(pirL/2)+2,0,(pirP)-.4])cylinder(r1=1,r2=3,h=2,center=true,$fn=96); translate([(pirL/2)-2,0,2.4])cylinder(r1=2,r2=1,h=5,center=true,$fn=96); translate([-(pirL/2)+2,0,2.4])cylinder(r1=2,r2=1,h=5,center=true,$fn=96); } // trimmer sensivity translate([4,20,pirP-8]) rotate([90,0,0]) cylinder(r=3,h=15,center=true,$fn=96); translate([-2.5,20,pirP-8]) rotate([90,0,0]) cylinder(r=3,h=15,center=true,$fn=96); } module cylinders(d, h, pos, d1, d2){ for(p = pos){ x = p[0]; y = p[1]; translate([x, y, 0]) if(d == undef){ cylinder(d1 = d1, d2 = d2, h = h); } else { cylinder(d = d, h = h); } } }