- Joined
- Sep 20, 2013
- Messages
- 17,541
- Points
- 113
Long time no hear from. Nice to see you again. I'll be watching if you find time.
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
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);
}