Outils pour utilisateurs

Outils du site


maison2:temp_humid:temp_humid

mesure de température et d'humidité

on utilise un 2438 (1AN + temp) + capteur H25K5A

TODO export vers BDD Net

ce capteur sera utilisé pour :

  • La SB2 dans la conduite de la VMC
  • l'abri jardin remplacé par la station météo WS2355

calcul

  • V4 = VCC*R1/(R1+RRH)
  • V4*(R1+RRH) = VCC*R1
  • V4*RRH = VCC*R1 - R1*V4
  • RRH = R1*(VCC - V4)/V4
  • RH = F(RRH,Temperature)

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
  • RRH =(47000*(VDD - VAD)/VAD)
  • RRH = 47k*(4.82-0.22)/0.22 = 982.7k
  • après injection dans un programme de test du routeur on obtient = 38,3%RH :-| ça fait un certain offset … je pense qu'il doit y avoir un problème de HW , tester avec une CTN

algorithme RH = F(RRH,Temperature)

ou comment automatiser la lecture de la table en page2 de la datasheet h25k5a.pdf

  • on calcul d'abord la courbe de résistance fonction de la température pour chaque RH (de 20 à 90) : on fait 15 interpolations
  • puis on lit RH sur cette courbe générée (1 interpolation)
  • 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 :-sm
  • référence : DATA\electronique\maison2\WL500gp\DEV\_doc\humid.xls

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
  • fred@Xubuntu = 1 coeur du SU2300 @ 1.2Gh
/* 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 :

  1. la conversion atof prend beaucoup de temps,voir § suivant pour avoir les résultat après optimisation
  2. le WL500GP n'est pas très fort en calcul sur les flottants mais tout a fait honorable sur les U32
  3. 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;
}
  • REAL_TYPE = double : RH*10 = 661 Tv0 197 Tv1 114 Tv2 17
  • REAL_TYPE = float : RH*10 = 661 Tv0 175 Tv1 100 Tv2 17
maison2/temp_humid/temp_humid.txt · Dernière modification : 07/2011 de 212.77.163.106