SoloCodigo

Programación Específica => Microcontroladores => Programación en C => Mensaje iniciado por: J1M en Sábado 5 de Junio de 2004, 13:31

Título: Higrómetro/termómetro Sht11
Publicado por: J1M en Sábado 5 de Junio de 2004, 13:31
Alguien tiene algún codigo que me sirva de guia para poder mostrar la temperatura y la humedad con este sensor.
El sensor en cuestión es digital, de la casa sensirion, aquí teneis mas info sobre el:
http://www.sensirion.com/en/sensors/humidi...sensorSHT11.htm (http://www.sensirion.com/en/sensors/humidity/sensors_devices/sensorSHT11.htm)

Quiero mostrar la temperatura y humedad en un LCD de 16x2, y bueno, tengo este código, pero ando un pokiiiiiiito perdido :5)

Código: Text
  1.  
  2. //------------------------------------------------------------------------------
  3. // Module hygrometre-thermometre sensirion sht11
  4. //
  5. // adaptations JYP 2003
  6. //
  7. //------------------------------------------------------------------------------
  8.  
  9. #include "math.h"
  10.  
  11. typedef union
  12. { unsigned int i;
  13. float f;
  14. } value;
  15.  
  16. enum {TEMP,HUMI};
  17.  
  18. #define sht_noACK 0
  19. #define sht_ACK 1
  20. //adr command r/w
  21. #define sht_STATUS_REG_W 0x06 //000 0011 0
  22. #define sht_STATUS_REG_R 0x07 //000 0011 1
  23. #define sht_MEASURE_TEMP 0x03 //000 0001 1
  24. #define sht_MEASURE_HUMI 0x05 //000 0010 1
  25. #define sht_RESET 0x1e //000 1111 0
  26.  
  27. //------------------------------------------------------------------------------
  28. char sht11_write_byte(unsigned char value)
  29. //------------------------------------------------------------------------------
  30. // writes a byte on the Sensibus and checks the acknowledge
  31. {
  32. unsigned char i,error=0;
  33.  
  34. for (i=0x80;i>0;i/=2) //shift bit for masking
  35. {
  36. if (i & value)
  37. output_high(sht11_data); //masking value with i , write to SENSI-BUS
  38. else
  39. output_low(sht11_data);
  40. output_high(sht11_sck); //clk for SENSI-BUS
  41. delay_us( 5); //pulswith approx. 5 us
  42. output_low(sht11_sck);
  43. }
  44. output_high(sht11_data); //release DATA-line
  45. output_high(sht11_sck); //clk #9 for ack
  46. error=input(sht11_data)&#59; //check ack (DATA will be pulled down by SHT11)
  47. output_low(sht11_sck);
  48. return error; //error=1 in case of no acknowledge
  49. }
  50.  
  51. //------------------------------------------------------------------------------
  52. char sht11_read_byte(unsigned char ack)
  53. //------------------------------------------------------------------------------
  54. // reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
  55. {
  56. unsigned char i,val=0;
  57.  
  58. output_high(sht11_data); //release DATA-line
  59. for (i=0x80;i>0;i/=2) //shift bit for masking
  60. {
  61. output_high(sht11_sck); //clk for SENSI-BUS
  62. if (input(sht11_data)==1)
  63. val=(val | i); //read bit
  64. output_low(sht11_sck);
  65. }
  66. output_bit(sht11_data,!ack); //in case of "ack==1" pull down DATA-Line
  67. output_high(sht11_sck); //clk #9 for ack
  68. delay_us( 5); //pulswith approx. 5 us
  69. output_low(sht11_sck);
  70. output_high(sht11_data); //release DATA-line
  71. return val;
  72. }
  73.  
  74. //------------------------------------------------------------------------------
  75. void sht11_transstart(void)
  76. //------------------------------------------------------------------------------
  77. // generates a transmission start
  78. // _____ ________
  79. // DATA: |_______|
  80. // ___ ___
  81. // SCK : ___| |___| |______
  82. {
  83. output_high(sht11_data);
  84. output_low(sht11_sck); //Initial state
  85. delay_us( 1);
  86. output_high(sht11_sck);
  87. delay_us( 1);
  88. output_low(sht11_data);
  89. delay_us( 1);
  90. output_low(sht11_sck);
  91. delay_us( 3);
  92. output_high(sht11_sck);
  93. delay_us( 1);
  94. output_high(sht11_data);
  95. delay_us( 1);
  96. output_low(sht11_sck);
  97. }
  98.  
  99. //------------------------------------------------------------------------------
  100. void sht11_connectionreset(void)
  101. //------------------------------------------------------------------------------
  102. // communication reset: DATA-line=1 and at least 9 SCK cycles
  103. // followed by transstart
  104. // _____________________________________________________ ________
  105. // DATA: |_______|
  106. // _ _ _ _ _ _ _ _ _ ___ ___
  107. // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
  108. {
  109. unsigned char i;
  110. output_high(sht11_data);
  111. output_low(sht11_sck); //Initial state
  112. for(i=0;i<9;i++) //9 SCK cycles
  113. {
  114. output_high(sht11_sck);
  115. output_low(sht11_sck);
  116. }
  117. sht11_transstart(); //transmission start
  118. }
  119.  
  120. //------------------------------------------------------------------------------
  121. char sht11_softreset(void)
  122. //------------------------------------------------------------------------------
  123. // resets the sensor by a softreset
  124. {
  125. unsigned char error=0;
  126. sht11_connectionreset(); //reset communication
  127. error+=sht11_write_byte(sht_RESET); //send RESET-command to sensor
  128. return error; //error=1 in case of no response form the sensor
  129. }
  130.  
  131. //------------------------------------------------------------------------------
  132. char sht11_read_statusreg(unsigned char *p_value, unsigned char *p_checksum)
  133. //------------------------------------------------------------------------------
  134. // reads the status register with checksum (8-bit)
  135. {
  136. unsigned char error=0;
  137. sht11_transstart(); //transmission start
  138. error=sht11_write_byte(sht_STATUS_REG_R); //send command to sensor
  139. *p_value=sht11_read_byte(sht_ACK); //read status register (8-bit)
  140. *p_checksum=sht11_read_byte(sht_noACK); //read checksum (8-bit)
  141. return error; //error=1 in case of no response form the sensor
  142. }
  143.  
  144. //------------------------------------------------------------------------------
  145. char sht11_write_statusreg(unsigned char *p_value)
  146. //------------------------------------------------------------------------------
  147. // writes the status register with checksum (8-bit)
  148. {
  149. unsigned char error=0;
  150. sht11_transstart(); //transmission start
  151. error+=sht11_write_byte(sht_STATUS_REG_W);//send command to sensor
  152. error+=sht11_write_byte(*p_value); //send value of status register
  153. return error; //error>=1 in case of no response form the sensor
  154. }
  155.  
  156. //------------------------------------------------------------------------------
  157. char sht11_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
  158. //------------------------------------------------------------------------------
  159. // makes a measurement (humidity/temperature) with checksum
  160. {
  161. unsigned error=0;
  162. unsigned int i;
  163.  
  164. sht11_transstart(); //transmission start
  165. switch(mode)
  166. { //send command to sensor
  167. case TEMP : error+=sht11_write_byte(sht_MEASURE_TEMP); break;
  168. case HUMI : error+=sht11_write_byte(sht_MEASURE_HUMI); break;
  169. default : break;
  170. }
  171.  
  172. for (i=0;i<65535;i++)
  173. if(input(sht11_data)==0)
  174. break; //wait until sensor has finished the measurement
  175. if(input(sht11_data)==1)
  176. error+=1; // or timeout (~2 sec.) is reached
  177.  
  178. *(p_value+1) =sht11_read_byte(sht_ACK); //read the first byte (MSB)
  179. *(p_value)=sht11_read_byte(sht_ACK); //read the second byte (LSB)
  180. *p_checksum =sht11_read_byte(sht_noACK); //read checksum
  181. return error;
  182. }
  183. char sht11_measure_temp(unsigned char *p_value, unsigned char *p_checksum)
  184. {
  185. return sht11_measure( p_value, p_checksum, TEMP);
  186. }
  187. char sht11_measure_humi(unsigned char *p_value, unsigned char *p_checksum)
  188. {
  189. return sht11_measure( p_value, p_checksum, HUMI);
  190. }
  191.  
  192. //------------------------------------------------------------------------------
  193. void sth11_calc(float *p_humidity ,float *p_temperature)
  194. //------------------------------------------------------------------------------
  195. // calculates temperature [°C] and humidity [%RH]
  196. // input : humi [Ticks] (12 bit)
  197. // temp [Ticks] (14 bit)
  198. // output: humi [%RH]
  199. // temp [°C]
  200. { const float C1=-4.0; // for 12 Bit
  201. const float C2=+0.0405; // for 12 Bit
  202. const float C3=-0.0000028; // for 12 Bit
  203. const float T1=+0.01; // for 14 Bit @ 5V
  204. const float T2=+0.00008; // for 14 Bit @ 5V
  205.  
  206. float rh,t,rh_lin,rh_true,t_C;
  207. // rh_lin: Humidity linear
  208. // rh_true: Temperature compensated humidity
  209. // t_C : Temperature [°C]
  210. rh=*p_humidity; // rh: Humidity [Ticks] 12 Bit
  211. t=*p_temperature; // t: Temperature [Ticks] 14 Bit
  212.  
  213. t_C=t*0.01 - 40; //calc. temperature from ticks to [°C]
  214. rh_lin=C3*rh*rh + C2*rh + C1; //calc. humidity from ticks to [%RH]
  215. rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. temperature compensated humidity [%RH]
  216. if(rh_true>100)rh_true=100; //cut if the value is outside of
  217. if(rh_true<0.1)rh_true=0.1; //the physical possible range
  218.  
  219. *p_temperature=t_C; //return temperature [°C]
  220. *p_humidity=rh_true; //return humidity[%RH]
  221. }
  222.  
  223. //--------------------------------------------------------------------
  224. int sht11_calc_humid_int( int16 w_humidity)
  225. //--------------------------------------------------------------------
  226. {
  227. // calcul de l'humidite en entier (sans calcul float)
  228.  
  229. int32 h1,h2;
  230.  
  231. h1 = ((int32) w_humidity) * ((int32) w_humidity);
  232. h1 = h1 / (int32)1000;
  233. h1 = h1 * (int32)28;
  234. h2 = ((int32) w_humidity) * (int32)405;
  235. h2 = h2 - h1;
  236. h2 = h2 / (int32)1000;
  237. h2 = h2 - (int32)40;
  238. h2 = h2 / (int32)10;
  239. return (h2);
  240. }
  241.  
  242. //--------------------------------------------------------------------
  243. int sht11_calc_temp_int( int16 w_temperature)
  244. //--------------------------------------------------------------------
  245. {
  246. // calcul de la temperature en entier (sans calcul float)
  247.  
  248. int16 temp1;
  249.  
  250. temp1 = w_temperature / (int16)100;
  251. temp1 = temp1 - (int16)40;
  252. return (temp1);
  253. }
  254.  
  255. //--------------------------------------------------------------------
  256. int sht11_calc_temp_frac10( int16 w_temperature)
  257. //--------------------------------------------------------------------
  258. {
  259. // calcul de la temperature en fractionnaire 0.X (sans calcul float)
  260. // exemple si t=25.367 ° renvoie 3
  261.  
  262. int16 temp1;
  263.  
  264. temp1 = w_temperature / (int16)10;
  265. temp1 = w_temperature - (int16)400;
  266. temp1 = abs(temp1) - ((int16)10 * abs(sht11_calc_temp_int(w_temperature)));
  267. return (temp1);
  268. }
  269.  
  270. //--------------------------------------------------------------------
  271. int sht11_calc_temp_frac100( int16 w_temperature)
  272. //--------------------------------------------------------------------
  273. {
  274. // calcul de la temperature en fractionnaire 0.XX (sans calcul float)
  275. // exemple si t=25.367 ° renvoie 36
  276.  
  277. int16 temp1;
  278.  
  279. temp1 = w_temperature - (int16)4000;
  280. temp1 = abs(temp1) - ((int16)100 * abs(sht11_calc_temp_int(w_temperature)));
  281. return (temp1);
  282. }
  283.  
  284. //--------------------------------------------------------------------
  285. float sht11_calc_dewpoint(float h,float t)
  286. //--------------------------------------------------------------------
  287. // calculates dew point
  288. // input: humidity [%RH], temperature [°C]
  289. // output: dew point [°C]
  290. {
  291. float logEx,dew_point;
  292.  
  293. logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
  294. dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
  295. return dew_point;
  296. }
  297.  
  298.  

Gracias ;)
Título: Re: Higrómetro/termómetro Sht11
Publicado por: © Jonathan © en Sábado 5 de Junio de 2004, 13:42
Que problema tienes, manejar el LCD y mostrar datos o manejar el sensor del que hablas????... para manejar un sensor o poder ayudarte, debemos aprender a utilizarlo nosotros, por lo que vas a recibir poca ayuda, si especificas un poquito mas te ayudaran con mas placer, eso, si no hay un experto con el sensor... Dime y vemos. Saludos :hola:
Título: Re: Higrómetro/termómetro Sht11
Publicado por: J1M en Sábado 5 de Junio de 2004, 15:53
El tema es que aún no me he puesto a programarlo, quería saber si ya alguien habia hecho algo similar con este sensor y tenia x ahí el codigo, espero poder empezar a programarlo en unos dias.

Salu2! :beer:
Título: Re: Higrómetro/termómetro Sht11
Publicado por: © Jonathan © en Sábado 5 de Junio de 2004, 16:03
Ah, ahora entiendo, va a ser dificil ya que pocos disponen de acceso a esos nuevos componentes, pero estudialo y veras que no es complicado. Vere en que puedo ayudarte. Saludos :hola:
Título: Re: Higrómetro/termómetro Sht11
Publicado por: Especimen en Lunes 14 de Junio de 2004, 02:57
Hola, buscando algo sobre programacion para el SHT11 en visual basic he dado con vosotros.

Alguien tiene algo sobre esto en vbasic?

Gracias
Título: Re: Higrómetro/termómetro Sht11
Publicado por: Especimen en Lunes 14 de Junio de 2004, 03:13
Se me olvido, en la web de sensirion hay ejemplo de codigo en C

http://www.sensirion.com/en/download/humid...sor/default.htm (http://www.sensirion.com/en/download/humiditysensor/default.htm)



J1M, que tipo de conexion con el pc usas para el sensor??


Bye
Título: Re: Higrómetro/termómetro Sht11
Publicado por: J1M en Lunes 14 de Junio de 2004, 07:27
No me comunico con el PC, sino con un PIC el 16f876a, he conseguido el codigo en C para controlarlo, es de oshow (asias tiu ;))


Código: Text
  1.  
  2.  
  3. Hola, yo he adaptado el ejemplo de la web al compilador ccs,
  4. http://www.sensirion.com/en/pdf/Sample_Code_SHT11
  5. te lo voy a pegar aqui, pero quiero dejar claro que no lo he probado aún, solo he adaptado el codigo y lo he compilado sin problema, me gustaria probarlo, pero este mes estoy fatal de tiempo a ver si me pongo a probarlo porque tengo el sensor ahora mismo por ahi tirado.....
  6.  
  7. Me gustaría, que si consigues hacerlo funcionar comentases cual fue tu experiencia, y si no te funciona y consigues retocarlo para que rule, que comentases por aqui los cambios que has realizado para que todos tengamos el codigo.
  8.  
  9. De todos modos si no quieres usar la libreria que he adaptado, y quieres usar la "tuya", no tienes mas que fijarte en el ejemplo y asi podras adaptar las funciones....
  10.  
  11. Tambien te recomiendo que te estudies bien el datasheet, para saber muy bien como funciona, ya que puedes elegir las resoluciones de las capturas, puedes usar la funcion calentador, vamos que tiene varias opciones y es recomendable conocerlas...
  12.  
  13. Buena suerte, y espero comentarios.
  14.  
  15.  
  16.  
  17.  
  18. Codigo:--------------------------------------------------------------------------------
  19. #include <16F876A.h>
  20. #use delay(clock=4000000)  //Oscilador de 4Mhz
  21. #fuses XT,NOWDT,NOPROTECT
  22.  
  23.  
  24. #include <libreria_sht11_trelles.c>  //funciones de escritura y lectura del registro y medida de Tª y humedad en el sht11
  25. #include <lcd.c> //funciones para gestionar el lcd
  26.  
  27.  
  28.  
  29.  
  30.  
  31.    //declaracion de variables para la medicion del sht11
  32. typedef union
  33.    {  unsigned int i;
  34.       float f;
  35.    } valor;
  36.  
  37. ///variables globales
  38. valor humedad,temperatura;   //variables de tipo valor para almacenar tº y humedad
  39.  
  40. void main(void)
  41. {
  42.  
  43.    unsigned char error,checksum;
  44.    unsigned int i;
  45.  
  46.    
  47.          //medida sensor digital
  48.          conexion_al_reset();
  49.          while(1)
  50.          {        
  51.  
  52.          error=0;
  53.          error+=medicion((unsigned char*) &humedad.i,&checksum,HUMI); //si existe algun error sera almacenado
  54.          error+=medicion((unsigned char*) &temperatura.i,&checksum,TEMP);
  55.  
  56.          if(error!=0)
  57.             conexion_al_reset();
  58.          else
  59.             {
  60.                humedad.f=(float)humedad.i;       //casting de entero a float para la funcion calculos_sht11
  61.                temperatura.f=(float)temperatura.i;
  62.                calculos_sht11(&humedad.f,&temperatura.f);
  63.  
  64.                lcd_gotoxy(1,1);
  65.                printf(lcd_putc,"Tª2:%5.1fC humi:%5.1f%%\n",temperatura.f,humedad.f);
  66.  
  67.  
  68.                 delay_ms(600);
  69.  
  70.             }
  71.  
  72.  
  73.          }
  74.  
  75.  
  76. }
  77.  
  78. --------------------------------------------------------------------------------
  79.  
  80.  
  81. La liberia
  82.  
  83.  
  84. Codigo:--------------------------------------------------------------------------------
  85. ////////////////////////////////////////////////////////////////////////////////
  86. ////////////////////////////////////////////////////////////////////////////////
  87. //       FUNCIONES PARA EL CALCULO DE HUMEDAD Y TEMPERATURA DEL SHT11
  88. //
  89. //       Adaptacion de Oshow del codigo de ejemplo del sensor
  90. //          SHT11 de sensirion, realizado con el compilador KEIL para
  91. //          un microcontrolador 8051.
  92. //
  93. //                   Adaptado para compilador PCW de CCS
  94. //
  95. //
  96. //
  97. //
  98. ////////////////////////////////////////////////////////////////////////////////
  99.  
  100.  
  101. #bit DATOS = 0x05.2        //definicion de los bits del sht11 datos en RA2
  102. #bit SCK = 0x05.1          //sck en RA1
  103.  
  104.  
  105. //Estos defines se pueden simplificar en lugar de tener 3 parejas de defines
  106.  
  107. #define noACK 0
  108. #define ACK 1
  109. /*
  110. #define CALENTADOR_ON 1
  111. #define CALENTADOR_OFF 0
  112.  
  113. #define RESOLUCION_14_12_BITS 0
  114. #define RESOLUCION_12_8_BITS 1
  115. */
  116.  
  117.  
  118. //       PROTOTIPOS DE LAS FUNCIONES
  119.  
  120. char escribir_byte(unsigned char valor);
  121. char leer_byte(unsigned char ack);
  122. void inicializacion(void);
  123. char reset(void);
  124. void conexion_al_reset(void);
  125. char leer_registro_de_estado(unsigned char *p_valor, unsigned char *p_checksum);
  126. char escribir_registro_de_estado(unsigned char *p_valor);
  127. char medicion(unsigned char *p_valor, unsigned char *p_checksum, unsigned char modo);
  128. void calculos_sht11(float *p_humedad ,float *p_temperatura);
  129. //float calculo_rocio(float h,float t);
  130. //char calentador_sht11(byte onoff);
  131. //char resolucion_de_capturas(byte res);
  132.  
  133.  
  134. ////////////////////////////////////////////////////////////////////////////////
  135. //    Direcciones hexadecimales para escribir y leer en el sensor.
  136. ////////////////////////////////////////////////////////////////////////////////
  137.  
  138. #define STATUS_REG_W 0x06
  139. #define STATUS_REG_R 0x07
  140. #define MEASURE_TEMP 0x03
  141. #define MEASURE_HUMI 0x05
  142. #define RESET 0x1E
  143.  
  144. enum {TEMP,HUMI}; //tambien podemos hacer defines
  145.  
  146.  
  147. ////////////////////////////////////////////////////////////////////////////////
  148. //    Escribe un byte en el sensor y chequear si es reconocido
  149. ////////////////////////////////////////////////////////////////////////////////
  150. char escribir_byte(unsigned char valor)
  151. {
  152.    unsigned char i,error=0;
  153.  
  154.       for (i=0x80;i>0;i/=2)
  155.          {
  156.             if (i & valor)
  157.               DATOS=1;
  158.             else
  159.                DATOS=0;
  160.                SCK=1;
  161.  
  162.             delay_us(5);
  163.  
  164.             SCK=0;
  165.          }
  166.  
  167.       DATOS=1;
  168.       SCK=1;
  169.       error=DATOS;
  170.       SCK=0;
  171.  
  172.    return error;
  173. }
  174.  
  175.  
  176. ////////////////////////////////////////////////////////////////////////////////
  177. //    Lee un byte en el sensor y da el reconocimeinto si ack es igual a 1
  178. ////////////////////////////////////////////////////////////////////////////////
  179. char leer_byte(unsigned char ack)
  180. {
  181.       unsigned char i,valor=0;
  182.  
  183.          DATOS=1;
  184.  
  185.          for (i=0x80;i>0;i/=2)
  186.             {
  187.                SCK=1;
  188.  
  189.                if (DATOS)
  190.                   valor=(valor | i);
  191.                   SCK=0;
  192.               }
  193.  
  194.          DATOS=!ack;
  195.          SCK=1;
  196.  
  197.          delay_us(5);
  198.  
  199.          SCK=0;
  200.          DATOS=1;
  201.  
  202.    return valor;
  203. }
  204.  
  205. ////////////////////////////////////////////////////////////////////////////////
  206. //Rutina de inicializacion del sensor, utilizar despues del reset.
  207. ////////////////////////////////////////////////////////////////////////////////
  208. // Genera un comienzo de trasmision.
  209. //       ______         _______
  210. // DATOS:      |_______|
  211. //            ___     ___
  212. // SCK :  ___|   |___|   |_____
  213. ////////////////////////////////////////////////////////////////////////////////
  214.  
  215. void inicializacion(void)
  216. {
  217.    DATOS=1;
  218.    SCK=0;
  219.  
  220.    delay_us(2);
  221.  
  222.    SCK=1;
  223.  
  224.    delay_us(2);
  225.  
  226.    DATOS=0;
  227.  
  228.    delay_us(2);
  229.  
  230.    SCK=0;
  231.  
  232.    delay_us(5);
  233.  
  234.    SCK=1;
  235.  
  236.    delay_us(2);
  237.  
  238.    DATOS=1;
  239.  
  240.    delay_us(2);
  241.  
  242.    SCK=0;
  243. }
  244.  
  245. ////////////////////////////////////////////////////////////////////////////////
  246. //Reseteo del sensor; linea de datos a 1 seguido de 9 ciclos de reloj y de
  247. //  la funcion inicializacion()
  248. ////////////////////////////////////////////////////////////////////////////////
  249. //
  250. //        _____________________________________________________           ________
  251. // DATA:                                                       |_________|
  252. //          _    _    _    _    _    _    _    _    _        _____     _____
  253. // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|     |___|     |___
  254. //
  255. ////////////////////////////////////////////////////////////////////////////////
  256.  
  257. void conexion_al_reset(void)
  258. {
  259.    unsigned char i;
  260.  
  261.    DATOS=1;
  262.    SCK=0;
  263.  
  264.       for(i=0;i<9;i++)
  265.          {
  266.             SCK=1;
  267.             delay_us(2);
  268.             SCK=0;
  269.             delay_us(2);
  270.          }
  271.  
  272.    inicializacion();
  273. }
  274.  
  275. ////////////////////////////////////////////////////////////////////////////////
  276. //       Resetea el sensor
  277. ////////////////////////////////////////////////////////////////////////////////
  278. char soft_reset (void)
  279. {
  280.       unsigned char error=0;
  281.  
  282.          conexion_al_reset();
  283.          error+=escribir_byte(RESET);
  284.  
  285.       return error;
  286. }
  287.  
  288. ////////////////////////////////////////////////////////////////////////////////
  289. //       Lectura del registro de estado con checksum de 8 bits
  290. ////////////////////////////////////////////////////////////////////////////////
  291.  
  292. char leer_registro_de_estado(unsigned char *p_valor, unsigned char *p_checksum)
  293. {
  294.  
  295.    unsigned char error=0;
  296.  
  297.       inicializacion();
  298.       error=escribir_byte(STATUS_REG_R);
  299.       *p_valor=leer_byte(ACK);
  300.       *p_checksum=leer_byte(noACK);
  301.  
  302.  
  303.    return error;
  304. }
  305.  
  306. ////////////////////////////////////////////////////////////////////////////////
  307. //Escribimos en el registro de estado con un checksum de 8 bits
  308. ////////////////////////////////////////////////////////////////////////////////
  309.  
  310. char escribir_registro_de_estado(unsigned char *p_valor)
  311. {
  312.    unsigned char error=0;
  313.  
  314.  
  315.          inicializacion();
  316.  
  317.          error+=escribir_byte(STATUS_REG_W);
  318.          error+=escribir_byte(*p_valor);
  319.  
  320.    return error;
  321. }
  322.  
  323. ////////////////////////////////////////////////////////////////////////////////
  324. // Realiza la medicion de temperatura y humedad con checksum incluido
  325. //    Todavia no es la medicion real, se debe hacer la compensacion
  326. ////////////////////////////////////////////////////////////////////////////////
  327.  
  328. char medicion(unsigned char *p_valor, unsigned char *p_checksum, unsigned char modo)
  329. {
  330.    unsigned error=0;
  331.    unsigned long i;
  332.  
  333.  
  334.       inicializacion(); //transmission start
  335.  
  336.  
  337.          switch(modo)
  338.          {
  339.             case TEMP : error+=escribir_byte(MEASURE_TEMP); break;
  340.             case HUMI : error+=escribir_byte(MEASURE_HUMI); break;
  341.             default : break;
  342.          }
  343.  
  344.          for (i=0;i<65535;i++)
  345.             if(DATOS==0)
  346.                break;
  347.  
  348.             if(DATOS) error+=1;
  349.  
  350.             *(p_valor) =leer_byte(ACK);
  351.             *(p_valor+1)=leer_byte(ACK);
  352.             *p_checksum =leer_byte(noACK);
  353.  
  354.  
  355.    return error;
  356. }
  357.  
  358. ////////////////////////////////////////////////////////////////////////////////
  359. //    Calculo de la temperatura en ºC y humedad en %
  360. //       Entrada proviniente del sensor:
  361. //          Humedad - 12 bits (por defecto)
  362. //          Temperatura - 14 bits (por defecto)
  363. //       Salida hacia el LCD:
  364. //          Humedad - RH%
  365. //          Temperatura - ºC
  366. ////////////////////////////////////////////////////////////////////////////////
  367.  
  368. void calculos_sht11(float *p_humedad ,float *p_temperatura)
  369. {
  370.    const float C1=-4.0;
  371.    const float C2= 0.0405;
  372.    const float C3=-0.0000028;
  373.    const float T1=0.01;
  374.    const float T2=0.00008;
  375.    float rh;
  376.    float t;
  377.    float rh_lin;
  378.    float rh_true;
  379.    float t_C;
  380.  
  381.    rh=*p_humedad;
  382.    t=*p_temperatura;
  383.  
  384.  
  385.       t_C=t*0.01 - 40;
  386.       rh_lin=C3*rh*rh + C2*rh + C1;
  387.       rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;
  388.  
  389.          if(rh_true>100)
  390.             rh_true=100;
  391.  
  392.          if(rh_true<0.1)
  393.             rh_true=0.1;
  394.  
  395.       *p_temperatura=t_C;
  396.       *p_humedad=rh_true;
  397. }
  398.  
  399.  
  400.  
  401. /////////////REVISAR ESTAS FUNCIONES, OJO!!!!ESTAN SIN REVISAR//////////////////
  402. ////////////////////////////////////////////////////////////////////////////////
  403. //       Funciones que se pueden utilizar a deseo del usuario
  404. //          Para utilizarlas, quitar los comentarios.
  405. ////////////////////////////////////////////////////////////////////////////////
  406. //Funcion para el calculo del rocio. Para utilizarla, incluir libreria matematica
  407. // #include <math.h> debido a que se usa un logaritmo
  408. ////////////////////////////////////////////////////////////////////////////////
  409.  
  410. /*float calculo_rocio(float h,float t)
  411. {
  412.    float logEx,punto_rocio&#59;
  413.  
  414.  
  415.       logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
  416.       punto_rocio = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx)&#59;
  417.  
  418.    return punto_rocio;
  419. }
  420.  
  421.  
  422. ////////////////////////////////////////////////////////////////////////////////
  423. //       Funcion para activar el calentador del sht11
  424. //    Esta funcion activa el calentador del sensor, el sensor
  425. //       se "autocalienta" unos 5ºC
  426. ////////////////////////////////////////////////////////////////////////////////
  427.  
  428. char calentador_sht11(byte onoff)
  429. {
  430.   byte valor, checksum,
  431.    char error=0;
  432.  
  433.  
  434.   conexion_al_reset();
  435.   error += leer_registro_de_estado(&valor, &checksum);
  436.   conexion_al_reset();
  437.  
  438.   if (!error && (((valor>>2) & 0x01) != onoff))
  439.    {
  440.     onoff?bit_set(valor,2):bit_clear(valor,2);
  441.     error += escribir_registro_de_estado(&valor);
  442.   }
  443.  
  444.   return error;
  445. }
  446.  
  447. ////////////////////////////////////////////////////////////////////////////////
  448. //             Eleccion de resolucion en las medidas
  449. //                Por defecto: 14 bits temepratura y 12 bits humedad
  450. //                   Opcion:  12 bits temperatura y 8 bits humedad
  451. ////////////////////////////////////////////////////////////////////////////////
  452.  
  453. char resolucion_de_capturas(byte res)
  454. {  //eleccion de resolucion
  455.  
  456.   byte valor, checksum;
  457.    char error=0;
  458.  
  459.   conexion_al_reset();
  460.   error += escribir_registro_de_estado(&valor, &checksum);
  461.   conexion_al_reset();
  462.  
  463.   if (!error && ((valor & 0x01) != res))
  464.    {
  465.     res?bit_set(valor,0):bit_clear(valor,0);
  466.     error += escribir_registro_de_estado(&valor);
  467.   }
  468.  
  469.   return error;
  470. }
  471. */
  472.  
  473. --------------------------------------------------------------------------------
  474.  
  475.  
  476.  
  477.  
Título: Re: Higrómetro/termómetro Sht11
Publicado por: wel en Lunes 14 de Junio de 2004, 22:52
y ese codigo te ha funcionado, yo estoy con el mismo sensor pero con el pic 16f877, y lo único que consigo que me saque por el lcd es una temperatura de -39,9º y una humedad relativa del 0,01%
Título: Re: Higrómetro/termómetro Sht11
Publicado por: J1M en Lunes 14 de Junio de 2004, 23:01
aún no lo he probado, el autor tampoco, intenta hacer una simulación paso a paso si no consigues localizar donde está el error. En cuanto lo tenga rulando posteo aki el codigo

Salu2 ;)
Título: Re: Higrómetro/termómetro Sht11
Publicado por: wel en Lunes 14 de Junio de 2004, 23:12
ok, si consigo yo algo, aviso por aqui
Título: Re: Higrómetro/termómetro Sht11
Publicado por: wel en Viernes 2 de Julio de 2004, 14:53
Seguimos igual, ahora he conseguido que el valor que  da para la temperatura y el higometro varien, pero no es un valor real, el problema yo creo que esta en que cada funcion del sht11 no indica si la patilla de data del micro es de entrada o salida, y hay que ir especificandolo, umm eso es lo que he podido deducir, a ver si alguien ha avanzado un poco más
Título: Re: Higrómetro/termómetro Sht11
Publicado por: J1M en Martes 6 de Julio de 2004, 19:29
wel mirate esto:

http://www.ccsinfo.com/forum/viewtopic.php?t=17108 (http://www.ccsinfo.com/forum/viewtopic.php?t=17108)


yo dejo el pfc para agosto q ahora me voy a ponerlos un poco en remojo!! :P

Salu2!
Título: Re: Higrómetro/termómetro Sht11
Publicado por: wel en Martes 13 de Julio de 2004, 21:56
mirado, gracias!!! mañana volvere al laboratorio a ver si avanzamos, por ahora consigo que saque valores que varian, pero no son los adecuados
Título: Re: Higrómetro/termómetro Sht11
Publicado por: oshow en Martes 20 de Julio de 2004, 17:50
Hola amigos, solo pasaba por aqui para daros el enlace correcto a un driver para el sht11, el cual me han confirmado que funciona. Al ver el enlace que puso J1M en el foro de ccs me decidi a buscar en ese foro y vi un post de Steve Hageman (un auténtico genio con el ccs y actual colaborador de ese foro ) y me puse en contacto con él ya que él había conseguido poner en marcha el sensor http://www.analoghome.com/projects/dewpointer.html (http://www.analoghome.com/projects/dewpointer.html).


Me comento que el driver para el ccs que hay aqui funciona bien...

http://www.ccsinfo.com/forum/viewtopic.php...8&highlight=sht (http://www.ccsinfo.com/forum/viewtopic.php?t=17108&highlight=sht)


En cuanto pueda, me pondré a probarlo a ver si consigo echarlo a andar.

Por cierto no me gusta hacer spam, pero recomendaría que visitaseis el sitio de este hombre porque merece la peña, http://www.analoghome.com (http://www.analoghome.com)


Nada más colegas, perdonad la interrupción y a ver si lo ponemos de una vez por todas en marcha.

Si lo echais a andar sería bueno comentar la experiencia para los que todavía no lo hemos probado.

Saludos.
Título: Re: Higrómetro/termómetro Sht11
Publicado por: LechugaHack en Viernes 23 de Julio de 2004, 11:45
Sabeis q nenes???

deberian dejarse de estar perdiendo el tiempo buscando el codigo listo y ponerse a leer la hoja de datos y hacer su programilla

 :lightsabre:
Título: Re: Higrómetro/termómetro Sht11
Publicado por: wel en Lunes 16 de Agosto de 2004, 00:32
yo consigui hacerlo ir, si alguien quiere que me pida el codigo
Título: Re: Higrómetro/termómetro Sht11
Publicado por: oshow en Lunes 16 de Agosto de 2004, 11:24
Yo también lo tengo desde hace algunos días, pero no sé porqué, mide mal, mide como unos 5ºC de más, además no he tenido la ocasión de comprobar la humedad, pero algo me dice que tampoco anda muy bien....

Me parece muy raro,sobre todo porque he mirado el calentador interno y no está activado, a ti te pasa?, mide bien la Tª? lo has comprobado?.

En que codigo te has basado?, he revisado el mio y tenia bastantes errores, has usado el del foro de CCS?.

Serías tan amable de postearlo o enviarmelo?.


Saludos.
Título: Re: Higrómetro/termómetro Sht11
Publicado por: J1M en Miércoles 18 de Agosto de 2004, 13:47
seriais tan amables de mandarme el codigo???

yo la parte del SHT11 la tengo un poco avandonada, ahora ando intentando visualizar el DS1307 en el LCD...


jim2k2@hotmail.com


Graciasss  :kicking:  :hola:
Título: Re: Higrómetro/termómetro Sht11
Publicado por: wel en Martes 7 de Septiembre de 2004, 01:10
enviado a los dos, perdon por el retraso
Título: Re: Higrómetro/termómetro Sht11
Publicado por: wel en Martes 7 de Septiembre de 2004, 01:12
aps, aqui os dejo la web donde explicamos nuestro proyecto entero, si neceistais algo lo mismo lo pedis, en la web esta el mail
Termometro - Higrometro apartir del sensor sht11 y pic 16f877 (http://server-die.alc.upv.es/asignaturas/LSED/2003-04/Placas/A04/index.htm)
Título: Re: Higrómetro/termómetro Sht11
Publicado por: javisanchez en Miércoles 14 de Septiembre de 2005, 21:39
Buenas, he de hacer un proyecto en el cual utilizo el sensor SHT11 controlado mediante un micro de la família del 8051.
Desearia que si alguien a hecho un programa en assembler para esto me lo envie a mi dirección de email ya que con ello podria empezar a orientarme para hacer mi propio programa.
Gracias a todos!!!!
Título: Re: Higrómetro/termómetro Sht11
Publicado por: ppcco en Miércoles 1 de Marzo de 2006, 21:51
Hola, alguien podría enviarme el código para leer el SHT11 desde un pic?

Saludos
Título: Re: Higrómetro/termómetro Sht11
Publicado por: voltio en Lunes 27 de Noviembre de 2006, 00:48
Cita de: "wel"
yo consigui hacerlo ir, si alguien quiere que me pida el codigo
hola colega, pordrias enviarme el codigo ? gracias.
Atte.Ruben
Título: Re: Higrómetro/termómetro Sht11
Publicado por: Aristides Alvarez en Lunes 27 de Noviembre de 2006, 14:33
En estas dos direcciones tienen bastante información referente al STH1x:

http://www.parallax.com/detail.asp?product_id=28018 (http://www.parallax.com/detail.asp?product_id=28018)

http://www.emesystems.com/OL2sht1x.htm (http://www.emesystems.com/OL2sht1x.htm)
Título: Re: Higrómetro/termómetro Sht11
Publicado por: sicfilez en Martes 11 de Septiembre de 2007, 05:53
Por favor serias tan amable de mandarme el codigo =)... tengo un codigo en CCS.. pero como resultado me da -39.9c...

Te lo Agradeceria.... sicfilez@gmail.com
Título: Re: Higrómetro/termómetro Sht11
Publicado por: ksanchezm8 en Miércoles 26 de Septiembre de 2007, 08:31
Hola podrias enviarmelo a mi tambien ksanchezm8@gmail.com
Título: Re: Higrómetro/termómetro Sht11
Publicado por: Glockero en Domingo 9 de Diciembre de 2007, 22:26
Cita de: "wel"
aps, aqui os dejo la web donde explicamos nuestro proyecto entero, si neceistais algo lo mismo lo pedis, en la web esta el mail
Termometro - Higrometro apartir del sensor sht11 y pic 16f877 (http://server-die.alc.upv.es/asignaturas/LSED/2003-04/Placas/A04/index.htm)
Una molestia. Serías tan amable de enviarme el código fuente?. Gracias glock25@gmail.com
Título: Re: Higrómetro/termómetro Sht11
Publicado por: veronik_13 en Martes 17 de Febrero de 2009, 13:27
HOLA A TODOS!!!

Necesito realizar un programa que mida la temperatura y humedad solamente. Para ello utilizo el sensor SHT75 y el micro PIC18F4620. He probado con los códigos que habeis puesto en este foro, pero no me funciona. Alguien me podría enviar un codigo que me sirva???


MUCHAS GRACIAS!!!
SALUDOS!!  :good:
Título: Re: Higrómetro/termómetro Sht11
Publicado por: veronik_13 en Jueves 26 de Febrero de 2009, 10:11
Hola!! He conseguido que el sensor me envíe información, pero como a muchos de vosotros , me devuelve una temperatura de -39.9º y una humedad del 0.01%. Como lo habeis solucionado???? Alguien me puede enviar el código, por favor????

Muchas gracias! Un saludo!!!  :comp:
Título: Re: Higrómetro/termómetro Sht11
Publicado por: veronik_13 en Jueves 26 de Febrero de 2009, 10:14
:losiento:  Perdon, mi correo es     veronik_13_85@hotmail.com

Muchas gracias. Un saludo!!!!! :hola:
Título: Re: Higrómetro/termómetro Sht11
Publicado por: magydr en Lunes 6 de Julio de 2009, 23:56
Cita de: "wel"
yo consigui hacerlo ir, si alguien quiere que me pida el codigo
Que tal.. les cuento que me pareció interente el uso de este sensor ya que es digital es por eso que le tomé en cuenta para un proyecto pero tengo este problema me devuelve una temperatura de -39.9º y una humedad del 0.01% ... por favor me podrían enviar a mi correo un código que funcione bien para comparar con el mio y poder hacer los cambios necesarios para que funcione. Mi correo es magydr75@yahoo.com
Título: Re: Higrómetro/termómetro Sht11
Publicado por: Gainza en Martes 7 de Julio de 2009, 17:38
Hola magydr, tengo el mismo problema lo único es que en mi caso cuando lo soplo la temperatura y la humedad varia muy levemente, pero tengo que apretar el boton de reset para que cambien estos datos, cosa que es totalmente erronea. Hace un tiempo en este mismo foro unos de sus participantes (WEL) llego a conseguir que funcionara de forma coherente, según él, el problema podría estar en que las funciones no especificaban si el pin de DATA estaba como entrada o salida (te hablo con respecto al codigo que aparece en la sensiriom, que es el que todo el mundo tiene por hay). Quiero solucionar esto, asi que sería bueno si nos ayudamos mutuamente, si encuentro algo aviso por este medio.
Título: Re: Higrómetro/termómetro Sht11
Publicado por: bocabeats en Jueves 5 de Noviembre de 2009, 16:05
Oye wel me puedes mandar el código del programa en c??
Título: Re: Higrómetro/termómetro Sht11
Publicado por: bocabeats en Jueves 12 de Noviembre de 2009, 16:48
Cita de: "© Jonathan ©"
Que problema tienes, manejar el LCD y mostrar datos o manejar el sensor del que hablas????... para manejar un sensor o poder ayudarte, debemos aprender a utilizarlo nosotros, por lo que vas a recibir poca ayuda, si especificas un poquito mas te ayudaran con mas placer, eso, si no hay un experto con el sensor... Dime y vemos. Saludos :hola:

podrias mandarme el codigo en c para el sht11 con pic16f876a??
Título: Re: Higrómetro/termómetro Sht11
Publicado por: Pachoes en Sábado 14 de Noviembre de 2009, 22:56
Bueno para todos aquellos que tienen problemas con el shtxx con la temperatura y la humedad.

Habeis colocado la resisténcia indicada por el fabricante?     10k de VDD a data.

Si no os funciona me lo dedid y os mando la libreria que estoy usando.

Salu2.
Título: Re: Higrómetro/termómetro Sht11
Publicado por: mandragora21 en Domingo 28 de Marzo de 2010, 18:39
wel serias tamn amable de enviarme el codigo para en tremometro hidrometro con 16f877 en c si es posible
gracias anticipadas
mandragora21@hotmail.com
Título: Re: Higrómetro/termómetro Sht11
Publicado por: Pachoes en Lunes 10 de Mayo de 2010, 11:49
Bueno para todos aquellos que tienen problemas con el shtxx con la temperatura y la humedad a ver si con esto se os soluciona.

Un poco de reflexion:

Por que no puso el fabricante la resistencia de 10k de VDD a data directamente en el sensor y nos hubiera evitado tener que ponerla nosotros?

Ese es el tema.

Os cuento :
Cuando tenia mi programa con el 16f877a todo iba de escandalo y yo super feliz pero el problema vino cuando migre al 18f4550 con este no me hacia las lecturas correctas es decir -40ºC  0.01%HR todo se puso oscuro, varios dias a ver como lo solucionaba y venga a darle vueltas al codigo y siempre lo veia correcto y la verdad es que esta correcto pues al testear con el osciloscopio en el DATA sorpresa lee correctamente pues ya tengo la solucion, cuando compre un SHTXX  compro un osciloscopio para que funcione y todo arreglado. jejejeje.

Otra solucion mas barata es la siguiente y es cambiar la resistencia del fabricante por una mayor es decir a mi me funciona bien con 12k tambien he probado con 15k y todo perfecto.

En cuanto a la pregunta ¿por que no puso el fabricante la resistencia? me contesto yo mismo.

Espero que os sea de ayuda y lo solucionaneis.

Salu2.
Título: Re: Higrómetro/termómetro Sht11
Publicado por: mandragora21 en Lunes 10 de Mayo de 2010, 21:04
hola Pachoes parece que el pos es algo antiguo y wel no esta por aki serias tan amable de enviarme el codigo si lo tienes.
muchas gracias :lol:
Título: Re: Higrómetro/termómetro Sht11
Publicado por: shinseiky en Sábado 15 de Mayo de 2010, 17:48
Cita de: "wel"
yo consigui hacerlo ir, si alguien quiere que me pida el codigo
serias tan amable de pasarme el codigo
Título: Re: Higrómetro/termómetro Sht11
Publicado por: Pachoes en Domingo 23 de Mayo de 2010, 11:11
Enviado mandragora.

Salu2
Título: Re: Higrómetro/termómetro Sht11
Publicado por: mandragora21 en Lunes 24 de Mayo de 2010, 22:30
Hola pachoes te doy las gracias por responderme y claro está por enviarme el código debió suceder algún problema que no me llego el código. Te lo agradecería si me lo mandaras de nuevo.
Gracias anticipadas
mandragora21@hotmail.com
Título: Re: Higrómetro/termómetro Sht11
Publicado por: bebexus en Martes 31 de Agosto de 2010, 18:17
hola pachoes, vi tu comentario sobre el 18f4550, resulta que tambien lo estoy usando, me seria de muha utilidad ver tu codigo, estaria muy agradecido.
Título: Re: Higrómetro/termómetro Sht11
Publicado por: jfr214 en Lunes 27 de Diciembre de 2010, 14:15
si al guien tiene la libreria y el codigo fuente de sht 11 y del pic 16f876a lo podriais mandar?
 jorgederandio@yahoo.es