Atom Poor: Atom Fast App (Bluetooth) mit anderem Geigerzähler benutzen

Begonnen von DG0MG, 12. Februar 2021, 20:51

⏪ vorheriges - nächstes ⏩

spika1

Hallo DG0MG,

erstmal vielen Dank für deinen Sketch!

ZitatHier mein letzter Stand, der aber auch nicht perfekt ist (AtomPoor.ZIP).

Mein Messsensor waren 6 SBM-19 (Beta-Sonde POLON SGB-3P), die natürlich eine erheblich höhere Impulsrate liefern, als ein einzelnes SBM-20. Für gute Ortsauflösung muss die Messzeit kurz sein.

Ich habe diesen Sketch schon ausprobiert und er funktioniert nach kleinen anpassungen an mein pinning.

Habe einige fragen an Dich weil ich eher ein Arduino Anfänger bin.



#define CalFactor 78.0  //1930.0

Der SBM20 CAL Faktor ist eher krumm. Ich kenne eher 150cpm oder 175cpm zu 1usv/h.

ZitatIch messe nur 1 Sekunde lang und ermittele dann über die letzten 4 Sekunden den Messwert.

Wie kann ich eigentlich die Messzeit verkürzen weil im Mess Modus ist das ganze sehr träge.
Dauert sehr lange bis er bei höherer Dosis wieder auf Normalwert wieder zurückgeht.

Das mit der Temperaturanzeige ist auch interessant.
Habe einen DHT22 Sensor angeschlossen auf PIN 8 und habe es versucht die aktuelle Temperatur
auf das Handy zu übertragen.

Wie kann ich das machen?
Im Sketch gibt es ja die Zeilen:



void BluetoothPutTemperature (short int value) {
  byte * p = (byte *) & value;           // p ist ein Pointer auf ein Array von Bytes
  Serial.write(0xA0);                    // SCHREIBEN!
  Serial.write(0x05);                    //
  Serial.write(p,1);                     // Serial.write(buf, len)

Ich lese den Sensor mit folgender Zeile aus zb:



float Temperatur = dht.readTemperature();

Funktioniert das eigentlich? und was muss ich genau im Sketch einfügen?

Danke!
Grüße, Florian

spika1

Hallo Henri,

ZitatIch hatte meine Module ohne Trägerplatine gekauft. Die sahen zwar etwas anders aus als bei Dir (länger), haben allerdings den selben Chip verbaut, den ich nicht programmiert bekommen habe. Der eine Chip, den ich programmieren konnte, sah ein wenig anders aus. Vielleicht schaue ich mir das doch noch mal an... wäre ja nicht das erste Mal, dass ein Datenblatt falsch ist.

ich kann dir ja den Link geben wo ich die Module bestellt habe.
Aber es gibt nur die mit der Trägerplatine, die ohne und nur reines BT Modul ist momentan ausverkauft.

Grüße, Florian


spika1

Hallo,

Zitat
Ich lese den Sensor mit folgender Zeile aus zb:




float Temperatur = dht.readTemperature();

Funktioniert das eigentlich? und was muss ich genau im Sketch einfügen?

Mir ist es inzwischen gelungen das die richtige aktuelle Temperatur vom DHT22
Sensor zum App zu übertagen.
Werde einen kompakteren Sensor dann verwenden.
Jetzt weis ich es das es funktioniert.

Jetzt bleibt nur noch die Trägheit der "Measure" Anzeige.
Der "Search" Modus geht flott.
Wie kann ich die "Measure" Anzeige beschleunigen?

Grüße, Florian


DG0MG

Du hast bestimmt die Zeile 66 gefunden, in der steht:

    BluetoothPutTemperature(23);

Das ruft die oben von Dir zitierte Funktion mit dem festen Argument 23 auf, so dass also immer 23°C gemeldet werden.
Zu beachten ist, dass die Temperatur als Integer-Wert vorliegen muss - also auch nur ganze Grad übermittelt werden. Dein Aufruf des Sensors liefert einen Float-Wert, Du musst also aufpassen, dass die Variablenkonvertierung richtig passiert.

MEASURE und SEARCH:
MEASURE muss nicht schneller werden, das geht auch gar nicht auf Grund dessen, wie dieser Messwert angelegt ist. Er dient zum GENAUEREN Messen eines sich nicht ändernden Strahlungsfeldes. Ändert es sich doch, ergibt sich automatisch eine Mittelung. Dazu nochmals die Funktionsweise: Beim Start der Messung wird sich der aktuelle DOSISWERT gemerkt. Dieser kann ja immer nur HÖHER werden. Zum Ende der Messung wird wieder der aktuelle Dosiswert genommen, davon der beim Start gemerkte subtrahiert. Diese während der Messzeit aufgelaufene Dosis wird durch die Dauer der Messung dividiert, so dass wieder eine Dosisleistung herauskommt. Das ist zwar ein eigentümliches Verfahren, aber nicht zu ändern, weil in der App so programmiert.
Wenn Du Dir das durchdenkst, kann eine während einer längeren Messung kurzzeitig erhöhte DL (Prüfstrahler rangehalten) auch das Endergebnis nur erhöhen. Niemals (oder nur nach unendlicher Zeit) wird es wieder auf den Wert vor dem Prüfstrahler absinken.


Vielleicht hast Du das inzwischen schon gemacht: Die Messzeit von 4 * 1 Sekunde ist für ein SBM-20 zu kurz. Ich würde 4*5 Sekunden nehmen. Die Zeit ist in Zeile 50:
  if (new_millis - old_millis >= 1000)
die 1000 sind Millisekunden.
"Bling!": Irgendjemand Egales hat irgendetwas Egales getan! Schnell hingucken!

spika1

Hallo DG0MG,

vielen Dank für die Ausführliche Erklärung der App.
Jetzt verstehe ich das der Messmodus so träge ist.

ZitatVielleicht hast Du das inzwischen schon gemacht: Die Messzeit von 4 * 1 Sekunde ist für ein SBM-20 zu kurz. Ich würde 4*5 Sekunden nehmen. Die Zeit ist in Zeile 50:
Code: [Auswählen]
  if (new_millis - old_millis >= 1000)
die 1000 sind Millisekunden.

eigentlich logisch aber das habe ich erst jetzt geschnallt, werde Sie auf 5000 erhöhen.

ZitatDu hast bestimmt die Zeile 66 gefunden, in der steht:

Code: [Auswählen]
    BluetoothPutTemperature(23);

Ja nach langen herumprobieren habe ich einen realen Sensor (DHT22) zum laufen gebracht.
Am Anfang hat er falsche Temperaturen übermittelt aber jetzt passt es!

Folgendes habe ich gemacht für das auslesen des DHT22 Sensors: (Ausschnitte)



#include "DHT.h" //DHT Bibliothek laden
#define DHTPIN 8 //Der Sensor wird an PIN 8 angeschlossen   

#define DHTTYPE DHT22    // Es handelt sich um den DHT22 Sensor

DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit ,,dth" angesprochen
float         Temperatur = 0;

void setup() {
  dht.begin(); //DHT22 Sensor starten

void loop() {
float Temperatur = dht.readTemperature();//die Temperatur auslesen und unter ,,Temperatur" speichern

BluetoothPutTemperature (Temperatur) ; //statt  BluetoothPutTemperature(23);


}

void BluetoothPutTemperature (short int value) {
  byte * p = (byte *) & value;          // p ist ein Pointer auf ein Array von Bytes
  Serial.write(0xA0);                    // SCHREIBEN!
  Serial.write(0x05);                    //
  Serial.write(p,1);                     // Serial.write(buf, len)
   
}

ZitatDas ruft die oben von Dir zitierte Funktion mit dem festen Argument 23 auf, so dass also immer 23°C gemeldet werden.
Zu beachten ist, dass die Temperatur als Integer-Wert vorliegen muss - also auch nur ganze Grad übermittelt werden. Dein Aufruf des Sensors liefert einen Float-Wert, Du musst also aufpassen, dass die Variablenkonvertierung richtig passiert.

Wie könnte ich das als Integer-Wert umändern?

Danke!

Grüße, Florian




DG0MG

Zitat von: spika1 am 02. September 2021, 21:37
Wie könnte ich das als Integer-Wert umändern?

Indem Du den Compiler zwingst, den Variablentyp zu konvertieren. Ich stecke da aber auvch nicht so tief drin, dass ich weiß, ob man das überhaupt machen muss. Fakt ist, dass man immer ein Auge auf die Variablentypen haben und insbesondere bei Wechseln genauer hinschauen muss.

statt
BluetoothPutTemperature(Temperatur);
benutze
BluetoothPutTemperature((int)Temperatur);

Temperatur ist vom Typ float und wird vor der Weiterbenutzung in int konvertiert.
Das geht aber nur wenn die Grenzen der darstellbaren Größen nicht überschritten werden: float braucht 4 Byte, int nur 2 Byte.
"Bling!": Irgendjemand Egales hat irgendetwas Egales getan! Schnell hingucken!

spika1

Hallo DG0MG,

Zitatstatt
BluetoothPutTemperature(Temperatur);
benutze
BluetoothPutTemperature((int)Temperatur);

Temperatur ist vom Typ float und wird vor der Weiterbenutzung in int konvertiert.
Das geht aber nur wenn die Grenzen der darstellbaren Größen nicht überschritten werden: float braucht 4 Byte, int nur 2 Byte.

So einfach, Danke!

Zitat
Zitat
Vielleicht hast Du das inzwischen schon gemacht: Die Messzeit von 4 * 1 Sekunde ist für ein SBM-20 zu kurz. Ich würde 4*5 Sekunden nehmen. Die Zeit ist in Zeile 50:
Code: [Auswählen]
  if (new_millis - old_millis >= 1000)
die 1000 sind Millisekunden.

eigentlich logisch aber das habe ich erst jetzt geschnallt, werde Sie auf 5000 erhöhen.

Nachdem ich die Zeit von 1000 auf 5000 erhöht habe ist auch der Messwert in usv/h viel höher.
Statt 20-30cpm habe ich so 100-150cpm und 0.81usv/h.

Also jetzt muss ich den CAL Factor von der SBM-20 anpassen.
Aktuell ist er bei mir bei 78

Grüße, Florian


DG0MG

Das geht zwar, würde ich aber nicht machen. Stattdessen die Zeile

DoseRate = 0.01 * (Ticks0+Ticks1+Ticks2+Ticks3) * 900 / CalFactor ;

anpassen. Noch eleganter wäre natürlich, die 1000/5000 Millisekunden durch eine zu Programmbeginn definierte Konstante zu ersetzen und diese dann auch in die Rechenformel einzubauen (die Zeit steckt jetzt in den '900' drin). Dann kann man die Messzeit beliebig ändern, ohne immer wieder nacharbeiten zu müssen.

Die 0.01 und die 900 könnte man ja eigentlich noch zu '9' zusammenfassen, aber das hatte ich absichtlich nicht gemacht. Der Kalibrierfaktor gibt Pulses/µR an, das Ergebnis ist also auch µR. Die 0.01 sind also Umrechnung µR ==> µSv.


"Bling!": Irgendjemand Egales hat irgendetwas Egales getan! Schnell hingucken!

spika1

Hallo DG0MG,

ZitatDas geht zwar, würde ich aber nicht machen. Stattdessen die Zeile

DoseRate = 0.01 * (Ticks0+Ticks1+Ticks2+Ticks3) * 900 / CalFactor ;

danke für die Info, habe jetzt nach längeren probieren den richtigen Wert herausgefunden.
Habe das ganze 7 Stunden laufen lassen und ich komme ganz genau auf den CAL Factor der SBM20.

Welche Widerstände benutzt du zwischen Bat+ zu A0 und A0 zu Ground für die Batterie anzeige?

Grüße, Florian


DG0MG

Zitat von: spika1 am 06. September 2021, 17:38
danke für die Info, habe jetzt nach längeren probieren den richtigen Wert herausgefunden.

Welche Widerstände benutzt du zwischen Bat+ zu A0 und A0 zu Ground für die Batterie anzeige?

Probieren ist schlecht,  :-\ Einfach mal überlegen, welche Zahl warum dort steht und versuchen hinter das System zu kommen. Dann den Wert experimentell überprüfen.  :yahoo:

Spannungsteiler hab ich gar keinen, da mein Arduino mit 5 V läuft und die Versorgunbg aus einer einzelnen LiIon-Zelle passiert.
Siehe Beitrag: https://www.geigerzaehlerforum.de/index.php/topic,645.msg6734/topicseen.html#msg6734
und die folgenden Infos dazu von Henri.

Bei einem 3,3V-Chip sollte aber ein 1:1-Teiler ausreichen.
"Bling!": Irgendjemand Egales hat irgendetwas Egales getan! Schnell hingucken!

spika1

Hallo DG0MG,

okay alles klar, aber es passt genau, wenn ich nach 7 Stunden die Gesammt cpm/420 /Messwert usv/h rechne komme ich genau auf den Umrechnungsfaktor.
Also passt es.

Grüße Florian

Nikita71

Vielleicht intere siert es jemanden: http://forum.rhbz.org/topic.php?forum=80&topic=111&postid=1643538454#1643538454
ProtonBridge2 (ESP32) oder verwenden Sie die AtomSwift-Anwendung in einem selbstgebauten Dosimeter auf esp32
Ich spreche nicht gut Deutsch, also kann ich mich beim Schreiben irren.