RikamIno - Radon-Ionisationskammer Break-Out für den Arduino

Begonnen von opengeiger.de, 29. April 2024, 21:49

⏪ vorheriges - nächstes ⏩

opengeiger.de

Mit einem HYT221 von der IST-AG (Schweiz). Nicht ganz billig aber dafür sehr genau (vor allem bei der Feuchte). Hauptgrund aber war, dass ich den noch in der Bastelkiste hatte .

https://www.reichelt.de/digitaler-feuchte-temperatursensor-0--100-rf-40--12-hyt-221-p105995.html?search=HYT221+

DL8BCN

Hallo, ich habe ja inzwischen 2 der Messkammern gebaut.
Beide liefern sehr unterschiedliche Messwerte.
Das kommt vermutlich von unterschiedlichen Leckströmen der JFET´s.
Im Grunde sind beide Aufbauten identisch.
Leider schwanken die Zyklenzeiten bei beiden zwischen 2 benachbarten Messungen stark.
Hier noch mal ein Beispiel:

Datum; Uhrzeit;  Sekunden ab Start; Dauer 1 Zyklus; Zyklen pro Stunde; Bequerel pro m³

2024-06-17 16:38:56; 2668;  678,88; 5,30;  54,76;
2024-06-17 16:59:14; 3886; 1214,07; 2,97; -155,63;

Ich konnte den Fehler noch nicht finden, vermute jedoch einen Fehler in der Software bei der Berechnungsformel.
Wobei es ja eigentlich nur auf die Dauer für einen Zyklus ankommt.
Die Frage ist, warum ist es einmal 678,88 Sekunden und im nächsten Durchlauf 1214,07 Sekunden dauert.
So stark kann die Radonkonzentration in der kurzen Zeit gar nicht schwanken.
Außerdem müsste man negative Messwerte unterdrücken. 

Radioquant98

Hallo opengeiger,

ich frage nur deshalb, weil ich gebeten wurde ein Layout zu entwerfen, damit im Anschluß Alle den gleichen Aufbau haben.
Dabei schwebt mir vor einen kleinen kalten oder beheizbaren Thermostaten vorzusehen. Also FET, einen kleinen Temperatursensor und einen Heizer. Als Heizer einen Transistor(kleiner BDxxx) und als Temperaturfühler einen B511 (AD590) oder Heißleiter.

Desweiteren ein Layout für ein pA-Meter ähnlich Stoppi.

Viele Grüße
Bernd

opengeiger.de

#228
Nach dem es nun doch noch einige Fragen zur Kalibration der RikamIno Ionisationskammer in Form von PNs gab, will ich hier nochmals eine ,,Indoor-Referenz"-Messung von 250g Superphosphat 18% von ICL-Fertilizers im 10-Liter Eimer mit der vollen Kalibration und Auswertung darstellen. Das Excel habe ich gezippt, dass es die Forum-Software akzeptiert, es heißt "RikamInoSp250gIndoor.xlsx.zip" im Anhang. Dazu nochmal die zwei Bilder, welche die Anordnung im Eimer zeigen. Eine richtige Radon-Referenzquelle ist das natürlich nicht, da bei der Düngemittel-Herstellung höchstens der Phosphatgehalt kontrolliert wird, bestimmt nicht der Radiumgehalt, und ob der Radiumgehalt nun bei diesem Düngemittel immer gleich ist, das kann ich nicht sagen.

Wichtig ist, dass der Arduino mit dem angefügten-Code nur die Rohdaten auf die Speicherkarte schreibt, also die Perioden-Dauern der Ladezyklen in Sekunden. Alles andere habe ich bisher noch in Form von Post-Processing im Excel gerechnet, insbesondere die Kalibration. Die Kalibrationskoeffizienten lassen sich dann für weitere Auswertungen verwenden. Was ich gegenüber dem bisher im Thread gezeigten Arduino Code noch hinzugefügt habe, ist den Code für den HYT221 Temperatur-/Feuchte Sensor. Der ist aber schon sehr speziell und man braucht das auch nur für Temperaturkompensation bei Outdoor-Messungen, wenn mal die Temperatur um mehr als 5°C schwankt.

Auf der Speicherkarte stehen also das Datum (Spalte A im Excel) und die Periode in s (Spalte C) als Messwert (plus Temperatur und Feuchte in Spalte E und F, das sei im Folgenden nur mal als reine Zusatzinformation betrachtet).

Als erstes berechne ich die Zeit in Tagen (Spalte B) seit Messbeginn, indem ich von den Datumswerten den ersten Datumswert abziehe. Dann berechne ich die Zyklen/h in Spalte D, als die eigentlich Messwerte, die zur Aktivitätskonzentration proportional sein sollten. Das ist der Kehrwert der Periodendauer in Sekunden multipliziert mit der Zahl der Sekunden pro Stunde.

Als nächstes nehme ich für die Modellparameter in der Modellfunktion der Aktivitätskonzentration:

A=A0*(1-EXP(-LN(2)/T12*t))+B

Schätzwerte für A, T12 und B an. Das sind die Werte in Spalte H2:H4. Damit rechne ich eine Kurvenanpassung der Modellkurve an die Messwerte in Spalte D mit dem Namen Fit. A0 ist darin der Sättigungswert, T12 die Halbwertszeit (deutlich kleiner als die des Radon wegen der Leckage im Eimer), t die Zeit in Tagen und der Wert B für den Nulleffekt. Diese Kurvenanpassung ist im ersten Ansatz wegen der Schätzung zunächst schlecht.  Dann aber berechne ich das Fehlerquadrat Err in Spalte H der Modellkurve gegenüber den tatsächlichen Messwerten und summiere den gesamten quadratischen Fehler im Feld H5 auf. Nun verwende ich den Solver Plug-In in Excel (bitte selber googeln) um das Feld H5 zu einem Minimum zu machen durch Änderung der Modellparameter in den Feldern H2:H4. Diese Lösung passt dann in der Regel sehr gut.

Als nächstes importiere ich die RadonEye Messwerte in Spalte M. Die haben nun die Einheit Bq/m^3. Da der Radon Eye keine Zeit loggt und man nur weiß, dass die Werte im Stundenraster gemessen sind, rechne ich mir nun die Zeitwerte des RadonEye in Tagen selbst aus (in Spalte L) und zwar mit dem Zeit-Offset tOfst im Feld M8 so, dass der letzte Zeitwert der RadonEye Messung zum letzten Zeitwert der RikamIno-Messung passt, da ich weiß, dass ich beide gleichzeitig ausgeschaltet habe. Nun kann ich mit den Modell-Parametern auch zu den RadonEye Zeiten ebenfalls die Werte der Modellkurve berechnen, so dass die zu den RadonEye-Werten koinzident sind. Diese Werte heißen RikamIno Model (Spalte N). Nun kann ich mit den Excel-Funktionen Steigung() und Achsenabschnitt() die Koeffizienten der Regressionsgerade (Felder M2:3) berechnen, die jetzt die Kalibrierkoeffizienten darstellen, mit denen man die Zyklen/h in Bq/m^3 umrechnen kann, wenn man davon ausgeht, dass der RadonEye richtig gemessen hat. Mit diesen Werten bekommt man schließlich die kalibrierten Werte der RikamIno-Modellkurve zu den RadonEye Zeiten in Spalte O.

Jetzt kann ich aber mit diesen Kalibrierkoeffizienten auch die vom RikamIno zu den Datalog-Zeiten direkt gemessenen Messdaten in Zyklen/h in Bq/m^3 umrechnen und in einer Grafik zusammen mit den RadonEye Daten darstellen. Damit kann man nun sehen, wie gut die Kalibration auf den RadonEye geklappt hat. 

Dazu gibt es nun die entsprechenden Grafiken unten. Die Zuordnung zu den obigen Schritten ergibt sich durch den Titel der Grafik und die entsprechenden Achsenbeschriftungen. Man kann sich natürlich auch durch Öffnen der Grafik im gezippten Excel die Quelle der Daten anschauen.

Ich hoffe das hilft nun.

Sie dürfen in diesem Board keine Dateianhänge sehen.

Sie dürfen in diesem Board keine Dateianhänge sehen.

Sie dürfen in diesem Board keine Dateianhänge sehen.

Sie dürfen in diesem Board keine Dateianhänge sehen.

Sie dürfen in diesem Board keine Dateianhänge sehen.



Hier der verwendete Arduino-Code mit HYT221(HYT939):
#include <Wire.h>
#define HYT939_ADDR 0x28
#define TFACTOR 99.2909
#define TDELTA 40.0
#define HFACTOR 163.83

#include <SPI.h>
#include <SD.h>
#include "RTClib.h"
#include "rgb_lcd.h"
#define N 50
#define MAXCNT 50


RTC_PCF8523 rtc;
char fileName[15] = "datalog.txt";
File myFile;

void setup()


  Wire.begin(); //HYT

  pinMode(10, OUTPUT); // SD Card CS
  Serial.begin(9600);


  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  //if (! rtc.isrunning()) {    //DS1307
  if (! rtc.initialized()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2017, 1, 21, 3, 0, 0));
  }
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  if (!SD.begin(10)) {
    Serial.println("SDcard not ready");
  }
  else
    Serial.println("SDcard ok");
 
  if (!SD.exists(fileName)) {
    myFile = SD.open(fileName, FILE_WRITE);
    myFile.println("###");
    myFile.flush();
  }
  else {
    myFile = SD.open(fileName, FILE_WRITE);
    myFile.println("-----");
    myFile.flush();
  } 
  Serial.println("Logging started ...");
}

void loop()
{
  //HYT
  unsigned int traw;
  unsigned int hraw;
  double temp;
  double hum;
  int i;
  unsigned char buffer[4];

  //RikamIno
  int out = A0;   
  int adcValue = 0; 
  unsigned long timeStart, timeStop, dt;
  float volt;
   
  pinMode(out, OUTPUT);
  digitalWrite(out, LOW); // discharge
  delay(1000);
  digitalWrite(out, HIGH);
  pinMode(out, INPUT);
  delay(1000);
  volt = 0;

  timeStart = millis();
  while (volt < 2.4) {
    adcValue = analogRead(out);
    volt = (float) adcValue*5/1023.0;
    timeStop = millis();
    dt=(timeStop-timeStart)/1000.0;
    delay(1000);
  }

  //read HYT
  Wire.beginTransmission(HYT939_ADDR); // transmit to device #44 (0x2c)
  Wire.endTransmission(); // stop transmitting   
  //100ms warten
  delay(100);
  //4 Bytes vom Sensor lesen
  Wire.requestFrom(HYT939_ADDR, 4,true);
  i=0;
  while(Wire.available()) {
    char c = Wire.read(); // receive a byte as character
    buffer[i]=c;
    i++;
  }
  //Rohdaten aus Puffer lesen
  traw=buffer[2]*256+buffer[3];
  hraw=buffer[0]*256+buffer[1];
  //Daten laut Datenblatt maskieren
  traw&=0xfffc;
  hraw&=0x3fff;
  traw=traw/4;
  //Rohdaten Umrechnen
  temp=(double)traw/TFACTOR;
  temp=temp-TDELTA;
  hum=(double)hraw/HFACTOR;

  /*
  Serial.print(temp);
  Serial.print(' ');
  Serial.print(",");
  Serial.println(hum);
  */
   
  //logging
  DateTime now = rtc.now();

  Serial.print(now.day());
  Serial.print('.');
  Serial.print(now.month());
  Serial.print('.');
  Serial.print(now.year());
  Serial.print(' ');
  Serial.print(now.hour());
  Serial.print(':');
  Serial.print(now.minute());
  Serial.print(':');
  Serial.print(now.second());
  Serial.print(' ');
  Serial.print(dt);
  Serial.print(' ');
  Serial.print(temp);     
  Serial.print(' ');
  Serial.print(hum);
  Serial.println();
 

  myFile.print(now.day(), DEC);
  myFile.print('.');
  myFile.print(now.month(), DEC);
  myFile.print('.');
  myFile.print(now.year(), DEC);
  myFile.print(' ');
  myFile.print(now.hour(), DEC);
  myFile.print(':');
  myFile.print(now.minute(), DEC);
  myFile.print(':');
  myFile.print(now.second(), DEC);
  myFile.print('\t');
  myFile.print(dt);    
  myFile.print('\t');
  myFile.print(temp);    
  myFile.print('\t');
  myFile.print(hum);    
 
  myFile.println();
  myFile.flush();   
}

DL8BCN

Sehr schön!
Danke auch für den Arduino Code.
Natürlich muss man das noch individuell anpassen.
Ich habe zum Beispiel keine Temperatur und Feuchtigkeitssensoren.
Ich denke die entsprechenden Zeilen kann man hoffentlich einfach auskommentieren.

opengeiger.de

Zitat von: DL8BCN am 04. Juli 2024, 09:54Ich denke die entsprechenden Zeilen kann man hoffentlich einfach auskommentieren.

Genau! Oder den bisherigen RikamIno-Code verwenden. Ich habe den Code für den HYT221 Sensor nur hinzugefügt.
Prinzipiell habe ich noch die Strategie nur die Rohdaten zu loggen und die Kalibration im Postprocessing zu machen. Als nächstes will ich mal in einen Keller mit gestampftem Lehmboden mit natürlicher Radonentwicklung. Damit will ich dann prüfen, wie gut da die Eimer-Kalibrierung noch passt.

DL8BCN

Insgesamt sehe ich bei deinem Setup eine wirklich gute Übereinstimmung der Werte zwischen dem RikamIno und dem RadonEye.
Bis auf eine etwas glattere Kurve beim RadonEye.
Da könnte man aber sicherlich auch noch eine Dämpfung einbauen um die Kurve etwas zu glätten.
Wobei ich das nicht wirklich schlimm finde.

DL8BCN

Bei meiner Version gibt es ja auch ein Display.
Das zeigt nach jedem Zyklus u.a. den Wert Bq/m³ in Klartext an.
Für mich wäre es daher schön die Formel für die Kalibrierwerte mit in den Arduino Code zu übernehmen.
Das hatte ich ja versucht, bin aber noch nicht erfolgreich gewesen, wie ich ja schon berichtet hatte.
Ich bin absoluter Beginner in der Programmierung der Arduino Software.
Das macht die Sache nicht einfacher.
Zum Glück kann ich mir aber zeitweise Unterstützung holen.
Ich werde da nun noch mal rangehen, wenn Zeit ist.

opengeiger.de

#233
Hier kommen nun meine ersten RikamIno-Messungen aus einem Keller mit gestampftem Lehmboden. Leider hat der Keller keinen Netzanschluß, daher musste ich komplett auf Modellbau-Akkubetrieb umstellen. Blöd daran war nur, dass sich dadurch die Kammerspannung geringfügig geändert hat, sie wird jetzt von drei 2S-Lipo-Akkus geliefert und liegt mit etwa 23V doch etwas höher im Eimer (19.5V). Daher passt die Eimer-Kalibration schon aus dem Grund nicht so genau. Ich denke aber auch, dass das Gleichgewicht zwischen dem Radon und seinen Zerfallsprodukten etwas anders aussieht als in dem doch leicht feuchten Keller und diese auch einen deutlichen Einfluß auf die Kalibration haben wird. Allerdings habe ich einen Weg gefunden sehr einfach nachzukalibrieren. In Excel geht das mit der Funktion Sverweis() ganz gut. Damit bekommt man für jeden RadonEye Messwert einen Messwert des RikamIno rausgesucht, der doch etwas häufiger misst. Damit bekommt man auch wieder einigermaßen koinzidente Wertepaare und kann eine Regressionsgerade in den Korrelationsplot gerechnet. Das Bestimmtheitsmass ist allerdings nun nicht mehr so toll, weil jetzt natürlich die Messwerte eher normalverteilt sind und sich um einen Mittelwert häufen und ganz so viel Bewegung wie im Eimer bekommt man in so einem Keller nicht zu sehen.

Sie dürfen in diesem Board keine Dateianhänge sehen. 

Dennoch kommt jetzt das Ergebnis eigentlich recht gut raus:

Sie dürfen in diesem Board keine Dateianhänge sehen.

Wenn man nun den RikamIno auch noch glättet (Mittelwert aus 3 Messwerten), dann sieht das noch etwas besser aus:

Sie dürfen in diesem Board keine Dateianhänge sehen.

Nun kann man die Diskrepanz der Stundenwerte zwischen RikamIno und RadonEye ausrechnen (Differenz), dann sieht man, dass die etwa bei +/-60Bq/m^3 liegt:

Sie dürfen in diesem Board keine Dateianhänge sehen.

Ich denke das ist schon recht brauchbar für ein mit einfachsten Mitteln selbstgebautes Radon-Messgerät.

opengeiger.de

Wer Prüfungen in Statistik in der Schule oder im Studium hat machen müssen, der hat sicher jeden Spaß an dieser mathematischen Disziplin verloren und hätte Herrn Gauß danach auf den Mond jagen können. Aber meist lag das daran, wie der Lehrstoff dazu vermittelt wurde. Dabei kann das doch soooo hilfreich sein  :D . Jedenfalls kam mir heute früh die Idee, dass man im Falle einer Radonmessung im Keller mit einem zu kalibrierenden Instrument und einem Referenzinstrument, die Kalibration auch auf einer statistischen Basis machen könnte. Und es sieht so aus, dass das im Fall des RikamIno und des RadonEye tatsächlich geht  :) .

Die Grundannahme dazu ist, entsprechend der Beobachtung, dass die Radonaktivitätskonzentration in einem Keller statistisch schwankt. Schuld daran ist hauptsächlich das Wetter. Nun sieht man aber, dass die Verteilung zumindest in dem bisherigen kurzen Messzeitraum annähernd gaußverteilt ist, mit einem Mittelwert my und einer Standardabweichung sigma, sowohl beim RadonEye (my2, sigma2), als auch beim RikamIno (my1, sigma1). Wenn man trotz des lausigen Unterrichts im Unterricht aufgepasst hat, hat man mitbekommen, dass sich eine Zufallsvariable durch eine lineare Funktion mit Offset a und Steigung b auch auf andere Zufallsvariable abbilden lässt. Und wenn die erste Zufallsvariable mit my1 und sigma1 verteilt war, dann ergibt sich nach der linearen Abbildung von X mit Y = a + b*X für Y ein sigma2 = b*sigma1 und ein my2 = my1*b+a. Das heißt, die neue Zufallsfunktion ist mit sigma2 = b* sigma1 und mit my2 = my1*b+a auch wieder gaußverteilt. Wenn jetzt beide Messinstrumente bei einer koinzidenten Messung am gleichen Ort also mit my1 und sigma1 bzw. my2 und sigma2 verteilt sind, dann müssen a und b die Kalibrierfaktoren der Messwerte von Instrument1 und Instriment 2 sein. D.h. man kann den RikamIno (Instrument1) auf den RadonEye (Instrument2) rein statistisch kalibrieren, wenn man aus den jeweiligen Messwerten my und sigma bestimmt und damit b= sigma2/sigma1 und a=my2-my1*b ausrechnet. Soweit mal die trockene Theorie.

Jetzt hab ich das aber mal in der Praxis angewandt und tata tata, das kommt richtig gut raus  :yahoo: . Zunächst mal die rohen Stundenwerte (RikamIno mit Excel-Sverweis()-Funktion und RadonEye Stundenwerte):

Sie dürfen in diesem Board keine Dateianhänge sehen.

und dann die RikamIno-Werte geglättet und die RadonEye Stundenwerte:

Sie dürfen in diesem Board keine Dateianhänge sehen.

Das sieht doch fast besser aus als die normale Kal mit Regressionsrechnung (die ja letzten Endes auch einen statistischen Ursprung hat). b ist dabei 77.2675Bq/m^3 / (Zyklen/h) und a ist -155.4435Bq/m^3, was sich nun als Kalibrierkoeffizienten für meinen RikamIno Prototyp2 gegen den RadonEye (oberes Spanungslimit 2.4V und einer Kammerspannung von 23V) anwenden lässt. Sieht doch so schlecht nicht aus, oder  ;D ?