====== mesure de température et d'humidité ====== on utilise un 2438 (1AN + temp) + capteur H25K5A {{:maison2:temp_humid:w_humid_sch.jpg|}} 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 {{:maison2:temp_humid: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 : - 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; } * REAL_TYPE = double : RH*10 = 661 Tv0 197 Tv1 114 Tv2 17 * REAL_TYPE = float : RH*10 = 661 Tv0 175 Tv1 100 Tv2 17