#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;
}