Advertisement
Guest User

Untitled

a guest
Aug 29th, 2012
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.92 KB | None | 0 0
  1. //
  2. //Sensirion SHT71 (http://www.acmesystems.it/?id=89) by Douglas Gilbert
  3.  
  4. #include <math.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <unistd.h>
  8. #include "./z2-gpio.h"
  9.  
  10. // -----------------------------------------------------------------------
  11. // SHT71 sensor define
  12. // -----------------------------------------------------------------------
  13.  
  14. #define CLOCK_BIT 53
  15. #define DATA_BIT 54
  16.  
  17. #define DATA_LINE_IN gpio_dir_in(DATA_BIT)
  18. #define DATA_LINE_OUT gpio_dir_out(DATA_BIT)
  19.  
  20. #define DATA_LINE_LOW set_gpio_value(DATA_BIT, 0)
  21. #define DATA_LINE_HIGH set_gpio_value(DATA_BIT, 1)
  22. #define DATA_LINE_READ get_gpio_value(DATA_BIT)
  23.  
  24. #define CLOCK_LINE_LOW set_gpio_value(CLOCK_BIT, 0)
  25. #define CLOCK_LINE_HIGH set_gpio_value(CLOCK_BIT, 1)
  26.  
  27. #define CMD_RESET 0x1e
  28. #define CMD_READ_TEMP 0x03
  29. #define CMD_READ_HUM 0x05
  30.  
  31. // -----------------------------------------------------------------------
  32. // Send the start sequence
  33. // -----------------------------------------------------------------------
  34. static void SendStart(void)
  35. {
  36. CLOCK_LINE_LOW;
  37. DATA_LINE_OUT;
  38. DATA_LINE_HIGH;
  39. usleep(1000);
  40. CLOCK_LINE_HIGH;
  41. usleep(1000);
  42. DATA_LINE_LOW;
  43. usleep(1000);
  44. CLOCK_LINE_LOW;
  45. usleep(1000);
  46. CLOCK_LINE_HIGH;
  47. usleep(1000);
  48. DATA_LINE_HIGH;
  49. usleep(1000);
  50. CLOCK_LINE_LOW;
  51. }
  52.  
  53. // -----------------------------------------------------------------------
  54. // Sensor reset
  55. // -----------------------------------------------------------------------
  56. static void SendReset (void)
  57. {
  58. int k;
  59. DATA_LINE_OUT;
  60. DATA_LINE_HIGH;
  61. for (k = 0; k < 12; k++) {
  62. CLOCK_LINE_HIGH;
  63. usleep(1000);
  64. CLOCK_LINE_LOW;
  65. usleep(1000);
  66. }
  67. CLOCK_LINE_HIGH;
  68. usleep(1000);
  69. DATA_LINE_LOW;
  70. usleep(1000);
  71. CLOCK_LINE_LOW;
  72. usleep(1000);
  73. CLOCK_LINE_HIGH;
  74. usleep(1000);
  75. DATA_LINE_HIGH;
  76. usleep(1000);
  77. CLOCK_LINE_LOW;
  78. }
  79.  
  80. // -----------------------------------------------------------------------
  81. // Send a byte to the sensor
  82. // -----------------------------------------------------------------------
  83. static int SendByte(unsigned char byte)
  84. {
  85. unsigned char tempbyte;
  86. int k;
  87. DATA_LINE_OUT;
  88. tempbyte = byte;
  89. for (k = 0x80; k > 0; k /= 2) {
  90.  
  91. if (tempbyte & k){
  92. DATA_LINE_HIGH;
  93. } else {
  94. DATA_LINE_LOW;
  95. }
  96. usleep(1000);
  97. CLOCK_LINE_HIGH;
  98. usleep(1000);
  99. CLOCK_LINE_LOW;
  100. usleep(1000);
  101. }
  102. DATA_LINE_IN;
  103. CLOCK_LINE_HIGH;
  104. usleep(10000);
  105. CLOCK_LINE_LOW;
  106. usleep(10000);
  107. return 1;
  108. }
  109.  
  110. // -----------------------------------------------------------------------
  111. // Read a byte from the sensor
  112. // -----------------------------------------------------------------------
  113. static unsigned char ReadByte(int withack)
  114. {
  115. unsigned char tempbyte;
  116. int k;
  117. tempbyte = 0;
  118. DATA_LINE_IN;
  119. for (k = 0x80; k > 0; k /= 2) {
  120. CLOCK_LINE_HIGH;
  121. usleep(1000);
  122. if (DATA_LINE_READ){
  123. tempbyte |= k;
  124. }
  125. CLOCK_LINE_LOW;
  126. usleep(1000);
  127. }
  128. if (withack) {
  129. DATA_LINE_OUT;
  130. DATA_LINE_HIGH;
  131. usleep(1000);
  132. DATA_LINE_LOW;
  133. usleep(1000);
  134. CLOCK_LINE_HIGH;
  135. usleep(1000);
  136. CLOCK_LINE_LOW;
  137. usleep(1000);
  138. DATA_LINE_IN;
  139. } else {
  140. DATA_LINE_OUT;
  141. DATA_LINE_HIGH;
  142. usleep(1000);
  143. CLOCK_LINE_HIGH;
  144. usleep(1000);
  145. CLOCK_LINE_LOW;
  146. usleep(1000);
  147. DATA_LINE_IN;
  148. }
  149. return tempbyte;
  150. }
  151.  
  152. // ----------------------
  153. // Read the temperature
  154. // ----------------------
  155. static int ReadTemperature(void)
  156. {
  157. unsigned char Lsb, Msb, Chk;
  158. SendStart();
  159. usleep(1000);
  160. SendByte(CMD_READ_TEMP);
  161. usleep(500000);
  162. Msb = ReadByte(1);
  163. Lsb = ReadByte(1);
  164. Chk = ReadByte(0);
  165. return (Msb << 8) + Lsb;
  166. }
  167.  
  168. // ------------------
  169. // Read the humidity
  170. // ------------------
  171. static int ReadHumidity(void)
  172. {
  173. unsigned char Lsb, Msb, Chk;
  174. SendStart();
  175. if (! SendByte(CMD_READ_HUM))
  176. return 0;
  177. while (DATA_LINE_READ)
  178. ;
  179. Msb = ReadByte(1);
  180. Lsb = ReadByte(1);
  181. Chk = ReadByte(0);
  182. return (Msb << 8) + Lsb ;
  183. }
  184.  
  185. float AirDensity(float humidity, float temperature, float barometric)
  186. {
  187. barometric = 758.952;
  188. float kelvin = (273.15 + temperature);
  189. float exponent = exp(-5315.56 / kelvin);
  190. float pressure = (0.0004646 * (barometric - (4990221.6 * humidity * exponent)));
  191. return (pressure / kelvin) ;
  192. }
  193.  
  194. // ----------
  195. // main code
  196. // ----------
  197. //int main(int argc, char ** argv)
  198. int main(int argc, char *argv[])
  199. {
  200. int opt, soh, sot;
  201. int do_reset = 0;
  202. double dew_point_lf, denominator, numerator;
  203. float rel_humidity, temperature_c, Tn = 243.12, m = 17.62;
  204.  
  205. gpio_export(DATA_BIT);
  206. gpio_export(CLOCK_BIT);
  207. gpio_dir_out(CLOCK_BIT);
  208.  
  209. SendReset();
  210. usleep(100000);
  211. soh = ReadHumidity();
  212. sot = ReadTemperature();
  213. // rel_humidity = -2.0468 + (0.0367 * soh) + (-1.5955E-6 * soh * soh);
  214. rel_humidity = -4 + (0.0405 * soh) + -2.8E-6;
  215. if (rel_humidity > 99.9)
  216. rel_humidity = 100.0;
  217. else if (rel_humidity < 0.1)
  218. rel_humidity = 0.0;
  219. temperature_c = -39.66 + (0.01 * sot);
  220. printf (" Rel. Humidity : %.2f %% RH\n", rel_humidity);
  221. printf (" Temperature : %.2f °C\n", temperature_c);
  222. printf ("Barometric Pressure : %.3f mmHg\n", 758.952);
  223. gpio_unexport(53);
  224. gpio_unexport(54);
  225.  
  226. numerator = log(rel_humidity / 100) + ((m * temperature_c) / (Tn + temperature_c));
  227. denominator = m - log(rel_humidity / 100) - ((m * temperature_c) / (Tn + temperature_c));
  228. printf (" Dew Point : %.2f ºC\n", Tn * (numerator / denominator));
  229. printf (" Air Density : %.7f g/cm^3\n", AirDensity(rel_humidity, temperature_c, 0.00));
  230. return 0;
  231. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement