Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #include <Wire.h>
  2.  
  3. // nastaví adresu pro senzor tlaku
  4. #define ADR 0x77
  5.  
  6. // inicializace proměných
  7. short ac1 = 0;
  8. short ac2 = 0;
  9. short ac3 = 0;
  10. short b1 = 0;
  11. short b2 = 0;
  12. short mb = 0;
  13. short mc = 0;
  14. short md = 0;
  15. unsigned short ac6, ac4, ac5;
  16. long UT, b5;
  17.  
  18. // nastavení přesnosti čidla OSS
  19. // 0 až 3 (0 nejmenší)
  20. byte OSS = 3;
  21.  
  22. void setup()
  23. {
  24.  
  25.   Serial.begin(9600);
  26.   Wire.begin();
  27.  
  28.   //získání kalibračních hodnot ze senzoru
  29.   ac1 = GetShort(0xAA, 0xAB);
  30.   ac2 = GetShort(0xAC, 0xAD);
  31.   ac3 = GetShort(0xAE, 0xAF);
  32.   ac4 = GetShort(0xB0, 0xB1);
  33.   ac5 = GetShort(0xB2, 0xB3);
  34.   ac6 = GetShort(0xB4, 0xB5);
  35.   b1 = GetShort(0xB6, 0xB7);
  36.   b2 = GetShort(0xB8, 0xB9);
  37.   mb = GetShort(0xBA, 0xBB);
  38.   mc = GetShort(0xBC, 0xBD);
  39.   md = GetShort(0xBE, 0xBF);
  40. }
  41.  
  42.  
  43.  
  44. void loop()
  45. {
  46. UT =  GetUT();
  47. short teplota = GetTemperature(UT);  
  48. Serial.print("Teplota:      ");
  49. Serial.print((float)teplota/10);  
  50. Serial.println(" st.C");
  51.  
  52. long tlak = GetPressure(ReadUP());
  53. Serial.print("Tlak:         ");
  54. Serial.print((float)tlak/100);
  55. Serial.println(" hPa");
  56.  
  57. // výpočet nadmořské výšky
  58. // za p0 si dosaďte sou hodnotu pro tlak ve vaší
  59. // oblasti přepočtený na hladinu moře v Pa
  60. long p0 = 100400;
  61. float vyska = (float)44330 * (1 - pow(((float) tlak/p0), 0.190295));
  62. Serial.print("Nadm. vyska:  ");  
  63. Serial.print((float)vyska);  
  64. Serial.println(" m");
  65.  
  66. // obnovovat budeme každých 5 vteřin
  67. delay (5000);
  68. // jeden řádek mezi daty vynecháme
  69. Serial.println();
  70. }
  71.  
  72.  
  73.  
  74. //funkce pro získání kalibračních hodnot
  75. short GetShort(byte adr1, byte adr2)
  76. {
  77.   byte b1, b2;
  78.   Wire.beginTransmission(ADR);
  79.   Wire.write(adr1);  
  80.   Wire.endTransmission();
  81.   Wire.requestFrom(ADR,1);
  82.   if (Wire.available()) b1 = Wire.read();
  83.  
  84.   Wire.beginTransmission(ADR);
  85.   Wire.write(byte(adr2));  
  86.   Wire.endTransmission();
  87.   Wire.requestFrom(ADR,1);
  88.   if (Wire.available()) b2 = Wire.read();
  89.   short r = b2 + (unsigned short)(b1 << 8);
  90.   return r;
  91. }
  92.  
  93. // získá nekompenzovanou hodnotu teploty
  94. long GetUT()
  95. {
  96.   byte b1, b2, b3;
  97.  
  98.   Wire.beginTransmission(ADR);
  99.   Wire.write(0xF4);
  100.   Wire.write(0x2E);  
  101.   Wire.endTransmission();
  102.  
  103.   delay(5);
  104.  
  105.   Wire.beginTransmission(ADR);
  106.   Wire.write(0xF6);
  107.   Wire.endTransmission();
  108.   Wire.requestFrom(ADR,1);
  109.   if (Wire.available()) b1 = Wire.read();
  110.    
  111.   Wire.beginTransmission(ADR);
  112.   Wire.write(0xF7);
  113.   Wire.endTransmission();
  114.   Wire.requestFrom(ADR,1);
  115.   if (Wire.available()) b2 = Wire.read();
  116.    
  117.   long ut =  ((long)b1<<8) + b2;
  118.   return ut;
  119. }
  120.  
  121. // získá nekompenzovanou hodnotu tlaku
  122. unsigned long ReadUP()
  123. {
  124.   unsigned char msb, lsb, xlsb;
  125.   unsigned long up = 0;
  126.  
  127.   Wire.beginTransmission(ADR);
  128.   Wire.write(0xF4);
  129.   Wire.write(0x34 + (OSS<<6));
  130.   Wire.endTransmission();
  131.  
  132.   // čekání na konverzi podle nastavené přesnosti
  133.   delay(2 + (3<<OSS));
  134.    
  135.   Wire.beginTransmission(ADR);
  136.   Wire.write(0xF6);
  137.   Wire.endTransmission();
  138.   Wire.requestFrom(ADR, 3);
  139.  
  140.   // přečte tři bajty
  141.   while(Wire.available() < 3)
  142.     ;
  143.   msb = Wire.read();
  144.   lsb = Wire.read();
  145.   xlsb = Wire.read();
  146.  
  147.   // a poté z nich složí hodnotu
  148.   up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
  149.  
  150.   return up;
  151. }
  152.  
  153.  
  154. // funkce pro získání teploty z UT
  155. short GetTemperature(unsigned int ut)
  156. {
  157.   long x1, x2;
  158.   x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
  159.   x2 = ((long)mc << 11)/(x1 + md);
  160.   b5 = x1 + x2;
  161.   return ((b5 + 8)>>4);  
  162. }
  163.  
  164. // funkce pro výpočet tlaku
  165. long GetPressure(unsigned long up)
  166. {
  167.   long x1, x2, x3, b3, b6, p;
  168.   unsigned long b4, b7;
  169.  
  170.   b6 = b5 - 4000;
  171.   // Calculate B3
  172.   x1 = (b2 * (b6 * b6)>>12)>>11;
  173.   x2 = (ac2 * b6)>>11;
  174.   x3 = x1 + x2;
  175.   b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
  176.  
  177.   // Calculate B4
  178.   x1 = (ac3 * b6)>>13;
  179.   x2 = (b1 * ((b6 * b6)>>12))>>16;
  180.   x3 = ((x1 + x2) + 2)>>2;
  181.   b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
  182.  
  183.   b7 = ((unsigned long)(up - b3) * (50000>>OSS));
  184.   if (b7 < 0x80000000)
  185.     p = (b7<<1)/b4;
  186.   else
  187.     p = (b7/b4)<<1;
  188.    
  189.   x1 = (p>>8) * (p>>8);
  190.   x1 = (x1 * 3038)>>16;
  191.   x2 = (-7357 * p)>>16;
  192.   p += (x1 + x2 + 3791)>>4;
  193.  
  194.   return p;
  195. }