這個項目使用 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 < 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文章
2259瀏覽量
94810 -
手持式儀器
+關注
關注
0文章
5瀏覽量
5755 -
OLED顯示屏
+關注
關注
6文章
218瀏覽量
30736 -
3D打印
+關注
關注
26文章
3557瀏覽量
109305
發布評論請先 登錄
相關推薦
評論