Не работает Счётчик Гейгера.
Схема (взял схему китайской повышайки https://aliexpress.ru/item/1005005455987375.html и PC817):
Накидал макетку (PC817 с обратной стороны платы, так как рассчитывал нормально припаять детали, но потом стало лень сверлить отверстия):
На датчике 366 вольт:
Код Arduino Nano:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define NUMFLAKES 10 // Number of snowflakes in the animation example
void setup() {
Serial.begin(9600);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
// Clear the buffer
display.clearDisplay();
// Draw a single pixel in white
display.drawPixel(10, 10, SSD1306_WHITE);
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(1, 0);
display.println(0);
// Show the display buffer on the screen. You MUST call display() after
// drawing commands to make them visible on screen!
display.display();
attachInterrupt(0, isr1, CHANGE);
}
uint16_t ii = 0;
void isr1() {
++ii;
}
void loop() {
display.clearDisplay();
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(1, 0);
display.println(ii);
display.display();
}
Датчик СБМ 20 рабочий, проверил его на счётчике Гейгера от FNIRSI.
Если замыкать проводком контакты эмитируя работу датчика СБМ 20, то код считает нормально, но если подключить датчик, то ни чего не происходит.
Есть предположение, что PC817 так быстро меняет состояние, что Arduino Nano не успевает его зарегистрировать.
Уважаемые форумчане, есть идеи заставить схему работать ?
ua6em
02.Октябрь.2025 17:15:34
2
видимо надо переделать так:
как минимум , попробуйте D2 подтянуть не к +3.3, а к +5в
Есть предположение, что оптрон настолько инерционен, что не успевает открыться за время короткого импульса с датчика.
10k для такого оптрона - очень много.
Да, ещё переменную так объявите
volatile uint16_t ii = 0;
Не может такого быть, она очень медленная.
т.е. типичное время 4/3 микросекунды, чему там не успевать?
Дим-мычъ:
volatile uint16_t ii = 0
Попробовал не помогло
Тоже попробовал, не помогло
Поменял на 2.2k не помогло.
Повесил на D2 щуп осциллографа, сигналов с PC817 не увидел.
Похоже Вы правы.
Попробую заменить PC817 на эту схему:
Повесьте щуп на анод диода оптопары(1 пин) , и , посмотрите, что идёт с датчика. Заодно можно посмотреть качество источника питания(не забыть про делитель на щупе осцилл. и предел измеряемого напряжения)
Он у меня до 400 вольт (FNIRSI® DPOS350P 4-IN-1 350MHz 1GSPS Tablet Oscilloscope Signal Genera ), я боюсь его сжечь, тыкая щупом в анод диода оптопары, ведь 360 вольт показывает мультиметр, а на самом деле пики могут и 500 вольт быть.
Как вариант, сделать делитель из резисторов, а, лучше купить щуп с делителем, на нужное напряжение
P.S.
Могут и больше быть
Совсем забыл, что у меня есть щуп на 2kV.
Крокодил на ногу 1 (оптопары), щуп на плюс:
Крокодил на минус, щуп на ногу 1 (оптопары):
Делитель на щупе соответствует установке на осциллографе?
Больше похоже на помехи от сети.
Глянул описание датчика - есть вопрос: почему резистор в аноде датчика 1МОм?
В описании рекомендуется 5.1МОм.
В схеме от @ua6em стоит 10МОм.
Может датчику уже кирдык?
P.S.
Максимальный допустимый ток у датчика 22мкА
Но этого тока не достаточно, чтобы нормально работала оптопара.
Отсюда вывод - лучше поискать другое схемное решение
P.P..S.
Например, поставить перед оптопарой полевой транзистор.
Датчику точно не кирдык, я его вчера проверил в дозиметре, он там считал исправно.
хз кому это интересно, но напишу отчёт, для уверенности увеличил сопротивление резистора до 5.3МОм, и взял 100% рабочий датчик, который я проверил на дозиметре, и один фиг импульсов нет, хотя если замыкать руками (выпаяв датчик), всё работает, что ещё раз подтверждает вывод:
Придётся всё таки собирать:
А так этого не хотелось)
Лучше найти проверенную схему, с , так сказать, "живым " свидетелем её работоспособности, т.е. тем, кто сам собирал
Проверенная схема-то есть. Но только я, например, собирал ее году в 1986.
Это уже хорошо, как по мне. Если ТС решится её собрать, он теперь знает, к кому можно обратиться.
Для старых деталей полно современных аналогов, не думаю, что будут с этим проблемы
Как вариант - использовать нужную часть схемы
Счётчик получился, он работает, показания даже похожи на правду, но задраивает показания, то есть сразу прибавляет по 2.
Например: 2, 4, 6, 8, 10 и тд, я так понимаю транзистор так долго открыт, что Arduino Nano успевает два раза выполнить данную функцию:
void isr1() {
++ii;
}
Что посоветуете уважаемые форумчане, добавить задержку, делить результат на 2, увеличить ёмкость конденсатора?
Собственно код тот же самый, только добавил volatile uint16_t ii = 0;как предложил Дим-мычъ
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define NUMFLAKES 10 // Number of snowflakes in the animation example
void setup() {
Serial.begin(9600);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
// Clear the buffer
display.clearDisplay();
// Draw a single pixel in white
display.drawPixel(10, 10, SSD1306_WHITE);
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(1, 0);
display.println(0);
// Show the display buffer on the screen. You MUST call display() after
// drawing commands to make them visible on screen!
display.display();
attachInterrupt(0, isr1, CHANGE);
}
volatile uint16_t ii = 0;
void isr1() {
++ii;
}
void loop() {
display.clearDisplay();
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(1, 0);
display.println(ii);
display.display();
}
МелкоМягкий:
Что посоветуете уважаемые форумчане, добавить задержку, делить результат на 2, увеличить ёмкость конденсатора?
Для начала в 38 строке поставь RISING или FALLING заместо CHANGE.
3 лайка