• Domingo 31 de Mayo de 2026, 01:54

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - J1M

Páginas: [1]
1
Programación en C / Proyecto Picusb
« en: Sábado 27 de Agosto de 2005, 00:37 »
Antes de comenzar querría agradecer a Mat Clayton el valiosísimo aporte de su API para C#, sin la cual estaría aún dándome cabezazos intentando entender porqué no me leía la DLL!! Gracias Mat! Dedico este proyectillo a todos los usuarios del foro TodoPIC, ese pedazo punto de encuentro para todos los PicManíacos!

PicUSB se ha realizado con la intención de proporcionar un primer empujón para todos aquellos que quieren arrancar con los diseños por USB y que como supongo que a muchos nos ha pasado, no saben por donde engancharlo!

El proyecto en sí es bastante sencillito, pretende mostrar como enviar/recibir datos por USB desde el PIC al PC, se ha intentado que el programa fuera entendible, por lo que realmente no tiene ninguna utilidad mas que como digo, servir de introducción al mundo del USB.

Se ha utilizado el grabador GTP USB Lite como ‘placa base’ para este proyectillo, ya que el funcionamiento del PicUSB se limita a encender/apagar cada uno de los colores del led bicolor y a realizar una suma de dos operandos.

El esquema de conexión del PicUSB es el mostrado en la siguiente imagen:


El proyecto consta de tres partes:

    * Programación de la aplicación para el PIC
    * Programación de la aplicación para el PC
    * Edición del driver suministrado por Microchip

Para la programación de la aplicación para el PIC se ha optado por usar el extendido compilador CCS, en concreto la versión 3.227, la primera versión que incorpora las bibliotecas para el uso del USB 2.0. El código de la aplicación se encuentra en el PicUSB_CCS.zip, así como el .hex para ser grabado en el PIC. Tanto el PicUSB.c, como el PicUSB.h están más o menos documentados en un perfecto Spanglish. El proyecto está basado en el ex_usb_scope.c suministrado por CCS como ejemplo para el compilador. Se ha decidido usar el 18F2550 pero puede usarse cualquiera de la serie 18Fxx5x que incorporan el USB 2.0.

Para la programación de la aplicación para PC se ha optado por usar el Visual C# Express 2005 y puede ser descargado gratuitamente de la página de Microsoft.

En el caso de no instarse el Visual C#, para poder ejecutar el PicUSB.exe será necesario al menos, tener instalada la última versión del .NET Framework.

El código fuente se encuentra en PicUSB_VisualC#.zip, donde también se incluye funciones_dll.txt, en este se detalla el uso de las funciones contenidas en la mpusbapi.dll proporcionada por Microchip.

El último paso ha sido la edición del Driver suministrado por Microchip de tal forma que apareciera en el Administrador de Dispositivos una nueva clase con un icono personalizado. Para esto ha sido necesario crear una DLL que exporte ese icono. Se adjunta el código fuente de la DLL, PicUSB_Classinstaller.zip por si se desea recompilar para poner otro icono. Se necesita para ello la DDK (Development Driver Kit) de Microsoft, para este ejemplo se ha usado la windows_server_2003_sp1_ddk. Y el ejemplo llamado Toaster.

El Driver en sí se encuentra en PicUSB_Driver.zip, donde pueden ser modificados varios apartados, aunque quizá los mas útiles son los Strings y PID&VID.

Al conectar el PicUSB por primera vez, aparecerá el asistente para la instalación de nuevo hardware, se marca la opción de "instalar desde una lista o ubicación específica", se pincha sobre siguiente y en la siguiente pantalla se marca la opción de "Buscar el controlador más adecuado en estas ubicaciones", se pincha sobre "Incluir esta ubicación en la búsqueda" y a continuación sobre Examinar, entonces se selecciona la carpeta PicUSB_Driver, y se le da a Aceptar, y a Siguiente, aparecerá entonces una pantalla de advertencia, se hace clic sobre aceptar, y la instalación del Driver estará terminada, el led del PicUSB habrá pasado de estar rojo a verde y estará listo para ser usado.

Si todo ha ido bien, en el Administrador de Dispositivos debe aparecer algo así:


Dentro del PicUSB_APP.zip se puede encontrar la aplicación PicUSB.exe así como la dll necesaria, suministrada por Microchip. El funcionamiento es sencillo:


En la parte superior se encuentra el sumador, si se introduce un número del 00 hasta el 99 en cada uno de los sumandos y se pincha sobre PIC Suma!, estos dos operandos serán enviados al PIC, donde se procesará la suma, devolviendo entonces el resultado que se mostrará en la tercera casilla. Por otro lado los botones, Leds Off, Led Verde On y Led Rojo On, envían el código correspondiente al PIC para cada uno de los casos y actúa en consecuencia. Al hacer clic sobre la imagen se abrirá vuestro explorador web por defecto para llevaos a mi página HobbyPIC

Para programar el PIC se recomienda usar el WinPIC800 creado por Sisco.

DOWNLOAD

LINK AL ARTICULO

ACTUALIZACIÓN:
El proyecto se ha actualizado para dar soporte a Windows Vista x32/x64, además de mantener la 'retrocompatibilidad' con Windows XP, visita el nuevo artículo llamado PicWinUSB pinchando sobre la siguiente imagen:


Para cualquier duda o pregunta: [email:ykow1k46]hobbypic@hotmail.com[/email:ykow1k46]
 
Jaime Fernández-Caro Belmonte - J1M
..:: www.HobbyPIC.com ::..

2
Microcontroladores / Gtp Usb Lite
« en: Domingo 10 de Abril de 2005, 01:46 »
Bueno lo primero agradecer a Sispic su ayuda para que este programador sea una realidad, tanto por su ayuda, como por su software, WinPic800, sin el cual este programador no haría nada, agradecer tambien la ayuda de nocturno, la suya personal y la aportada con su F1GTPUSB SMD para poder hacer este diseño, a continuación os dejo esquematicos, pcb, pdf, y archivo de configuración a incluir en el winpic800, este software lo podeis descargar de:
http://perso.wanadoo.es/siscobf/winpic800.htm
El GTP USB Lite soporta tantos PICs como el software WinPIC800.

Al conectar por primera vez el GTP USB Lite detectará un nuevo dispositivo, por lo que tendreis que instalarle los drivers, estos los podeis encontrar dentro de la carpeta ..\WinPic800\GTP-USB\Driver GTP-USB, debereis selecionar manualmente la ruta donde se encuentra el driver y que el propio sistema operativo lo detecte.
Dentro del .zip encontrareis el GTP-USB-Lite.hwp, debeis incluirlo dentro de la carpeta del winpic800 y seleccionarlo como hardware.
El driver encargado de la comunicación entre el PC y el Pic a programar es un PIC 18F2550, encontrareis el .hex necesario para programarlo dentro de la carpeta GTP-USB del winpic800 'GTP_USB.hex'. Para programar este PIC os recomiendo montar el programador de ART2003, es sencillo y rapido de realizar, podeis encontrarlo en esta web:
http://art2003.no-ip.com





En esta última imagen se muestra como conectar cada una de las patas de salida del conector ICSP a los PICS de uso mas común.
El diseño está realizado con el Orcad 10.0 SP2, si alguno no tiene posibilidad de usar este software, tambien os he incluido la pcb de la placa en formato pdf, así como la lista de materiales a usar 'gtp_usb_lite.bom'

http://perso.wanadoo.es/j1m/proyectos/gtpusblite/index.htm

http://perso.wanadoo.es/j1m/proyectos/gtpu...tp_usb_lite.zip

http://perso.wanadoo.es/j1m/index.htm

Si teneis alguna duda podeis encontrarme en:
jim2k2@hotmail.com

Jaime Fernández-Caro Belmonte

3
Programación en C / Libreria Control Pcf8833 V0.1
« en: Martes 1 de Marzo de 2005, 20:44 »
GCLCD v0.5

Ya está lista esta segunda versión de la librería, cabe destacar que está basada en el diseño original de: http://www.apetech.de/nokia6100.php para AVR, y en las funciones gráficas de la librería GLCD.C del CCS.
Antes de continuar, dar las gracias muy en especial al pana Lager, que se ha currado y sigue mejorando!, un pedazo aplicación para ser usada conjuntamente con esta librería, Gracias amigo ;)
Esta librería está programada en C, con el entorno CCS 3.221.
Las diferencias fundamentales con respecto a la versión anterior son:
- Imágenes en 64k colores (16bits), y 256 colores (8bits), de tamaño y posición variables.
- Funciones gráficas para la creación de Rectángulos, Circunferencias y Líneas  con ancho de contorno variable.
- Uso de diferentes tamaños y colores de fuentes.
- Así como la optimización de código y eliminación de algunos bugs.

Para quien se decida a usarlo, sirve cualquier display de los móviles: 2600/2650/3100/3120/3200/5100/5140/6100/6220/6610/7210/7250

Hay dos tipos de controladores distintos



Siendo el usado el de la plaquita marrón (Philips PCF8833), parece ser que el de la placa verde (y que cualquiera de los móviles antes citados puede tener...) también puede ser usado, puesto que son compatibles, no puedo confirmarlo ya que no lo he probado. El compatible es el Epson (S1D15G00), aquí podéis descargar sus datasheets:
http://www.hantronix.com/down/S1D15G00_REV1_0.pdf
http://www.semiconductors.philips.com/pip/PCF8833_1.html

Quien no tenga acceso a estos móviles, puede conseguir estos displays en esta página:
http://www.magboss.pl/product_info.php?products_id=638

Cuestan 18€ + 6.5€ de gastos de envío, yo he hecho ya un par de pedidos y en un par de semanas están aquí y en perfecto estado.

Para conectar el display podéis hacerlo mediante el conector en smd que podréis encontrar en esa misma página:
http://www.magboss.pl/product_info.php?products_id=514

Cuesta 3€ y por mi parte ha sido imposible soldarlo...
El display también tiene la posibilidad de ser soldado por la parte trasera, aquí podéis ver el como, y la numeración de los pines:



Los pads tienen un paso de 1.27, no he encontrado ningún terminal, aunque si de 1.25, los tengo pedidos, cuando lleguen y los pruebe os cuento si merecen o no la pena comprarlos.

Respecto a los pines esta es su conexión:

1    Vdigital   2,7V - 3,3V
2   RESET         PC0
3   SDATA        PC5 (SPI Data)
4   SCLK         PC3 (SPI Clock)
5   ~CS          PA5 (SPI E/D)
6   Vdisplay   2,7V - 3,3V
7   n/c           ---
8   GND         GND
9   LED-          GND
10   LED+        15mA - 30mA (6,4V)
11   n/c          ---

Os recomiendo que no superéis nunca la tensión de alimentación de 3v3 ... creo q al display no le gusta... jejeje por eso lo de mi segundo pedido  

A continuación os dejo un esquema de conexión con un PIC



Actualmente estamos usando un cristal de 10Mhz, y el PIC18F2520, una de las características de este pic, es el uso interno de un PLL, está configurado para trabajar al cuádruple del reloj del sistema (Fuse H4), por lo que en realidad nuestra frecuencia de trabajo es 40Mhz.
El TC2117 es un estabilizador de tensión que suministra Microchip, en su página web podéis encontrar mas información sobre el, y como conseguirlo, al igual que el PIC ;)
Este display requiere el uso de un Driver para alimentar a los LEDs blancos que usa para la retroiluminación, por el momento el único que he encontrado que tenga facilidad para ser adquirido es el MAX1848, está en camino, cuando lo pruebe os contaré que tal.

Debido a que una imagen de 130x130 pixeles a 64k colores no entra en la ROM del pic, se hace necesario, el uso de memorias externas, el uso de este tipo de memorias, junto con algunas mejoras pendientes como un mejor algoritmo del envío de caracteres, quedan para la siguiente versión.

Os recomiendo el uso del WinPic800 de Sispic para programar el pic:
http://perso.wanadoo.es/siscobf/winpic800.htm

Y el GTP USB Lite como programador:
http://perso.wanadoo.es/j1m/proyectos/gtpusblite/index.htm
 
Adjunto a esta librería podéis encontrar el GCLCD TODOPIC de Lager, como la herramienta para convertir las imágenes, y fuentes.

Agradecer a todos los que han contribuido tanto directa como indirectamente en este proyecto, en general al foro de TodoPIC, y muy en especial a Lager.

Os dejo a continuación unas imágenes del display:




http://perso.wanadoo.es/j1m/proyectos/gclcd/index.htm

http://perso.wanadoo.es/j1m/proyectos/gclcd/gclcd_v0.5.zip

http://perso.wanadoo.es/j1m/index.htm

Jaime Fernández-Caro Belmonte

4
Microcontroladores / Gtp Lite
« en: Lunes 14 de Febrero de 2005, 16:30 »
En primer lugar querría agradecer a todos los que han colaborado tanto directa como indirectamente en la creación de este hardware, y en los que me he inspirado para llegar a hacer este, nocturno66, mglsoft, sispic, marmatar, c3poa... así como a los creadores de GTP, PP2, MicroPicTrainer, Kit182... Agradecer tambien a Sispic su dedicación en la creación del software WinPic800, sin el cual este programador poco podría hacer...Gracias a todos ;)

El diseño lo he realizado ajustandolo a mis necesidades, es por ello que no tiene placa de zocalos, ni dos lineas de Vpp, a mi simplemente me hacia falta la salida ICSP (con la que pueden ser programados todos los pics que soporten esta tecnologia...creo q practicamente todos...), otra de esas necesidades fue hacerlo compatible con el WinPic800, para lo cual me base fundamentalmente en el GTP de marmatar.

El diseño lo he realizado con el Orcad 10.0 SP2, el esquematico, placa, y componentes necesarios lo teneis dentro del zip al final del documento.

Para facilitar la realización de la placa y que no sea necesario tener el Orcad para poder imprimir la placa, voy a subios el fotolito... en cuanto sepa como pasarlo a jpg o pdf sin que se deforme...

Este es el esquematico:

Y esta la placa:

plakita:


Necesitareis un trafo de 15VCA, si teneis dificultad en encontrarlo, comprad uno de CA/CC regulable hasta 12V (los de 10€), lo abris y le quitais la parte correspondiente a la rectificación.

Dentro del .zip os he puesto el GTP Lite.hwp, este archivo de configuración para el WinPic800 debereis ponerlo en la misma carpeta del programador, así os seleccionará directamente la configuración para este hardware.

Aqui podeis encontrar el WinPic800:
http://perso.wanadoo.es/siscobf/winpic800.htm


http://perso.wanadoo.es/j1m/proyectos/gtplite/index.htm

http://perso.wanadoo.es/j1m/proyectos/gtplite/GTP_Lite.zip

http://perso.wanadoo.es/j1m/index.htm

Si teneis alguna duda podeis encontrarme en:
jim2k2@hotmail.com

Jaime Fernández-Caro Belmonte

5
Programación en C / Higrómetro/termómetro Sht11
« 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

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 ;)

Páginas: [1]