0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

制作手持式盖革计数器的教程

科技观察员 来源:Pedro52 作者:Pedro52 2022-08-18 16:12 次阅读

这个项目使用 3D 打印外壳测量放射性,带有 OLED 显示屏和锂离子电池

poYBAGL98_-AD_iEAARuPYb2qW8067.png

项目是在我买了一个现成的 Geiger 计数器套件之后开始的。

poYBAGL98_uAMPwPAADwCyaH4S8383.png

我的整个想法是把这个套件放在一个 3D 打印的外壳中,这样完整的盖革计数器套件就可以手持了。最终结果如下图所示:

poYBAGL98_iAOiMfAATLakSbKyI707.png

第 1 步:系统设计

手持式盖革计数器的设计如下图所示:

pYYBAGL98_OARkQyAAEtIFVahUc429.png

盖革计数器配备 0.96 英寸彩色 OLED 显示屏,可通过一个简单的因子告知用户测量的 CPM(测量每分钟电离事件的检测率)以及剂量当量(以 µSv/hr 为单位) 151 可以在文献中找到所使用的盖革-米勒 (GM) 管的类型。

事实上,显示的 CPM 是计算一分钟计数的结果,通过测量每秒计数 (CPS) 并将这些测量值存储在涵盖过去十秒周期的数组中。过去 10 秒期间的总计数乘以 6 即可获得 CPM 值。

过去一秒的计数用于通过 OLED 显示屏上的条形图显示瞬时测量次数。这在高计数率的情况下很有用,或者当手持式计数器在辐射源上移动时发生计数率的快速变化时。

盖革计数器由 18650 型锂离子电池供电,可通过微型 USB 插头充电。Arduino Nano USB 端口也可用于软件更改。一个额外的蜂鸣器连接到 Geiger 计数器板上,以增强 GM 管中的电离声音。

盖革计数器的所有电子设备都内置在 3D 打印外壳中:

poYBAGL98--ARwwRAADGJELVMz0239.png

OLED 显示屏放在盖革计数器顶部的单独盒子中:

pYYBAGL98-uAaspGAABbC_B6hdw483.png

完全组装的版本:

poYBAGL98-iAfodFAAIIG-qQl2A024.png

第 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

电子设计

盖革计数器套件的电子设计如下电路图所示:

pYYBAGL98-KAJr6pAAJRDqxY5NE225.png

完整的盖革计数器设置的电路图如下:

pYYBAGL989uAWiSoAANKhTSt4n8799.png

5V 电源由放置在 Micro USB 充电器板上的可充电锂离子电池提供。用于 OLED 显示器的 3、3 V 取自该板。

用于使用 ARDUINO IDE 测试和构建软件的面包板设置如下图所示:

pYYBAGL989aAMlMVAAUXjK16XeY850.png

组装

所有机械和电子零件的组装如下图所示:

pYYBAGL989GAAk5RAAht52oP0rA203.png

请注意,手持式盖革计数器没有任何电缆连接。

为了给 3、7V 锂离子电池充电,外壳上有一个单独的开口,用于(临时)连接微型 USB 插头。

额外的迷你 USB 连接可用于 Arduino Nano 的软件更新。

第 3 步:软件设计

以下流程图显示了盖革计数器的一般软件设计:

pYYBAGL9882ABGYmAALwGLyLHcg442.png

0, 96” OLED 显示屏的视图如下:

poYBAGL988mAcuSQAAIbtG6DSmg327.png

完整的 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 < 10 ; x++) { //put all data in the Array COUNTS to 0 (Array positionsrun from 0 to 10; 
COUNTS[x] = 0; //10 positions covering a period of 10 seconds
}

attachInterrupt(0, IMPULSE, FALLING); //define external interrupton pin D2/INT0 to start the interupt routine IMPULSE (green wire)

display.drawRect(0,0,96,64,WHITE);
display.setCursor(4,4);
display.setTextColor(RED);
display.setTextSize(2);
display.print("CPM");
display.setCursor(50,4);
display.setTextSize(1);
display.print("10 sec");
display.setCursor(50,12);
display.print("window");

display.setCursor(4,38);
display.setTextSize(1);
display.setTextColor(GREEN);
display.print("uSv/hr");

display.drawRect(0,48, 96, 16, YELLOW);
}
////////////////////////the loop code that follows,will run repeatedly until "Power Off" or a RESET/////////
void loop()
{
unsignedlong currentMillis= millis();
if(currentMillis - previousMillis >LOGtime)
{
previousMillis = currentMillis;
COUNTS[t] = Counts;
for (int y = 0; y < 10 ; y++) { //add all data in the Array COUNTS together 
TenSecCPM = TenSecCPM + COUNTS[y]; //and calculate the rolling average CPM over a 10 secondperiod
}
AVGCPM = 6* TenSecCPM;
TenSecCPM = 0;
t++ ;
if (t > 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 值(每秒计数)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计数器
    +关注

    关注

    32

    文章

    2123

    浏览量

    92987
  • 手持式仪器
    +关注

    关注

    0

    文章

    5

    浏览量

    5702
  • OLED显示屏
    +关注

    关注

    6

    文章

    202

    浏览量

    30322
  • 3D打印
    +关注

    关注

    26

    文章

    3475

    浏览量

    107658
收藏 人收藏

    评论

    相关推荐

    树莓派带显示的盖革-米勒计数器

    `盖革-米勒计数器是一种专门探测电离辐射(α粒子、β粒子、γ射线和X射线)强度的记数仪器。由充气的管或小室作探头,当向探头施加的电压达到一定范围时,射线在管内每电离产生一对离子,就能放大产生一个相同
    发表于 02-17 14:26

    制作盖革计数器用多大功率的电阻?

    `看到发烧友上的帖子,在盖革计数器制作中遇到了一个问题,应该用多大功率的电阻?因为盖革管,需要400伏电压。电路中也有3伏的电压。所以应该选用多大功率的电阻呢`
    发表于 09-19 06:51

    MetOne 227A 空气粒子计数器 尘埃粒子测试仪|手持式尘埃粒子计数器

    `MetOne 227A 空气粒子计数器 尘埃粒子测试仪|手持式尘埃粒子计数器 罗先生:159,2084,5969 威+信------------------长期供应/回收仪器:多功能校准仪,噪声
    发表于 12-10 18:10

    手持式粒子计数器在半导体洁净室内有何作用?

    手持式粒子计数器在半导体洁净室内有何作用?
    发表于 06-07 06:27

    盖革计数器电路图

    盖革计数器电路图
    发表于 04-08 08:39 2425次阅读
    <b class='flag-5'>盖革计数器</b>电路图

    灵敏的盖革计数器电路图

    灵敏的盖革计数器电路图
    发表于 04-08 08:40 1681次阅读
    灵敏的<b class='flag-5'>盖革计数器</b>电路图

    盖革计数器

    盖革计数器
    发表于 09-17 17:47 1102次阅读
    <b class='flag-5'>盖革计数器</b>Ⅰ

    盖革计数器

    盖革计数器
    发表于 09-17 17:48 1325次阅读
    <b class='flag-5'>盖革计数器</b>Ⅱ

    盖革计数器电路图

    盖革计数器电路图由三极管,变压器,以及晶体耳机接口,盖革计算管CV2249组成。供电电源为正负9V。
    发表于 12-17 20:27 1.4w次阅读
    <b class='flag-5'>盖革计数器</b>电路图

    制作简易盖革计数器

    盖革计数器一种专门探测电离辐射(α粒子、β粒子、γ射线和X射线)强度的记数仪器。由充气的管或小室作探头,当向探头施加的电压达到一定范围时,射线在管内每电离产生一对离子,就能放大产生一个相同大小的电脉冲并被相连的电子装置所记录,由此测量得单位时间内的射线数。
    的头像 发表于 05-21 17:27 1.8w次阅读

    Arduino盖革计数器DIY图解

     Geiger计数器反复给你相同的计数并不罕见,所以检查一下辐射源。我使用来自Americium的辐射测量,来自烟雾探测器的离子室。烟雾传感器利用Americ作为α粒子的来源,使空气中的烟雾粒子电离。我取下传感器上的金属盖,这样α和β粒子就可以与伽玛粒一起进入
    的头像 发表于 11-06 17:35 1.9w次阅读

    盖革计数器原理_盖格计数器的作用

    盖革管的全称是盖革-米勒管(G-M tube),是由卢瑟福(Ernest Rutherford,就是高中物理课本里那个提出“有核原子模型”的人)和德国物理学家盖革(Hans Geiger)于1908
    发表于 12-09 14:38 2w次阅读

    手持式激光尘埃粒子计数器介绍

    手持式激光尘埃粒子计数器【恒美Y09-3016】是恒美电子科技设计与研发的一款仪器,仪器高灵敏度、检测速度快。
    发表于 09-14 10:22 2414次阅读

    可定制的盖革穆勒计数器制作

    电子发烧友网站提供《可定制的盖革穆勒计数器制作.zip》资料免费下载
    发表于 06-12 10:51 2次下载
    可定制的<b class='flag-5'>盖革</b>穆勒<b class='flag-5'>计数器</b><b class='flag-5'>制作</b>

    实时监测核辐射有“高招”—用行空板DIY桌面盖革计数器

    辐射监测对我们的健康与安全至关重要,而自制盖革计数器成为一种实时监测辐射的有效工具。本文介绍如何使用开源平台—行空板来DIY桌面盖革计数器,从而便捷地实时监测环境中的辐射水平。 核辐射通常指来自
    的头像 发表于 09-22 10:05 653次阅读