First version
This commit is contained in:
		
						commit
						9e3679b6dd
					
				
							
								
								
									
										83
									
								
								BatteryBank.scad
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								BatteryBank.scad
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,83 @@ | ||||
| include <BOSL/constants.scad> | ||||
| use <BOSL/transforms.scad> | ||||
| use <BOSL/shapes.scad> | ||||
| 
 | ||||
| model = 0; | ||||
| 
 | ||||
| bank_wall = 2; | ||||
| bank_inside_size = [94, 19, 19]; | ||||
| bank_socket_size = [bank_inside_size.x + 2, bank_inside_size.y + 2, 4]; | ||||
| pcb_size = [20, 19, 1]; | ||||
| separator_size = [2.5, pcb_size.y - 3, 12.5]; | ||||
| separator_pos = [bank_inside_size.x/2 - pcb_size.x - 0.2 - separator_size.x/2, -3, -bank_inside_size.z/2 + separator_size.z/2]; | ||||
| joiner_size = [5, 5, bank_inside_size.z]; | ||||
| joiner_pos = [0, bank_inside_size.y/2 + bank_wall + joiner_size.y/2, 0]; | ||||
| joiner_spread = 60; | ||||
| bank_joiner_screw_diam = 2.2; | ||||
| window_pos = [bank_inside_size.x/2, 0, 0]; | ||||
| window_size = [10, bank_inside_size.y - 1.8*2, 12]; | ||||
| 
 | ||||
| module bank_inside() { | ||||
|     cube(bank_inside_size, center=true); | ||||
| } | ||||
| 
 | ||||
| module bank_joiner() { | ||||
|     difference() { | ||||
|         cuboid(joiner_size, chamfer=1, edges=EDGES_Z_BK); | ||||
|         down(joiner_size.z/2) cylinder(d=bank_joiner_screw_diam, h=joiner_size.z, $fn=12); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module bank() { | ||||
|     difference() { | ||||
|         minkowski() { | ||||
|             cube(bank_inside_size, center=true); | ||||
|             sphere(r=bank_wall, $fn=18); | ||||
|         } | ||||
|         bank_inside(); | ||||
|         translate(window_pos) cube(window_size, center=true); | ||||
|     } | ||||
|     translate(separator_pos) cube(separator_size, center=true); | ||||
|     translate(joiner_pos) { | ||||
|         left(joiner_spread/2) bank_joiner(); | ||||
|         right(joiner_spread/2) bank_joiner(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module bank_divider(socket) { | ||||
|     up(5.5) { | ||||
|         difference() { | ||||
|             down(50) cube([500, 100, 100], center=true); | ||||
|             scale(socket ? 1 : [0.995, 0.97, 0.96]) cube(bank_socket_size, center=true); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module model_bank_bottom() { | ||||
|     up(bank_wall + bank_inside_size.z/2) | ||||
|     intersection() { | ||||
|         bank(); | ||||
|         bank_divider(socket=true); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module model_bank_top() { | ||||
|     up(bank_wall + bank_inside_size.z/2) | ||||
|     difference() { | ||||
|         bank(); | ||||
|         bank_divider(socket=false); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| if (model == 0) { | ||||
|     model_bank_bottom(); | ||||
|     model_bank_top(); | ||||
| } | ||||
| 
 | ||||
| if (model == 1) { | ||||
|     model_bank_bottom(); | ||||
| } | ||||
| 
 | ||||
| if (model == 2) { | ||||
|     model_bank_top(); | ||||
| } | ||||
							
								
								
									
										67
									
								
								Main.scad
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								Main.scad
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,67 @@ | ||||
| include <BOSL/constants.scad> | ||||
| use <BOSL/transforms.scad> | ||||
| 
 | ||||
| use <SensorBox.scad> | ||||
| use <BatteryBank.scad> | ||||
| use <ServoGauge.scad> | ||||
| use <Vitamins.scad> | ||||
| 
 | ||||
| module joiner_box_battery() { | ||||
|     up(9) fwd(35) cube([90, 2, 14], center=true); | ||||
| } | ||||
| 
 | ||||
| module pathway_box_battery() { | ||||
|     up(12) fwd(35) left(38) cube([12, 10, 6], center=true); | ||||
|     up(12) fwd(32) right(10) cube([90, 2, 6], center=true); | ||||
| } | ||||
| 
 | ||||
| module pathway_box_servo() { | ||||
|     up(8) fwd(0) right(58) cube([12, 45, 6], center=true); | ||||
| } | ||||
| 
 | ||||
| model = 0; | ||||
| function isModel(m) = (model == 0 || m == model); | ||||
| 
 | ||||
| sb_x = 72; | ||||
| pb_x = 0; | ||||
| pb_y = 47; | ||||
| 
 | ||||
| if (isModel(1)) { | ||||
|     difference() { | ||||
|         union() { | ||||
|             difference() { | ||||
|                 model_box(); | ||||
|                 right(sb_x) model_servo_box(); | ||||
|             } | ||||
|             joiner_box_battery(); | ||||
|             fwd(pb_y) right(pb_x) zrot(180) model_bank_bottom(); | ||||
|             fwd(0) right(sb_x) { | ||||
|                 difference() { | ||||
|                     model_servo_box_bottom(); | ||||
|                     up(12) fwd(get_servo_box_size().y/2 - 4) { | ||||
|                         left(6) xrot(90) { | ||||
|                             %switch(); | ||||
|                             switch(); | ||||
|                         } | ||||
|                         right(6) xrot(90) { | ||||
|                             %switch(); | ||||
|                             switch(); | ||||
|                         } | ||||
|                         right(18) xrot(90) { | ||||
|                             %switch(); | ||||
|                             switch(); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         pathway_box_battery(); | ||||
|         pathway_box_servo(); | ||||
|     } | ||||
| } | ||||
| if (isModel(2)) { | ||||
|     fwd(pb_y) right(pb_x) zrot(180) model_bank_top(); | ||||
| } | ||||
| if (isModel(3)) { | ||||
|     right(sb_x) model_servo_box_top(); | ||||
| } | ||||
							
								
								
									
										127
									
								
								SensorBox.scad
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								SensorBox.scad
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,127 @@ | ||||
| include <BOSL/constants.scad> | ||||
| use <BOSL/transforms.scad> | ||||
| use <BOSL/shapes.scad> | ||||
| 
 | ||||
| xray = false; | ||||
| model = 1; | ||||
| 
 | ||||
| pcb_pos = [0, 0, 6]; | ||||
| pcb_size = [108, 63, 2]; | ||||
| sensor_size = [pcb_size.x, pcb_size.y, 18 + 2]; | ||||
| pcb_stand_diam = 5.2; | ||||
| pcb_hole_diam = 3; | ||||
| 
 | ||||
| box_wall = 2; | ||||
| box_wall_rounding = 1; | ||||
| box_core_size = [sensor_size.x + 9 + box_wall*2, sensor_size.y + 3 + box_wall*2, sensor_size.z + box_wall*1.8]; | ||||
| /*box_switchboard_size = [16, box_core_size.y, box_core_size.z]; | ||||
| box_switchboard_chamber_pos = [(box_core_size.x + box_switchboard_size.x)/2 - 2*box_wall, 0, box_switchboard_size.z/2]; | ||||
| box_switchboard_chamber_size = [box_switchboard_size.x + box_wall, box_switchboard_size.y - box_wall*2, box_switchboard_size.z - box_wall*3];*/ | ||||
| box_cavity_size = [sensor_size.x + 4, sensor_size.y + 1, sensor_size.z + box_wall*2]; | ||||
| box_lid_pos = [0, 0, sensor_size.z]; | ||||
| box_lid_size = [115, 67.5, 1.7]; | ||||
| box_pos = [/*box_switchboard_size.x/2*/0, 0, 0]; | ||||
| box_size = [box_core_size.x /*+ box_switchboard_size.x*/, box_core_size.y, box_core_size.z]; | ||||
| 
 | ||||
| function get_servo_box_size() = box_size; | ||||
| 
 | ||||
| module foreach_mount_hole() { | ||||
|     for (x = [0:1]) { | ||||
|         for (y = [0:1]) { | ||||
|             left((1-2*x)*(pcb_size.x/2 - pcb_stand_diam/2 - pcb_hole_diam/4 + 0.5)) | ||||
|             fwd((1-2*y)*(pcb_size.y/2 - pcb_stand_diam/2 - pcb_hole_diam/4)) | ||||
|                 children(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module pcb_mount_holes() { | ||||
|     foreach_mount_hole() { | ||||
|         cylinder(h=sensor_size.z, d=pcb_hole_diam, $fn=10); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module pcb_stands() { | ||||
|     foreach_mount_hole() { | ||||
|         cylinder(h=sensor_size.z, d=pcb_stand_diam + 1.8, $fn=15); | ||||
|         cylinder(h=sensor_size.z + 5.6, d=pcb_hole_diam + 1.0, $fn=10); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module sensor_connectors_power() { | ||||
|     pwr_diam=10; | ||||
|     fwd(pcb_size.y/2 - 22.3) right(pcb_size.x/2 - 2) up(pcb_pos.z + 8.2) zrot(-90) xrot(-90)   cylinder(h=50, d1=pwr_diam, d2=pwr_diam+2, $fn=20); | ||||
| } | ||||
| 
 | ||||
| module sensor_connectors_space() { | ||||
|     jack_diam=12; | ||||
|     fwd(pcb_size.y/2 - 15.5) left(pcb_size.x/2 - 2) up(pcb_pos.z + 4) zrot(-90) xrot(90)   cylinder(h=/*20*/7, d=jack_diam, $fn=20); | ||||
|      | ||||
|     //sensor_connectors_power(); | ||||
|      | ||||
|     /*switch_size=[20, 8, 3.8]; | ||||
|     back(pcb_size.y/2 - 28.2) right(pcb_size.x/2 + switch_size.x/2 - 2) up(pcb_pos.z + switch_size.z/2 + 2.3) cube(switch_size, center=true);*/ | ||||
|      | ||||
|     /*conn_size=[20, 8, 3.8]; | ||||
|     back(3) left(pcb_size.x/2 + conn_size.x/2 - 2) up(pcb_pos.z + conn_size.z/2 + 2.3) cube(conn_size, center=true);*/ | ||||
| } | ||||
|      | ||||
| module sensor() { | ||||
|     difference() { | ||||
|         translate(pcb_pos) up(pcb_size.z/2) | ||||
|             cube(pcb_size, center=true); | ||||
|         pcb_mount_holes(); | ||||
|     } | ||||
|     pcb_stands(); | ||||
| } | ||||
| 
 | ||||
| module sensor_lid() { | ||||
|     difference() { | ||||
|         translate(box_lid_pos) up(box_lid_size.z/2) | ||||
|             cube(box_lid_size, center=true); | ||||
|         pcb_mount_holes(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // ---- | ||||
| 
 | ||||
| 
 | ||||
| module box() { | ||||
|     difference() { | ||||
|         translate(box_pos) up(box_size.z/2) cuboid(box_size, chamfer=box_wall_rounding); | ||||
|         up(sensor_size.z/2 + box_wall*2.5) cube(box_cavity_size, center=true); | ||||
|         up(box_lid_size.z/2 + box_wall) translate(box_lid_pos) cube(box_lid_size, center=true); | ||||
|         up(box_wall) sensor_connectors_space(); | ||||
|         up(box_wall) pcb_stands(); | ||||
|         up(box_wall) up(sensor_size.z) xrot(180) pcb_stands(); | ||||
|          | ||||
|         /*up(box_size.z - box_wall) { | ||||
|            back(box_size.y/2 - 12) right(box_size.x/2 - 2) switch(); | ||||
|            back(box_size.y/2 - 32) right(box_size.x/2 - 2) switch(); | ||||
|            fwd(box_size.y/2 - 12) right(box_size.x/2 - 2) switch(); | ||||
|         }*/ | ||||
|         //translate(box_switchboard_chamber_pos) cuboid(box_switchboard_chamber_size, chamfer=1); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module model_box() { | ||||
|     box(); | ||||
| } | ||||
| 
 | ||||
| // ---- | ||||
| 
 | ||||
| if (xray) { | ||||
|     intersection() { | ||||
|         box(); | ||||
|         down(500) left(10) fwd(10) cube([1000, 1000, 1000]); | ||||
|     } | ||||
| } else { | ||||
|     box(); | ||||
| } | ||||
| if (model == 0) { | ||||
|     up(box_wall) union() { | ||||
|         //sensor(); | ||||
|         //sensor_lid(); | ||||
|         %sensor_connectors_space(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										143
									
								
								ServoGauge.scad
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								ServoGauge.scad
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,143 @@ | ||||
| include <BOSL/constants.scad> | ||||
| use <BOSL/transforms.scad> | ||||
| use <BOSL/shapes.scad> | ||||
| 
 | ||||
| use <SensorBox.scad> | ||||
| use <Vitamins.scad> | ||||
| 
 | ||||
| servo_mount_size = [12, 32, 2.5]; | ||||
| servo_mount_pos = [0, 0, 16]; | ||||
| servo_mount_hole_diam = 2; | ||||
| servo_core_size = [12, 23, 22.3]; | ||||
| servo_gears_size = [servo_core_size.x, servo_core_size.x, 26.5]; | ||||
| servo_gears_pos = [0, -(servo_core_size.y/2 - servo_gears_size.y/2), 0]; | ||||
| servo_centergears_size = [servo_core_size.x/2, servo_core_size.x/2, servo_gears_size.z]; | ||||
| servo_centergears_pos = [0, 0, 0]; | ||||
| servo_shaft_size = [1, 1, 28.5]; | ||||
| servo_shaft_pos = servo_gears_pos; | ||||
| display_pos = [0, 8, servo_core_size.z]; | ||||
| box_wall = 2; | ||||
| servo_box_round = 1; | ||||
| servo_box_size = [40, get_servo_box_size().y, servo_core_size.z + box_wall*2]; | ||||
| servo_box_chamber = [servo_box_size.x - box_wall*2, servo_box_size.y - box_wall*2, servo_box_size.z - box_wall*2]; | ||||
| servo_box_chamber_walled = [servo_box_chamber.x + box_wall, servo_box_chamber.y + box_wall, servo_box_chamber.z + box_wall]; | ||||
| servo_box_pos = [6, 0, servo_box_size.z/2 - box_wall]; | ||||
| servo_box_socket_size = [servo_box_size.x, servo_box_size.y, 4]; | ||||
| servo_box_screw_joiner_size = [5, 5, 20]; | ||||
| servo_box_screw_joiner_pos = [servo_box_size.x/2 + servo_box_screw_joiner_size.x/2, 0, 2]; | ||||
| 
 | ||||
| module servo_mount_holes() { | ||||
|     for (i = [0:1]) { | ||||
|         down(servo_mount_size.z) | ||||
|         fwd((1-2*i)*(servo_mount_size.y/2 - servo_mount_hole_diam) + 0.5*(i+1)) | ||||
|             cylinder(h=servo_mount_size.z*4, d=servo_mount_hole_diam, $fn=10); | ||||
|     } | ||||
| } | ||||
|      | ||||
| module servo() { | ||||
|     up(servo_core_size.z/2) | ||||
|         cube(servo_core_size, center=true); | ||||
| 
 | ||||
|     up(servo_mount_size.z/2) translate(servo_mount_pos) | ||||
|     difference() { | ||||
|         cube(servo_mount_size, center=true); | ||||
|         servo_mount_holes(); | ||||
|     } | ||||
|      | ||||
|     translate(servo_gears_pos) cylinder(d=servo_gears_size.x, h=servo_gears_size.z, $fn=30); | ||||
|     translate(servo_centergears_pos) cylinder(d=servo_centergears_size.x, h=servo_centergears_size.z, $fn=20); | ||||
|      | ||||
|     translate(servo_shaft_pos) cylinder(d=servo_shaft_size.x, h=servo_shaft_size.z, $fn=20); | ||||
| } | ||||
| 
 | ||||
| display_needle_length = 15; | ||||
| module display_mount_holes() { | ||||
|     translate(-servo_shaft_pos) { | ||||
|         #servo_mount_holes(); | ||||
|     } | ||||
| } | ||||
| module display() { | ||||
|     angle_max = 180; | ||||
|     angle_gap = 8; | ||||
|      | ||||
|     module display_pie() { | ||||
|         up(1) zrot(-90 + angle_gap/2) | ||||
|         pie_slice(ang=angle_max-angle_gap, l=2, r=display_needle_length); | ||||
|     } | ||||
|      | ||||
|     difference() { | ||||
|         //up(2/2) cube([20, 40, 2], center=true); | ||||
|          | ||||
|         minkowski() { | ||||
|             display_pie(); | ||||
|             cylinder(r=7,h=0.1); | ||||
|         } | ||||
|         up(1.5) display_pie(); | ||||
|         translate(-servo_shaft_pos) { | ||||
|             down(servo_core_size.z) servo(); | ||||
|         } | ||||
|         display_mount_holes(); | ||||
|     } | ||||
|     slices=20; | ||||
|     for (i = [0:slices]) { | ||||
|         zrot(i * (angle_max - angle_gap)/slices + angle_gap/2) fwd(display_needle_length) up(3) scale(i%5==0 ? 1 : 0.5) cube([1, 4, 2], center=true); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module servo_box() { | ||||
|     up(box_wall) translate(servo_box_pos) { | ||||
|         difference() { | ||||
|             cuboid(servo_box_size, chamfer=servo_box_round); | ||||
|             cuboid(servo_box_chamber, chamfer=servo_box_round); | ||||
|         } | ||||
|         translate(servo_box_screw_joiner_pos) { | ||||
|             fwd(20) screw_joiner(servo_box_screw_joiner_size, edges=EDGES_Z_RT); | ||||
|             back(20) screw_joiner(servo_box_screw_joiner_size, edges=EDGES_Z_RT); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module servo_box_divider(socket) { | ||||
|     up(3) { | ||||
|         difference() { | ||||
|             up(50 + servo_box_size.z/2 + 5) cube([500, 100, 100], center=true); | ||||
|             up(-box_wall) translate(servo_box_pos) scale(socket ? 1 : [0.97, 0.99, 0.98]) cube(servo_box_chamber_walled, center=true); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module model_display() { | ||||
|     up(box_wall) translate(display_pos) display(); | ||||
| } | ||||
| 
 | ||||
| module model_servo_box() { | ||||
|     difference() { | ||||
|         servo_box(); | ||||
|         translate(display_pos) { | ||||
|             down(servo_core_size.z - 2) fwd(servo_gears_pos.y) servo(); | ||||
|             display_mount_holes(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module model_servo_box_top() { | ||||
|     //up(box_wall + bank_inside_size.z/2) | ||||
|     intersection() { | ||||
|         model_servo_box(); | ||||
|         servo_box_divider(socket=true); | ||||
|     } | ||||
|     model_display(); | ||||
| } | ||||
| 
 | ||||
| module model_servo_box_bottom() { | ||||
|     //up(box_wall + bank_inside_size.z/2) | ||||
|     difference() { | ||||
|         model_servo_box(); | ||||
|         servo_box_divider(socket=false); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| translate(display_pos) down(servo_core_size.z - 4) fwd(servo_gears_pos.y) %servo(); | ||||
| 
 | ||||
| model_servo_box_top(); | ||||
| model_servo_box_bottom(); | ||||
							
								
								
									
										22
									
								
								Vitamins.scad
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Vitamins.scad
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| include <BOSL/constants.scad> | ||||
| use <BOSL/transforms.scad> | ||||
| use <BOSL/shapes.scad> | ||||
| 
 | ||||
| switch_body_size = [8, 13, 16]; | ||||
| 
 | ||||
| module switch() { | ||||
|     down(switch_body_size.z/2) cube(switch_body_size, center=true); | ||||
|     cylinder(d=6.5, h=8.5); | ||||
|     up(8.5) xrot(15) cylinder(d=2.5, h=10); | ||||
| } | ||||
| 
 | ||||
| switch(); | ||||
| 
 | ||||
| module screw_joiner(size, screw_diam=2.2, chamfer=1, edges=EDGES_Z_ALL) { | ||||
|     difference() { | ||||
|         cuboid(size, chamfer=chamfer, edges=edges); | ||||
|         down(size.z/2) cylinder(d=screw_diam, h=size.z, $fn=12); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| left(20) screw_joiner([5, 5, 10]); | ||||
							
								
								
									
										119
									
								
								geiger_counter.ino
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								geiger_counter.ino
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,119 @@ | ||||
| /*
 | ||||
|  * Geiger counter Kit could get on:  https://www.aliexpress.com            search: geiger counter kit
 | ||||
| * -------------------------------------------------------------------------------------- | ||||
| * WHAT IS CPM? | ||||
| * CPM (or counts per minute) is events quantity from Geiger Tube you get during one minute. Usually it used to  | ||||
| * calculate a radiation level. Different GM Tubes has different quantity of CPM for background. Some tubes can produce | ||||
| * about 10-50 CPM for normal background, other GM Tube models produce 50-100 CPM or 0-5 CPM for same radiation level. | ||||
| * Please refer your GM Tube datasheet for more information. Just for reference here, J305 and SBM-20 can generate  | ||||
| * about 10-50 CPM for normal background.  | ||||
| * -------------------------------------------------------------------------------------- | ||||
| * HOW TO CONNECT GEIGER KIT? | ||||
| * The kit 3 wires that should be connected to Arduino UNO board: 5V, GND and INT. PullUp resistor is included on | ||||
| * kit PCB. Connect INT wire to Digital Pin#2 (INT0), 5V to 5V, GND to GND. Then connect the Arduino with | ||||
| * USB cable to the computer and upload this sketch.  | ||||
| *  | ||||
|  * Author:JiangJie Zhang * If you have any questions, please connect cajoetech@qq.com | ||||
|  * Author:Dejvino | ||||
|  *  | ||||
|  * License: MIT License | ||||
|  *  | ||||
|  * Please use freely with attribution. Thank you! | ||||
| */ | ||||
| 
 | ||||
| // include the Servo library
 | ||||
| #include <Servo.h> | ||||
| Servo myServo;  // create a servo object
 | ||||
| 
 | ||||
| int const PIN_SERVO = 9; | ||||
| int angle;   // variable to hold the angle for the servo motor
 | ||||
| 
 | ||||
| int const PIN_TUBE 2; | ||||
| 
 | ||||
| int const PIN_FRESH = LED_BUILTIN; | ||||
| int freshState = 0; | ||||
| 
 | ||||
| #include <SPI.h> | ||||
| //#define LOG_PERIOD 15000  //Logging period in milliseconds, recommended value 15000-60000.
 | ||||
| #define LOG_PERIOD 30000 | ||||
| #define MAX_PERIOD 60000  //Maximum logging period without modifying this sketch
 | ||||
| 
 | ||||
| unsigned long counts;     //variable for GM Tube events
 | ||||
| unsigned long cpm;        //variable for CPM
 | ||||
| unsigned int multiplier;  //variable for calculation CPM in this sketch
 | ||||
| unsigned long previousMillis;  //variable for time measurement
 | ||||
| 
 | ||||
| int const subDiv = 60; | ||||
| int const subTimespan = LOG_PERIOD / subDiv;  | ||||
| int subCounts = 0; | ||||
| int subTime = 0; | ||||
| 
 | ||||
| void tube_impulse(){       //subprocedure for capturing events from Geiger Kit
 | ||||
|   counts++; | ||||
| } | ||||
| 
 | ||||
| void setup(){             //setup subprocedure
 | ||||
|   myServo.attach(PIN_SERVO); // attaches the servo on pin 9 to the servo object  
 | ||||
|   myServo.write(angle); | ||||
|    | ||||
|   counts = 0; | ||||
|   cpm = 0; | ||||
|   multiplier = MAX_PERIOD / LOG_PERIOD;      //calculating multiplier, depend on your log period
 | ||||
|   Serial.begin(9600); | ||||
|   attachInterrupt(0, tube_impulse, FALLING); //define external interrupts 
 | ||||
| 
 | ||||
|   pinMode(PIN_FRESH, OUTPUT); | ||||
|   digitalWrite(PIN_FRESH, LOW); | ||||
| 
 | ||||
|   delay(500); | ||||
|   myServo.write(0); | ||||
|   delay(1000); | ||||
|   myServo.write(200); | ||||
|   delay(1000); | ||||
|   myServo.write(100); | ||||
|   delay(1000); | ||||
|   myServo.write(0); | ||||
| } | ||||
| 
 | ||||
| void loop(){                                 //main cycle
 | ||||
|   unsigned long currentMillis = millis(); | ||||
|   unsigned long timeDiff = currentMillis - previousMillis; | ||||
|   if (freshState == 1 && timeDiff > LOG_PERIOD / 4) { | ||||
|     freshState = 0; | ||||
|     digitalWrite(PIN_FRESH, LOW); | ||||
|   } | ||||
|   if(timeDiff > LOG_PERIOD){ | ||||
|     previousMillis = currentMillis; | ||||
|     cpm = counts * multiplier; | ||||
| 
 | ||||
|     angle = cpm; | ||||
|     //myServo.write(angle);
 | ||||
| 
 | ||||
|     Serial.print("CPM: "); | ||||
|     Serial.println(cpm); | ||||
|     counts = 0; | ||||
|      | ||||
|     digitalWrite(PIN_FRESH, HIGH); | ||||
|     freshState = 1; | ||||
|      | ||||
|     subCounts = 0; | ||||
|     subTime = currentMillis; | ||||
|   } | ||||
| 
 | ||||
|   int subDiff = currentMillis - subTime; | ||||
|   if (subDiff >= subTimespan) { | ||||
|     subTime = currentMillis; | ||||
|     int subTimeSteps = timeDiff / subTimespan; | ||||
|     subCounts = counts; | ||||
|     int change = (counts * multiplier) - (cpm * subTimeSteps / subDiv); | ||||
|     angle = cpm + change; | ||||
|     if (angle < 0) { angle = 0; } | ||||
|     if (angle > 200) { angle = 200; } | ||||
|     myServo.write(angle); | ||||
|      | ||||
|     Serial.print("R: "); | ||||
|     Serial.print(angle); | ||||
|     Serial.println(); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user