mesure de température et d'humidité
on utilise un 2438 (1AN + temp) + capteur H25K5A
export vers BDD Net
ce capteur sera utilisé pour :
calcul
exemple le 22/01/2011 :
Hbureau selon WS2355 : 62%
/var/1wire/26.BD817B000000/temperature = 23
/var/1wire/26.BD817B000000/VDD = 4.82 = VCC
/var/1wire/26.BD817B000000/VAD = 0.22
algorithme RH = F(RRH,Temperature)
ou comment automatiser la lecture de la table en page2 de la datasheet h25k5a.pdf
c'est une méthode de brute on pourrait réduire le nombre d'interpolation en ne faisait que celles qui encadrent la température et qui sont poche de la valeur de RRH. les relevés de temps d'exécution montre qu'une interpolation linéaire sur un 32bit non signé prend environs 1us . on va garder cette méthode de brute
charge CPU sur routeur
TV0 = 4*atof pour avoir temp_f,VDD_f,vis_f,VAD_f
TV1 = calcul de V4_f et RRH_U32
TV2 = 16 interpolations sur un U32
/* avec double
fred@Xubuntu:~/test_c$ ./humid_interpolation
start
RH*10 = 661
Tv0 403 us -WL500GP-> 1200 us
Tv1 8 us -WL500GP-> 100 us
Tv2 9 us -WL500GP-> 18 us
avec float
fred@Xubuntu:~/test_c$ ./humid_interpolation @msi
start
RH*10 = 661
Tv0 400 us -WL500GP-> 1100 us
Tv1 8 us -WL500GP-> 92 us
Tv2 9 us -WL500GP-> 18 us
conclusions :
la conversion atof prend beaucoup de temps,voir § suivant pour avoir les résultat après optimisation
le WL500GP n'est pas très fort en calcul sur les flottants mais tout a fait honorable sur les U32
il a une différence entre l'utilisation d'un float(4 bytes) par rapport a l'utilisation d'un double(8 bytes) mais seulement 10%
réécriture/simplification de atof
REAL_TYPE str_to_dbl_base10_noexp(const char * s)
{ //4*"xx.xx" = 140us@xubuntu , 175us@WL500GP
int a = 0;
int e = 1;
char c;
int sign = 1;
REAL_TYPE ret_d;
while (!isdigit(*s))
{ /* Skip leading whitespace. */
if(*s == '-')sign=-1;
++s;
}
while ((c = *s++) != '\0' && isdigit(c))
{
a = a*10 + (c - '0');
}
if (c == '.')
{
while ((c = *s++) != '\0' && isdigit(c)) {
a = a*10 + (c - '0');
e = e*10;
}
}
a=a*sign;
ret_d = (REAL_TYPE)a/e;
return ret_d;
}