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