Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Wire.h>
- // nastaví adresu pro senzor tlaku
- #define ADR 0x77
- // inicializace proměných
- short ac1 = 0;
- short ac2 = 0;
- short ac3 = 0;
- short b1 = 0;
- short b2 = 0;
- short mb = 0;
- short mc = 0;
- short md = 0;
- unsigned short ac6, ac4, ac5;
- long UT, b5;
- // nastavení přesnosti čidla OSS
- // 0 až 3 (0 nejmenší)
- byte OSS = 3;
- void setup()
- {
- Serial.begin(9600);
- Wire.begin();
- //získání kalibračních hodnot ze senzoru
- ac1 = GetShort(0xAA, 0xAB);
- ac2 = GetShort(0xAC, 0xAD);
- ac3 = GetShort(0xAE, 0xAF);
- ac4 = GetShort(0xB0, 0xB1);
- ac5 = GetShort(0xB2, 0xB3);
- ac6 = GetShort(0xB4, 0xB5);
- b1 = GetShort(0xB6, 0xB7);
- b2 = GetShort(0xB8, 0xB9);
- mb = GetShort(0xBA, 0xBB);
- mc = GetShort(0xBC, 0xBD);
- md = GetShort(0xBE, 0xBF);
- }
- void loop()
- {
- UT = GetUT();
- short teplota = GetTemperature(UT);
- Serial.print("Teplota: ");
- Serial.print((float)teplota/10);
- Serial.println(" st.C");
- long tlak = GetPressure(ReadUP());
- Serial.print("Tlak: ");
- Serial.print((float)tlak/100);
- Serial.println(" hPa");
- // výpočet nadmořské výšky
- // za p0 si dosaďte sou hodnotu pro tlak ve vaší
- // oblasti přepočtený na hladinu moře v Pa
- long p0 = 100400;
- float vyska = (float)44330 * (1 - pow(((float) tlak/p0), 0.190295));
- Serial.print("Nadm. vyska: ");
- Serial.print((float)vyska);
- Serial.println(" m");
- // obnovovat budeme každých 5 vteřin
- delay (5000);
- // jeden řádek mezi daty vynecháme
- Serial.println();
- }
- //funkce pro získání kalibračních hodnot
- short GetShort(byte adr1, byte adr2)
- {
- byte b1, b2;
- Wire.beginTransmission(ADR);
- Wire.write(adr1);
- Wire.endTransmission();
- Wire.requestFrom(ADR,1);
- if (Wire.available()) b1 = Wire.read();
- Wire.beginTransmission(ADR);
- Wire.write(byte(adr2));
- Wire.endTransmission();
- Wire.requestFrom(ADR,1);
- if (Wire.available()) b2 = Wire.read();
- short r = b2 + (unsigned short)(b1 << 8);
- return r;
- }
- // získá nekompenzovanou hodnotu teploty
- long GetUT()
- {
- byte b1, b2, b3;
- Wire.beginTransmission(ADR);
- Wire.write(0xF4);
- Wire.write(0x2E);
- Wire.endTransmission();
- delay(5);
- Wire.beginTransmission(ADR);
- Wire.write(0xF6);
- Wire.endTransmission();
- Wire.requestFrom(ADR,1);
- if (Wire.available()) b1 = Wire.read();
- Wire.beginTransmission(ADR);
- Wire.write(0xF7);
- Wire.endTransmission();
- Wire.requestFrom(ADR,1);
- if (Wire.available()) b2 = Wire.read();
- long ut = ((long)b1<<8) + b2;
- return ut;
- }
- // získá nekompenzovanou hodnotu tlaku
- unsigned long ReadUP()
- {
- unsigned char msb, lsb, xlsb;
- unsigned long up = 0;
- Wire.beginTransmission(ADR);
- Wire.write(0xF4);
- Wire.write(0x34 + (OSS<<6));
- Wire.endTransmission();
- // čekání na konverzi podle nastavené přesnosti
- delay(2 + (3<<OSS));
- Wire.beginTransmission(ADR);
- Wire.write(0xF6);
- Wire.endTransmission();
- Wire.requestFrom(ADR, 3);
- // přečte tři bajty
- while(Wire.available() < 3)
- ;
- msb = Wire.read();
- lsb = Wire.read();
- xlsb = Wire.read();
- // a poté z nich složí hodnotu
- up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
- return up;
- }
- // funkce pro získání teploty z UT
- short GetTemperature(unsigned int ut)
- {
- long x1, x2;
- x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
- x2 = ((long)mc << 11)/(x1 + md);
- b5 = x1 + x2;
- return ((b5 + 8)>>4);
- }
- // funkce pro výpočet tlaku
- long GetPressure(unsigned long up)
- {
- long x1, x2, x3, b3, b6, p;
- unsigned long b4, b7;
- b6 = b5 - 4000;
- // Calculate B3
- x1 = (b2 * (b6 * b6)>>12)>>11;
- x2 = (ac2 * b6)>>11;
- x3 = x1 + x2;
- b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
- // Calculate B4
- x1 = (ac3 * b6)>>13;
- x2 = (b1 * ((b6 * b6)>>12))>>16;
- x3 = ((x1 + x2) + 2)>>2;
- b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
- b7 = ((unsigned long)(up - b3) * (50000>>OSS));
- if (b7 < 0x80000000)
- p = (b7<<1)/b4;
- else
- p = (b7/b4)<<1;
- x1 = (p>>8) * (p>>8);
- x1 = (x1 * 3038)>>16;
- x2 = (-7357 * p)>>16;
- p += (x1 + x2 + 3791)>>4;
- return p;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement