DFRobot盖革计数器模块准备工作:
整体模块实物图:


Gravity: 盖革计数器模块能测什么?
电离辐射。盖格计数器只能检测电离辐射,如核辐射、X光、宇宙射线等。无法检测电磁辐射,如微波炉辐射、手机辐射、WiFi辐射、电磁炉辐射。生活中我们不主动接触,不代表就遇不到能量较高的电离辐射,Gravity: 盖革计数器模块能测试天然大理石建材,色彩奇异的矿石宝石,成分不明的“负离子粉”等,都有可能含有数量不等的放射性元素。使用盖格计数器,就能让这些放射源无处遁形。
DFRobot新品-Gravity:盖革计数器模块
Gravity: 盖革计数器模块的工作原理:
Gravity: 盖革计数器模块的盖革管的两极分别连接在外壳和中间的金属丝上,没有直接相连。管子内填充有稀薄的特制气体。在两极上施加一个高电压,默认情况下由于气体不导电,没有信号输出,当有高能粒子(也就是所谓辐射)射入盖革管,它携带的能量会使盖革管内气体电离(导电),两极短暂接通,输出一个信号,蜂鸣器叫一声,叫得越频繁CPM越高,说明进入盖革管的高能粒子数量越多,辐射就越强。DFRobot的Arduino库可以通过一个系数,将CPM换算为辐射单位μSv/h。
Gravity: 盖革计数器模块的安全范围,多少算正常?
Gravity: 盖革计数器模块的最大量程是1200 μSv/h (理论值)。最小值就等于当地的背景辐射强度(注意:最小值不稳定,因为生活中干扰太多,太阳直射都会导致读数波动);它的供电电压:3.3V ~ 5V,信号输出:数字输出,检测到脉冲时下拉;驱动电压:≈400V。
生活中辐射的安全范围,多少算正常?
辐射的单位分为辐射强度单位和剂量单位,μSv/h是辐射强度,在100μSv/h的环境里呆了1小时,那就是吃了100μSv剂量的辐射;
辐射强度大不代表不安全,比如去医院拍X光、CT都会有很强的辐射强度,但是只拍一下就结束了,不会影响身体健康;
评价辐射安全的指标是年吸收剂量,一般人是一年2.4mSv(2400μSv),放射性行业工作人员的推荐上限是一年20mSv。
辐射强度足够大也可以秒杀,核电站规定1mSv/h以上为高辐射区域,需要有围栏和警告标志避免误入。
Gravity: 盖革计数器模块使用注意事项
♥ 本产品不是专业测量仪器,仅适用于原理研究与教学演示。不可用于直接影响人身安全的辐射剂量测量。
⚠ 盖革管易碎,使用时请轻拿轻放
☢ 盖格计数器只能检测电离辐射,如核辐射、X光、宇宙射线等。无法检测电磁辐射,如微波炉辐射、手机辐射、WiFi辐射、电磁炉辐射。
☢ M4011 型盖革管可以检测到 α 射线、β 射线、γ 射线。其中对硬 β 射线和 γ 射线可以定量测量。
☀ 暴露在强光下可能导致盖革计数器读数偏高,请避免阳光直射盖革管
⚡ 盖革管使用高达 400V 的电压驱动,通电后禁止触摸盖革管正极附近高压电路
结节照片:
技术参数
盖革计数器
供电电压:3.3V ~ 5V
信号输出:数字输出,检测到脉冲时下拉
驱动电压:≈400V
最大量程:1200 μSv/h (理论值)
外形尺寸:107mm × 42mm
M4011 盖革管
工作电压:380V ~ 450V
本底计数:≈25CPM
CPM比率:153.8 CPM/(μSv/h)
外形尺寸:Φ10mm × 88mm
功能说明
引脚
① - 电源负极
② + 电源正极
③ D 信号输出
开关
④ 信号蜂鸣器开关
使用教程
准备
硬件
Arduino UNO x1
Gravity: 盖革计数器模块
Gravity 3Pin 连接线
Gravity: 盖革计数器 Arduino 库:
https://github.com/cdjq/DFRobot_Geiger
官方示例程序
/*!
@file geiger.ino
@brief 检测CPM辐射强度,开始几次的读数可能有较大偏差,3次后数据趋于稳定
@copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
@licence The MIT License (MIT)
@author [fengli](li.feng@dfrobot.com)
@version V1.0
@date 2021-9-17
@get from https://www.dfrobot.com
@https://github.com/DFRobot/DFRobot_Geiger
*/
#include <DFRobot_Geiger.h>
#if defined ESP32
#define detect_pin D3
#else
#define detect_pin 3
#endif
/*!
@brief Constructor
@param pin 外部中断引脚
*/
DFRobot_Geiger geiger(detect_pin);
void setup()
{
Serial.begin(115200);
//开始计数,启用外部中断
geiger.start();
}
void loop() {
//开始计数,启用外部中断
//geiger.start();
delay(3000);
//暂停计数,关闭外部中断触发,CPM和辐射强度值保持在暂停前状态
//geiger.pause();
//获取当前CPM,若已暂停,则CPM为暂停前最后数值
//通过3秒内的下降沿脉冲预测CPM,误差为±3CPM
Serial.println(geiger.getCPM());
//获取当前nSv/h,若已暂停,则nSv/h为暂停前最后数值
Serial.println(geiger.getnSvh());
//获取当前μSv/h,若已暂停,则μSv/h为暂停前最后数值
Serial.println(geiger.getuSvh());
}ESP8266示例:
// 引入Arduino核心库
#include <Arduino.h>
// 引入U8g2库,用于驱动OLED屏幕
#include <U8g2lib.h>
// 检查是否定义了U8X8_HAVE_HW_SPI,如果定义了,则引入SPI库,用于硬件SPI通信
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
// 检查是否定义了U8X8_HAVE_HW_I2C,如果定义了,则引入Wire库,用于硬件I2C通信
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
// 初始化U8g2对象,用于控制OLED屏幕
// 参数为:屏幕类型,复位引脚(这里不使用,设为U8X8_PIN_NONE),时钟引脚SCL,数据引脚SDA
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA);
// 引入ESP-NOW库,用于ESP8266之间的无线通信
#include <WifiEspNow.h>
// 引入ESP8266 WiFi库,用于管理WiFi连接
#include <ESP8266WiFi.h>
// 注释说明:先烧录程序,通过串口打印本机MAC地址,然后记录下来
// 对于两个设备,A设备使用B设备的MAC地址,B设备使用A设备的MAC地址
// 接收设备的MAC地址,需要根据每个设备进行修改
static uint8_t PEER[] {0xCA, 0x2B, 0x96, 0x2F, 0x68, 0x95}; // b设备的MAC地址
// 注释掉的MAC地址是a设备的MAC地址,如果需要,可以取消注释并修改
//atic uint8_t PEER[] {0xA6, 0xCF, 0x12, 0xEF, 0x75, 0x82}; // a设备的MAC地址
// 加密通信使用的16进制密钥,可以自定义更改
static uint8_t key[] = {
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF
};
// 定义按钮和LED引脚
int btn_open = 5; // 打开按钮引脚
int btn_close = 14; // 关闭按钮引脚
int led = 2; // LED引脚
void setup()
{
// 初始化串口通信,波特率为115200
Serial.begin(115200);
Serial.println();
// 初始化OLED屏幕
u8g2.begin();
// 启用UTF-8字符打印
u8g2.enableUTF8Print();
// 初始化IO引脚
IO_init();
// 设置AP模式并打印本机MAC地址
SetAP();
// 初始化ESP-NOW
Init_ESP_NOW();
}
void loop()
{
// 检查按钮事件
btn_Event();
}
// 初始化IO引脚
void IO_init()
{
// 设置按钮引脚为输入模式,启用内部上拉电阻
pinMode(btn_open, INPUT_PULLUP);
pinMode(btn_close, INPUT_PULLUP);
// 设置LED引脚为输出模式
pinMode(led, OUTPUT);
// 初始化LED为关闭状态
digitalWrite(led, HIGH); // 假设LED在HIGH状态下关闭,这取决于LED和电路的实际连接
}
// 按钮事件检测
void btn_Event()
{
// 检查打开按钮是否被按下
if (digitalRead(btn_open) == LOW)
{
// 发送"打开"数据
Send_data("打开");
// 等待200毫秒
// 定义一个长度为6的uint8_t数组,用于存储MAC地址
uint8_t mac[6];
// 获取当前AP模式的MAC地址,并存储在mac数组中
WiFi.softAPmacAddress(mac);
// 打印一个空行
Serial.println();
// 打印提示信息,告诉用户可以将以下MAC地址粘贴到其他设备的程序中
Serial.println("您可以将以下内容粘贴到其他设备的程序中:");
// 使用printf格式化输出MAC地址,以十六进制形式显示
Serial.printf("static uint8_t PEER[]{0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X};\n", mac[0],
mac[1], mac[2], mac[3], mac[4], mac[5]);
// 打印一个空行
Serial.println();
// 初始化ESP-NOW通信
void Init_ESP_NOW()
{
// 尝试开始ESP-NOW,如果成功返回true,否则返回false
bool ok = WifiEspNow.begin();
// 如果初始化失败,打印错误信息并重启ESP8266
if (!ok) {
Serial.println("WifiEspNow.begin() 失败");
ESP.restart();
}
// 设置当接收到ESP-NOW数据时调用的回调函数
WifiEspNow.onReceive(printReceivedMessage, nullptr);
// 尝试添加通信对端设备,需要指定对端MAC地址、通信通道和密钥
ok = WifiEspNow.addPeer(PEER, 3, key);
// 如果添加对端失败,打印错误信息并重启ESP8266
if (!ok) {
Serial.println("WifiEspNow.addPeer() 失败");
ESP.restart();
}
}
// ESP-NOW发送数据函数
void Send_data(String str)
{
// 定义一个字符数组,用于存储待发送的数据
char data[60];
// 获取字符串长度
int len = str.length();
// 将字符串内容复制到字符数组中,注意限制长度不超过60
for (int i = 0; i < len; i++)
{
if (i > 59) // 注意这里应该是i > 59而不是i > 60,否则最后一个字符不会被复制
{
break;
}
data[i] = str[i];
}
// 发送数据,使用ESP-NOW通信
bool f = WifiEspNow.send(PEER, reinterpret_cast<const uint8_t*>(data), len);
// 打印发送的数据内容
Serial.println("发送数据:" + str);
// 根据发送结果打印成功或失败信息
if (f)
{
Serial.println("发送成功");
}
else
{
Serial.println("发送失败");
}
}
// ESP-NOW数据接收回调函数
void printReceivedMessage(const uint8_t mac[WIFIESPNOW_ALEN], const uint8_t* buf, size_t count,
void* arg)
{
// 将接收到的数据转换为字符串
String data = "";
for (int i = 0; i < static_cast<int>(count); ++i) {
data += char(buf[i]);
}
// 调用数据处理函数
Handler(data);
}
// 数据接收处理函数
void Handler(String read_data)
{
// 如果接收到的数据不为空
if (read_data != "")
{
// 打印接收到的数据
Serial.println("收到数据:" + read_data);
// 根据接收到的数据内容执行相应操作
if (read_data == "打开")
{
// 关闭LED(假设LED在0为关闭状态)
digitalWrite(led, 0);
// 清除OLED屏幕内容
u8g2.clearBuffer();
// 设置字体
u8g2.setFont(u8g2_font_wqy13_t_gb2312);
// 设置光标位置
u8g2.setCursor(25, 10);尺寸图:

我要赚赏金
