Dieses Blog durchsuchen

Geigerzähler - die Software

Wie 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. (genauergesagt 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);  
 }