Arduino GeigerzaehlerSimulator

From
Jump to: navigation, search

Geigerzähler Simulator

Hier mal ein erster Entwurf von einem Geigerzähler Simulator als Spielzeug. Basis ist ein Raspberry Pi Pico. Er verwendet:

  • 9 LEDs als optische Anzeige
  • ein Voltmeter als Nadelanzeige
  • Einen Lautsprecher

Hier der Code den ich für die erste Version verwendet habe


/*

 Geigerzaehler Simulator V 1.0
 Für Rasperberry Pi Pico
 Geigerzähler haben etwa maximal 500 counts pro Minute, etwa 8,3 counts pro Sekunde
 zur Vereinfachung verwnedet das Programm 600 counts pro Minute, was 10 counts pro Sekunde macht
 das ergibt etwa alle 100 ms +- Jitter einen Impüls. Mit 10 ms Zykluszeit sollte das ganz gut werden.


  • /

// Variablen für die LED Ausgabe auf 9 LEDs // 1 - 3 grün // 4 - 6 gelb // 7 - 9 rot bool bLED1 , bLED2 , bLED3 , bLED4 , bLED5 , bLED6 , bLED7 , bLED8 , bLED9 ; int iLED1 = 6; int iLED2 = 7; int iLED3 = 8; int iLED4 = 9; int iLED5 = 10; int iLED6 = 11; int iLED7 = 12; int iLED8 = 13; int iLED9 = 14;

// Varibalen für den Lautsprecher Ausgang bool bSpeaker; int iSpeaker = 17;

// Variablen für den Analog Zeiger Ausgang bool bAnalog; int iAnalog = 16;

// Variable für Potentionmeter Eingang ( Pegel , Strahlenlevel) int iStrahlenlevel; // (0.. 500) int iPinStrahlenlevel = 28; // ADC Pin für das Strahlenlevel


// sonstige Variablen int iLoopCounter; // Schleifenzaehler

void setup() {

 // Setup der Pins
 pinMode(LED_BUILTIN, OUTPUT); // Takt blinken der internen LED (GP 25)
 pinMode(iLED1, OUTPUT);
 pinMode(iLED2, OUTPUT);
 pinMode(iLED3, OUTPUT);
 pinMode(iLED4, OUTPUT);
 pinMode(iLED5, OUTPUT);
 pinMode(iLED6, OUTPUT);
 pinMode(iLED7, OUTPUT);
 pinMode(iLED8, OUTPUT);
 pinMode(iLED9, OUTPUT);
 pinMode(iSpeaker, OUTPUT);
 pinMode(iAnalog, OUTPUT);

}

// the loop function runs over and over again forever void loop() {

 iStrahlenlevel = analogRead(iPinStrahlenlevel);
 if (iStrahlenlevel > 640) {
    iStrahlenlevel = 640;
 }
 if (iLoopCounter <= 0) {
   // Dauer bis zum nächsten Impuls
   // minimum  10 bei Strahlenlevel 600
   // maximum xxx bei Strahlenlevel 0
   iLoopCounter = 5 + random((600-iStrahlenlevel) / 10 ,(600-iStrahlenlevel) / 10  + (600 / (iStrahlenlevel + 1))); // +1 um division by zero zu vermeiden
   digitalWrite (iSpeaker, HIGH);
   digitalWrite (iAnalog, HIGH);
 } else {
   iLoopCounter -= 1;
   digitalWrite (iSpeaker, LOW);
   digitalWrite (iAnalog, LOW);
 }
 bLED1 = iStrahlenlevel > 0;
 bLED2 = iStrahlenlevel > 80;
 bLED3 = iStrahlenlevel > 160;
 bLED4 = iStrahlenlevel > 240;
 bLED5 = iStrahlenlevel > 320;
 bLED6 = iStrahlenlevel > 400;
 bLED7 = iStrahlenlevel > 480;
 bLED8 = iStrahlenlevel > 560;
 bLED9 = iStrahlenlevel > 630;
 digitalWrite (iLED1, bLED1);
 digitalWrite (iLED2, bLED2);
 digitalWrite (iLED3, bLED3);
 digitalWrite (iLED4, bLED4);
 digitalWrite (iLED5, bLED5);
 digitalWrite (iLED6, bLED6);
 digitalWrite (iLED7, bLED7);
 digitalWrite (iLED8, bLED8);
 digitalWrite (iLED9, bLED9);
 delay(10);

}