Geigerzähler – die Software

Loading

DSC_2266Wie vor längerer Zeit im Blog angekündigt, soll der Geigerzähler nun eine Software bekommen, die nicht nur die Pulse des Zählrohres zählt, sondern sie auch auf eine Einheit bezieht. Hierzu waren aber noch kleine Änderungen an der Hardware notwendig. (genauer gesagt habe ich andere Pins des Arduino verwendet – was bedeutet: Leiterbahnen durchtrennen und mit Schaltlitzen neu verlegen). Hier eine Liste der Änderungen:

 

  • die Leitung von Pin4 Arduino zu Pin D7 vom LCD unterbrechen
  • die Leitung von Pin5 Arduino zu Pin D6 vom LCD unterbrechen
  • D7 vom LCD an Pin12 vom Arduino verbinden
  • D6 vom LCD an Pin13 vom Arduino verbinden
  • der Zählimpuls wird von TP3 auf Arduino Pin4 geschaltet
  • die Verbindung TP3 zu Arduino Pin23 wird getrennt

Daraus ergibt sich folgende I/O Port/Pin Belegung:

LCD Display:

RS – Ardunio PIN18 – Arduino  I12
EN – Arduino PIN17 – Arduino  I11
D4 – Arduino PIN11 – Arduino  I5
D5 – Arduino PIN6  – Arduino  I4
D6 – Arduino PIN13 – Arduino I7
D7 – Arduino PIN12 – Arduino  I6

Weitere Pins:

COUNT – Arduino PIN4 – Arduino I2
BUZZ – Arduino PIN14 – Arduino I9
STATUS – Arduino PIN3 – Arduino I1
SET – Arduino PIN2 – Arduino I1

Hier der Arduino Code:

/*Geiger Vx.1 geändertes pinning
* Pinzuordnungen allgemein für LCD
* RS to IO12 (pin18)
* EN to IO11 (pin17)
* D4 to IO5  (pin11)
* D5 to IO4  (pin6)
* D6 to IO7  (pin13)
* D7 to IO6  (pin12)
* R/W to ground
* VSS to ground
* Pinzuordnungen für Counter
* count to IO2 (ic pin4) = INT0
* buzzer to IO9 (ic pin15)
*/

// include libraries
#include <LiquidCrystal.h>

// interfacepins initialisieren
LiquidCrystal lcd(12,11,5,4,7,6);

// Dosiskobersionsfaktor - CPM to uSV/h
#define dconv 0.007  //(ca Umrechnung aus Diagramm Datenblatt des ZP1400 Zählrohrs)

// Konstanten Hardware I/Os
const int buzzerpin = 9;
const int geiger_input = 2;
const int keystat = 0;
const int keyset = 1;

// Variablen
long count = 0;
long countPerMinute = 0;
long timePrevious = 0;
long timePreviousMeassure = 0;
long time = 0;
long countPrevious = 0;
float radiationValue = 0.0;

void setup(){
pinMode(geiger_input, INPUT);
Serial.begin(19200);

//setup LCD und Begruessungsanzeige
lcd.begin(8, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Geiger ");
lcd.setCursor(0,1);
lcd.print("Counter ");
delay(1000);

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("V0.0 beta");
delay(1000);

lcd.clear();
lcd.setCursor(0,1);
lcd.print("ibiretro");
delay(500);
for (int i=0;i<8;i++){
delay(200);
tone(buzzerpin,i*100,100);
lcd.scrollDisplayLeft();
}

delay(500);

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CPM=");
lcd.setCursor(4,0);
lcd.print(6*count);
lcd.setCursor(0,1);
lcd.print(radiationValue);

attachInterrupt(0,countPulse,RISING);

}

void loop(){
if (millis()-timePreviousMeassure > 10000){
countPerMinute = 6*count;
radiationValue = countPerMinute*dkonv;
timePreviousMeassure = millis();

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CPM=");
lcd.setCursor(4,0);
lcd.print(countPerMinute);
lcd.setCursor(0,1);
lcd.print(radiationValue,4);
lcd.setCursor(6,1);
lcd.print(" uSv/h");
/* zum debuggen 
Serial.print("cpm=");Serial.print(countPerMinute,DEC);
Serial.print("uSph=");Serial.println(radiationValue,4);
*/
count = 0;

}

}

void countPulse(){
detachInterrupt(0);
count++;
tone(buzzerpin,1000,10);
while(digitalRead(2)==1){
}
attachInterrupt(0,countPulse,RISING);
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.