- Joined
- Sep 20, 2013
- Messages
- 17,410
- Points
- 113
Long time no hear from. Nice to see you again. I'll be watching if you find time.
looks like a fun project! Here are some of the readings I had on scintillators in my undergrad in nuclear chemistry. its on pages 9-12 Its a good read and has a nice diagram and the advantages and disadvantages of solid-state vs scintillators
http://courses.chem.indiana.edu/c460/documents/SEC6Detectors.pdf
/*
Geiger counter Enotria1 Rev. 1.2 (Interrupt)
di Andrea Bosi alias Enotria
Inizio Feb. 2011, Fine marzo 2011
Note: Pulsanti tutti NA
*/
#define PIN 10 // Pin di comando SET
#include <EEPROM.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte SetTemp=0; // Indice della Base Tempi
long Imp=0; // Impulso
long TotImp=0; // Totale degli impulsi
long BaseTempi=10; // * * * Base tempi in secondi
long TempoMax=0; // Termine conteggio
int VarServInt=0; // Variabile di servizio
int Set=1; // Set su Battery
int Manca=0; // Tempo mancante alla fine in secondi
char UnMis[5]="sec."; // Unità di misura della base tempi
unsigned int Sens=3300; // Sensibilità in mR/h
float CPM=0; // CPM
float Molt=6; // * * * Moltiplicatore fra CP e CPM (dipende da BaseTempi)
float Rad=0.0; // Radioattività espressa in mR/h
long Volt=0; // Tensione
// Base Tempi ---------------
int Tempo[6]={
10,30,60,180,600,1800};
float K[6]={
6,2,1,.333,.1,.033};
void setup() {
lcd.begin(16, 2);
pinMode(13, OUTPUT);
pinMode(PIN,INPUT);
pinMode(7,INPUT); // Ingresso impulso della sonda
pinMode(8,INPUT); // Tasto +
pinMode(9,INPUT); // Tasto -
pinMode(14,INPUT);
SetMode();
//Serial.begin(9600);
PCICR |= (1 << PCIE2);
PCMSK2 = (1 << PCINT23) ; // pin7
}
void loop()
{
Scaler();
}
// ------------ Fine programma ---------------------
void Tasto()
// Attende la pressione del tasto Set/Start
{
delay(500);
do {
VarServInt=digitalRead(PIN);
}
while (VarServInt==HIGH);
}
void SetMode()
// Visualizza e Cambia la modalità di funzionamento
{
SetTemp=EEPROM.read(0); // Legge Set della Base Tempi
Sens=EEPROMReadInt(1); // Legge Sensibilità Sonda
// Tensione HT alla sonda
delay(500);
do {
Volt=0;
for (VarServInt=1; VarServInt <= 5000; VarServInt++)
{
Volt = Volt + analogRead(0)*2;
if (digitalRead(PIN)== LOW) goto Sensibilita;
}
Volt=Volt/5000; // media di 5000 letture
lcd.setCursor(0, 0);
lcd.print(" H. T. ");
lcd.setCursor(0, 1);
lcd.print(" Volt");
lcd.setCursor(6, 1);
lcd.print(Volt);
}
while (digitalRead(PIN)== HIGH);
Sensibilita:
/* Sensibilità della sonda in CPM x 1 mR/h
Il massimo indicabile è 63000, eventualmente indicare
il valore togliendo 3 zeri, es. sensibilità di 100000 CPM/mR/h
impostare 100 e dividere la lettura per 1000
*/
lcd.setCursor(0, 0);
lcd.print(" CPM x mR/h ");
lcd.setCursor(0, 1);
lcd.print(" ");
delay(500);
do {
lcd.setCursor(6, 1);
lcd.print(" ");
lcd.setCursor(6, 1);
lcd.print(Sens);
if (digitalRead(8)== HIGH && Sens<64000) {
if (Sens < 10000) Sens=Sens+100;
else Sens=Sens+1000;
}
if (digitalRead(9)== HIGH && Sens >= 100) {
if (Sens < 10000) Sens=Sens-100;
else Sens=Sens-1000;
}
delay(50);
}
while (digitalRead(PIN)== HIGH);
// Base dei tempi
lcd.setCursor(0, 0);
lcd.print(" TIME seconds ");
lcd.setCursor(0, 1);
lcd.print(" ");
delay(500);
do {
BaseTempi= Tempo[SetTemp];
Molt= K[SetTemp];
lcd.setCursor(6, 1);
lcd.print(" ");
lcd.setCursor(6, 1);
lcd.print(BaseTempi,DEC);
delay(50);
if (digitalRead(8)== HIGH && SetTemp < 6) SetTemp++;
if (digitalRead(9)== HIGH && SetTemp > 0) SetTemp--;
delay(50);
}
while (digitalRead(PIN)== HIGH);
delay(50);
// Memorizza i valori di Base Tempi e Sensibilità
EEPROM.write(0,SetTemp); // Scrive Set della Base Tempi
EEPROMWriteInt(1,Sens); // Scrive Sensibilità Sonda
}
void Display_Conta()
// Aspetto del display durante il conteggio
{
// Display presente durante il conteggio
lcd.setCursor(0, 0);
lcd.print("Time ");
// --------1234567890123456----
lcd.setCursor(12, 0);
lcd.print(UnMis);
// --------1234567890123456----
lcd.setCursor(0, 1);
lcd.print("Pulse ");
// --------1234567890123456----
}
void Display_Fine()
// Aspetto del display a fine conteggio
{
// Display presente alla fine del conteggio
lcd.setCursor(0, 0);
lcd.print("CPM ");
// --------1234567890123456----
lcd.setCursor(0, 1);
lcd.print("mR/h ");
// --------1234567890123456----
}
void Fine_Cont()
// Finito il conteggio mostra risultato e poi resetta
{
cli();
CPM=TotImp*Molt;
sei();
Rad=CPM/Sens;
Display_Fine();
lcd.setCursor(5, 0);
lcd.print(CPM,0);
lcd.setCursor(9, 1);
lcd.print(Rad,3);
// Se base tempi <= 1 minuto pausa, altrimenti aspetta tasto
if (Molt > 1)delay(5000);
else Tasto();
cli();
TotImp=0;
sei();
TempoMax=millis()+BaseTempi*1000; // Nuovo tempo limite
Display_Conta();
}
void Visual_Cont()
// Visualizza il conteggio sul display
{
lcd.setCursor(5,0);
lcd.print(" ");
lcd.setCursor(6,0);
lcd.print(int((TempoMax-millis())/1000));
lcd.setCursor(6, 1);
lcd.print(TotImp);
}
ISR(PCINT2_vect) // scatta solo quando il pin 7 cambia stato
{
if ( (PIND&(1<<7))!=0) // somma solo quando cambia in su
TotImp++;
}
void Scaler()
// Misura impulsi
{
VarServInt=digitalRead(PIN);
// Va premuto SOLO all'uscita del Display Fine per non rallentare
if (VarServInt==LOW) SetMode();
TempoMax=millis()+BaseTempi*1000;
Display_Conta();
do {
/*
// Crea gli impulsi solo per prova
Imp= random(1,10000);
// Da sostituire con if (digitalRead(7)== HIGH)
if (Imp <= 2)
{
// impulso valido
TotImp++;
}
*/
// Lettura reale degli impulsi
/*
if (digitalRead(7)== HIGH)
{
TotImp++;
delayMicroseconds(100);
}
*/
// Visualizza conteggio in corso 10 volte ogni secondo
if (millis()%100 < 1) Visual_Cont();
}
while (TempoMax > millis());
// Fine conteggio
Fine_Cont();
}
//This function will write a 2 byte integer to the eeprom at the specified address and address + 1
void EEPROMWriteInt(int p_address, int p_value)
{
byte lowByte = ((p_value >> 0) & 0xFF);
byte highByte = ((p_value >> 8) & 0xFF);
EEPROM.write(p_address, lowByte);
EEPROM.write(p_address + 1, highByte);
}
//This function will read a 2 byte integer from the eeprom at the specified address and address + 1
unsigned int EEPROMReadInt(int p_address)
{
byte lowByte = EEPROM.read(p_address);
byte highByte = EEPROM.read(p_address + 1);
return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}