本文的目的是創建最詳細的組裝說明如何制作您的第一個自己動手做的輻射探測器。
曾幾何時,你可能考慮過購買一個個人劑量計來測量家中的輻射水平,但后續你可能覺得有些沒必要就作罷。而今天我們將組裝一個基于 ESP32 WiFi 控制器和 RadSens 板的簡單便宜的輻射探測劑量計。RadSens 是用于氣體放電蓋革-穆勒計數器的現成 I2C 模塊。可靠且廣泛使用的 SBM20-1 管將用作傳感器。除了它,任何其他管也可以連接到模塊,像是 J305、M4011、STS-5 等。
本文的目的是創建最詳細的組裝說明。如果一個年輕的工程師也可以重復上述步驟,那我們就算實現了目標。
構建
選擇電路板和組件時最重要的標準是成本。我們的目標是使劑量計盡可能地節省預算。
使用了以下組件:
劑量計模塊 - RadSens。RadSens 是與流行的 SBM-20 管組裝在一起的現成模塊。只需要在 Arduino Library Manager 中安裝庫即可。劑量計已準備好開箱即用。
ESP8266 / ESP32 板。RadSens模塊具有I2C接口,兼容Arduino、ESP、Raspberry
0.96 英寸 OLED 顯示屏。您可以使用任何帶有 I2C 的屏幕。但 OLED 屏幕允許您添加當前輻射水平的簡單動畫和顏色編碼。
Boozer(高音)模塊,用于聲音指示脈沖。當無法訪問屏幕上的信息時,Boozer 用于用戶聲音信息。
面包板 120*80 毫米。該板用于方便的布線放置和元件之間的組織。
自制劑量計組裝過程
所需步驟:
將元件焊接到所需位置的面包板上。
根據建議的方案連接所有元素。
首先目視檢查連接,然后將 ESP 連接到 USB。
將 RadSens 庫和 ESP32 板連接到 Arduino IDE。
將代碼添加到 IDE 并上傳。
步驟 1. 連接
我們需要焊接所有元素并將它們連接起來。RadSens 和 OLED 屏幕上的 SDA 和 SCL 引腳必須連接到通過 I2C 接口進行通信的 D22 (SCL) 和 D21 (SDA) 端口。根據下圖連接其余部分:
步驟 2. RadSens、ESP32、GyverOLED 庫連接
在安裝 ESP32 工具之前,您需要打開首選項并在 Additional Boards Manager URL 行中鍵入
“https://dl.espressif.com/dl/package_esp32_index.json”
ESP32 開發板的 Arduino IDE 中的擴展連接如下:
Arduino -》 Tools -》 Board -》 Board Manager -》 在搜索欄中輸入“ESP32”。
安裝完成后,需要在“Board”部分指定“ESP32 Dev module”。
接下來,我們需要選擇具體的板子。為此,請轉到“工具”選項卡,選擇“板”部分,然后在“ESP32 Arduino”子部分中選擇“ESP32 開發模塊”。
要安裝 RadSens 庫,您需要遵循幾乎相同的步驟:
Arduino -》 Sketch -》 添加庫 -》 管理庫 -》 在搜索欄中輸入“RadSens”。
接下來,您需要在庫管理器中安裝 GyverOLED 庫。
現在我們已經準備好繼續開發了。
步驟 3. 代碼
該代碼是使用 Alex Gyver 的 OLED 庫編寫的,我認為這是最容易使用的庫之一。但是使用 U8G2、Adafruit 或任何你方便的庫是可以接受的。
// Connecting the libraries
#include // RadSens library
#include // I2C library
#include // One of the easiest-to-learn OLED libraries by Alex Gyver
#define buz 18 // Initializing the buzzer pin. You may change it if you connected buzzer to another pin
GyverOLED oled; // Initializing OLED screen
ClimateGuard_RadSens1v2 radSens(RS_DEFAULT_I2C_ADDRESS); // Initializing RadSens,>
uint32_t timer_cnt; // Timer for updating count of pulses and intensity
uint32_t timer_imp; // Timer for updating pulses for buzzer
uint32_t timer_oled; // Timer for updating OLED data
float dynval; // Variable for dynamic intensity value
float statval; // Variable for static intensity value
uint32_t impval; // Variable for count of impulses
uint32_t pulsesPrev; // Variable for count of impulses at previous cycle
void setup() {
pinMode(buz, OUTPUT); // Initializing buzzer as an output
ledcSetup(1, 500, 8); // Initializing PWM for buzzer (ONLY FOR ESP DELETE THIS STOKE FOR ARDUINO)
ledcAttachPin(buz, 1); // Initializing buzzer pin for PWM (ONLY FOR ESP DELETE THIS STOKE FOR ARDUINO)
oled.init(); // Initializing OLED in code
oled.flipV(1); //I has flipped the screen for comfortable use
oled.flipH(1); // For normal appearance of text we need horizontal inverting
oled.clear();
oled.setScale(2); // Setting scale of text
radSens.radSens_init();
oled.clear();
radSens.setSensitivity(105); // Setting sensitivity of Heiger’s tube (in case of not default tube, check technical specifications of your tube to find sensitivity)
int16_t sensval = radSens.getSensitivity();
oled.setCursor(10, 2);
oled.print("Sens:");
oled.setCursor(42, 4);
oled.print(sensval);
delay(4000);
oled.clear();
pulsesPrev = radSens.getNumberOfPulses(); //Setting number of pulses to zero
}
void beep(int deltime) { // Setting time and frequency of buzzer beeps
ledcWriteTone(1, 500); // Switching on (freq = 500Hz)
delay(3);
ledcWriteTone(1, 0); // Switching off
delay(deltime);
}
/*
void beep(int deltime){
tone(buz, 500, deltime)
} same function but for Arduino */
void loop() {
if (millis() - timer_imp > 250) { // This function creates crack of buzzer
timer_imp = millis();
int pulses = radSens.getNumberOfPulses();
if (pulses > pulsesPrev) {
for (int i = 0; i < (pulses - pulsesPrev); i++) {
beep(30); // You may change this parameter if you need longer cracks
}
pulsesPrev = pulses;
}
}
if (millis() - timer_cnt > 1000) { // Writing values to global variables
timer_cnt = millis();
dynval = radSens.getRadIntensyDyanmic();
statval = radSens.getRadIntensyStatic();
impval = radSens.getNumberOfPulses();
}
if (millis() - timer_oled > 1000) { //Writing variables to a strings and display them on the screen
timer_oled = millis();
String dynint = "Dyn: ";
dynint += dynval;
String statint = "Stat: ";
statint += statval;
String nimp = "Imp: ";
nimp += impval;
oled.setCursor(0, 1);
oled.print(dynint);
oled.setCursor(0, 3);
oled.print(statint);
oled.setCursor(0, 5);
oled.print(nimp);
}
}// Connecting the libraries
測試
這一次由于我們是考慮了最經濟的劑量計輻射計版本。同時出于好奇,我們還訂購了透明有機玻璃板,以使設備更方便和更具描述性。我們使用硫酸鉀用于測試。這種肥料富含放射性同位素鉀 40,它會主動發射 β 輻射。
房間內的標準輻射水平為 15-20 μR/h。直接接觸硫酸鉀,我們得到 32-39 μR/h,高出兩倍。
連接示意圖
-
輻射探測器
+關注
關注
0文章
3瀏覽量
5383 -
ESP8266
+關注
關注
50文章
962瀏覽量
45015
發布評論請先 登錄
相關推薦
評論