这个项目使用 3d 打印外壳测量放射性,带有 oled 显示屏和锂离子电池。
项目是在我买了一个现成的 geiger 计数器套件之后开始的。
我的整个想法是把这个套件放在一个 3d 打印的外壳中,这样完整的盖革计数器套件就可以手持了。最终结果如下图所示:
第 1 步:系统设计
手持式盖革计数器的设计如下图所示:
盖革计数器配备 0.96 英寸彩色 oled 显示屏,可通过一个简单的因子告知用户测量的 cpm(测量每分钟电离事件的检测率)以及剂量当量(以 µsv/hr 为单位) 151 可以在文献中找到所使用的盖革-米勒 (gm) 管的类型。
事实上,显示的 cpm 是计算一分钟计数的结果,通过测量每秒计数 (cps) 并将这些测量值存储在涵盖过去十秒周期的数组中。过去 10 秒期间的总计数乘以 6 即可获得 cpm 值。
过去一秒的计数用于通过 oled 显示屏上的条形图显示瞬时测量次数。这在高计数率的情况下很有用,或者当手持式计数器在辐射源上移动时发生计数率的快速变化时。
盖革计数器由 18650 型锂离子电池供电,可通过微型 usb 插头充电。arduino nano usb 端口也可用于软件更改。一个额外的蜂鸣器连接到 geiger 计数器板上,以增强 gm 管中的电离声音。
盖革计数器的所有电子设备都内置在 3d 打印外壳中:
oled 显示屏放在盖革计数器顶部的单独盒子中:
完全组装的版本:
第 2 步:制作盖革计数器组件
使用以下材料:
arduino nano 1
盖革计数器套件 1
0.96“ oled 彩色显示屏 96 * 64 1
micro usb 充电器板 18650 电池 1
3.7v 4000mah 受保护的可充电 18650 锂离子电池 1
晶体管 bc547 1
蜂鸣器-12mm 1
电阻 1k ohm 1
电子设计
盖革计数器套件的电子设计如下电路图所示:
完整的盖革计数器设置的电路图如下:
5v 电源由放置在 micro usb 充电器板上的可充电锂离子电池提供。用于 oled 显示器的 3、3 v 取自该板。
用于使用 arduino ide 测试和构建软件的面包板设置如下图所示:
组装
所有机械和电子零件的组装如下图所示:
请注意,手持式盖革计数器没有任何电缆连接。
为了给 3、7v 锂离子电池充电,外壳上有一个单独的开口,用于(临时)连接微型 usb 插头。
额外的迷你 usb 连接可用于 arduino nano 的软件更新。
第 3 步:软件设计
以下流程图显示了盖革计数器的一般软件设计:
0, 96” oled 显示屏的视图如下:
完整的 arduino 代码如下所示:
#include
#include
#include
//connections for the oled display
#define sclk 13 //scl (blue wire)
#define mosi 11 //sda (white wire)
#define cs 10 //cs (grey wire)
#define rst 9 //res (green wire)
#define dc 8 //dc (yellow wire)
#define logtime 1000 //logging time in milliseconds (1 second)
#define minute 60000 //the period of 1 minute for calculating the cpm values
#define show endwrite
#define clear() fillscreen(0)
// color definitions
#define black 0x0000
#define blue 0x001f
#define red 0xf800
#define green 0x07e0
#define cyan 0x07ff
#define magenta 0xf81f
#define yellow 0xffe0
#define white 0xffff
adafruit_ssd1331 display = adafruit_ssd1331(cs, dc, rst);
int counts = 0; //variable containing the number of gm tube events withinthe logtime
unsigned long previousmillis= 0; //variablefor storing the previous time
int avgcpm = 0; //variable containing the floating average number ofcounts over a fixed moving windo period
int tenseccpm = 0;
int units = 0;
int tens = 0;
int hundreds = 0;
int thousands = 0;
float sievert = 0;
int counts[10]; // array for storing the measured amounts of impulses in10 consecutive 1 second periods
int t = 0;
////////////////////the setup code that follows,will run once after power on or after a reset///////////////////
void setup() {
serial.begin(115200);
display.begin();
display.fillscreen(black);
floatbattery = analogread(a3); //(orange wire)
floatbattperc = 100 * (battery/770);
//serial.print(battery value = ); serial.println (battery); serial.print(battery percentage = ); serial.println (battperc);
display.setcursor(4,4);
display.settextsize(2);
display.settextcolor(magenta);
display.println(battery);
display.setcursor(4,24);
display.print (int (battperc)); display.print(.); display.print (int((10*battperc)-(10*int(battperc))));display.print( %);
delay(3000);
display.fillscreen(black);
for(int x = 0; x logtime)
{
previousmillis = currentmillis;
counts[t] = counts;
for (int y = 0; y 9) { t = 0 ;}
//serial.print (counts ); serial.print(t);serial.print ( = );serial.println (counts[t]);
display.fillrect(4,20,90,17,black); // clear the cpm value field on the display
display.setcursor(4,20);
display.settextcolor(red);
display.settextsize(2);
display.println(avgcpm);
//serial.print (avgcpm = ); serial.print(avgcpm); //serial.print ( cpm = ); serial.println(cpm);
display.fillrect(45,38,50,10,black); //clear the usv/hr value field on the display
display.setcursor(45,38);
display.settextcolor(green);
display.settextsize(1);
sievert = (avgcpm /151.0) ; //serial.print ( sievert = );serial.println (sievert);
units = int (sievert); //serial.print (units = ); serial.println(units);
tens = int ((10*sievert) - (10*units)); //serial.print (tens = ); serial.println(tens);
hundreds = int ((100*sievert) - (100*units) - (10* tens)); //serial.print (hundreds = ); serial.println(hundreds);
thousands = int ((1000*sievert) - (1000*units) - (100*tens) - (10*hundreds)); //serial.print (thousands =); serial.println (thousands);
display.print (units); display.print(.); display.print (tens); display.print (hundreds);display.println (thousands);
display.fillrect(1,49,94,14,black); // clear the cpm indicator field on the display
display.fillrect(1,49,counts,14,red); //fill the cpm indicator field on the display
counts = 0;
}
}
//////////////////end ofloop////////////////////////////////////
/////////////////////////////////hereafter follows the function for counting the number of impulses from geiger counter kit
void impulse()
{
counts++;
}
代码中最重要的部分是中断函数,当测量到 geiger counter 的 gm 管上的脉冲会触发 geigercounter 的 int 输出(通过使其在短时间内变为低电平)时调用。int信号连接到引脚d2(arduino nano的外部中断引脚int0):
attachinterrupt(0, impulse, falling);
int 信号将启动中断程序 impulse () 以将 counts 增加 1:
void impulse() {counts++ ; }
经过 1000 ms后:
整数 counts 被放回 0
数组 counts [ ] 填充了过去 1000 毫秒内测量的计数数
过去 10 秒的总计数是通过将数组 counts [ ] 中的所有数字相加并乘以 6 以在显示屏上显示 cpm 值来计算的。
以 µsv/hr 表示的剂量当量是通过 cpm 值除以 151 计算得出的(该值可在文献中找到)。
在彩色 oled 显示屏上,根据过去一秒的计数值显示一个红色条,因此实际上呈现的是 cps 值(每秒计数)
IDC预测:新冠肺炎救治和疫情防控带动未来三年共计约200亿元人民币医疗投入
Altium Designer18软件盲埋孔的设置及打孔
智慧无人工厂解决方案 通信技术是无人工厂实现的基础
三星QLED 8K电视的新宣传片:不将就才是真讲究
随着AI写作逐步完善与发展 AI写作将拥有着许多人们难以比拟的优势
制作手持式盖革计数器的教程
OpenEDA开源平台正式上线,助力构建国产EDA开放生态系统
发展趋势 | 探析嵌入式技术的发展趋势和前景
雷电绕击影响因素有哪些
OPPO R17搭配骁龙670,采用2500万像素传感器
华为决定全力打造自己的AI平台
传统存储架构的局限性主要体现在哪几个方面?
线性稳压电源工作原理分析,线性稳压电源电路图详解
将 WLAN 集成至手持设备的设计
语音合成芯片D-16应用电路
冲击电钻的技术参数和维护保养方法
势垒型InAs/InAsSb T2SLs红外探测器研究进展
超低成本隔离交流电压检测+掉电检测二合一电路
LFP电池海外市场渗透加速
RS-485接口芯片MS1285传输速率10Mbps