convertir un float en string, avec formatage

bonjour a tous

pour mon petit projet de compteur Geiger, je voudrait effectuer une mise en forme des mesure/calcul afin d’économiser de la place sur mon écran LCD
mais aussi pour avoir une "actualisation" des puissances d’unité

ma chaîne serait forme de 5 caractère, sous cette forme ####P
ou #### représente les 4 caractère de la mesure (le point y est compris) et P le symbole de la puissance (n,µ,m,k,M,G)

si il y en a parmis vous qui aurais déjà effectuer se genre de transformation ou qui on une idée de comment faire, je suis preneur de tout conseil

au final j'ai fait par moi même
et ça marche plutôt bien

String get_printable_measure(float measure) {
  float tmp = 0;
  char unit;
  char buffer[8];
  String result;
	
  if (measure < pow(10, -6)) {
	tmp = measure * pow(10, 9);
	unit = 'n';
  } else if (measure < pow(10, -3)) {
	tmp = measure * pow(10, 6);
	unit = 'u';
  } else if (measure < pow(10, 0)) {
	tmp = measure * pow(10, 3);
	unit = 'm';
  } else if (measure >= pow(10, 9)) {
	tmp = measure * pow(10, -9);
	unit = 'G';
  } else if (measure >= pow(10, 6)) {
	tmp = measure * pow(10, -6);
	unit = 'M';
  } else if (measure >= pow(10, 3)) {
	tmp = measure * pow(10, -3);
	unit = 'K';
  }
  result = dtostrf(tmp, 3, 3, buffer);
  return result + ' ' + unit;
}

par contre c'est crade, et ca aurais sans doute besoins d'un peu d'optimisation, mais tant que ca marche ^^

de toute façon c'est que pour tester la conversion automatique, je peaufinerais plus tard

j'ai tout un tas de "fonction prototype" a faire pour mon compteur Geiger ^^
entre la gestion des interruption (mesure) la gestion des menu, la sauvegarde de paramètre, ....

dans tout les cas au final ce sera un gros programme

c'est un compteur Geiger portatif, affichage sur LCD 16*2, c'est pour ça que je veux faire de la conversion d’unité,
sinon j'aurai envoyer en RAW les data au PC pour que lui fasse le traitement ^^

mais la j'attend le PCB de mon prototype, et mon tube Geiger, pour pouvoir commencer le montage et faire les test

mais je vais devoir me racheter un Tube Geiger, car celui que j'ai prit est pas sensible aux niveau de radiation naturel

non non c'est pas que tu a pas tout compris juste que tu ne sait pas comment on mesure la radioactivité

on mesure ça avec un tube Geiger Muller, c'est un tube en verre avec un cathode et une anode, le tube est remplie de gaz rare.
généralement l'anode tout le tour de tube en verre (toute la surface) et la cathode est un simple fils au milieu.

Ensuite on applique une haute tension sur la cathode, ca varie de 350V a 600V en fonction des tubes, cette tension n'est pas suffisante pour amorcer la ionisation des gaz.
Mais a chaque fois qu'une particule radioactive vas traverser le tube, elle vas l'amorcer. On appelle ça une desitegration.

pour la mesure de radioactivité on a 2 valeur principale, le CPM et le CPS, (Count per minut, Count per second) qui correspond au desitegration sur c'est deux intervalle.

petit schéma explicatif : (le montage de base d'un compteur Geiger)

donc a caque fois qu'une particule vas traverser il y a amorcage, donc changement de potentiel au niveau de l'anode.
ici dans le schéma ça se traduit par un beep.

Afin d'effectuer la mesure avec un arduino, j'utilise la broche de celui-ci, sur laquelle je colle une interruption.
a chaque interruption, donc chaque désintégration, j'appelle une fonction qui vas incrémenter une valeur. au bout de 60 seconde cet valeur sera le CPM.

ensuite si tu veux la valeur en Sievert, enfin en µSv/hr, il a un ratio a appliquer, ratio qui peut varier en fonction du type de tube, du matériaux radioactif que l'on mesure, mais généralement ce ratio, est basée sur celui du Co60 (Cobalt), ou bien du Cs137 (Césium), ratio qui est proche de 0.1µSv/hr pour 10CPM (0.093 en réalité)

Suffit donc de faire des calcule, et c'est pour cela que l'on tombe dans des condition normal avec des valeur de l'ordre du 10^-6

voici un petit tableau avec des seuil de radioactivité, ce tableau n'est pas officiel mais on le retrouve dans certain manuel de compteur Geiger

10 CPM 0.1µ Sv/hr radiation environante de la terre
100 CPM 1µ Sv/hr Faible taux de radiation
1000 CPM 10µ Sv/hr Dose Journaliere Limite pour un humain
10K CPM 100µ Sv/hr Ne pas rester ici
100K CPM 1m Sv/hr Exposition Substanciel
1M CPM 10m Sv/hr Forte exposition
10M CPM 100m Sv/hr Danger Extreme
100M CPM 1 Sv/hr 50% de chance de mourir
500M CPM 5 Sv/hr Plus personne pour lire la mesure :slight_smile:

Afin d'effectuer la mesure avec un arduino, j'utilise la broche de celui-ci, sur laquelle je colle une interruption.
a chaque interruption, donc chaque désintégration, j'appelle une fonction qui vas incrémenter une valeur. au bout de 60 seconde cet valeur sera le CPM.

Ce serait plus malin d'utiliser un timer pour faire ça. Cela ne consomme pas de temps sauf au moment du débordement.
Voir là une bibliothèque qui peut être utilisée telle quelle ou adaptée si besoin: http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/

enfaîte il y a jamais de débordement car au bout d'une minute le CPM est remis a 0
afin de re-évaluer la dose de radiation

ensuite pour le calcule des Sv/hr, et son affichage, ça se fait en temps réel par moyenage
j'ai un tableau de 60 case qui contient les mesures de CPS, en gros toute les seconde je rajoute le CPS courant au tableau, je calcule la moyenne du tableau et je converti en Sv/hr, le CPS est remis a 0, puis au bout de 1 minute je calcule les Sv/hr avec le CPM, et je vide mon tableau

oui les valeur son plus ou moins aléatoire, d’ailler certain générateur de nombre aléatoire utilise la radiation environnante
mais 10CPM pour la radiation environnante c'est vraiment le plus bas qui a été mesurer, dans le Colorado ça tourne plutôt vers les 50-60CPM

mais ça dépend aussi du tube Geiger, pour ma part j'ai acheter sans le faire exprès un tube Russe des ancien stock de l’armée qui son insensible a la radiation environnante,
du coup je vais en racheter un qui sera un peu plus sensible (toujours du matos Russe, ça coûte que dalle sur Ebay xD)

et si ça vous intéresse voici mon début de programme, enfin il est fonctionnelle
je suis juste en train de l'ameliorer, que ce soit au niveau de l’affichage ou de la navigation dans les menu, a la base j'avais prévu 2 bouton, mais sur le PCB j'en ai mit 4 ^^

pour le tester je l'ai fait avec une solenoid comme antenne affin de chopper des perturbation magnétique a la place de la radiation ^^

bon bah fichier en PJ, car le programme fait qu je dépasse la taille limite pour un message xD

il y a une pseudo conversion d’unité, mais pas je compte rajouter d'autre unité de mesure autre que le rems/hr et le Sv/hr (le Becquerel par exemple ou le RAD/hr)

Geiger_counter.ino (36.6 KB)