forked from CarbonAeronautics/Part-XVII-MeasureAltitude
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathArduinoCode
More file actions
105 lines (103 loc) · 4.6 KB
/
ArduinoCode
File metadata and controls
105 lines (103 loc) · 4.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
The contents of this code and instructions are the intellectual property of Carbon Aeronautics.
The text and figures in this code and instructions are licensed under a Creative Commons Attribution - Noncommercial - ShareAlike 4.0 International Public Licence.
This license lets you remix, adapt, and build upon your work non-commercially, as long as you credit Carbon Aeronautics
(but not in any way that suggests that we endorse you or your use of the work) and license your new creations under the identical terms.
This code and instruction is provided "As Is” without any further warranty. Neither Carbon Aeronautics or the author has any liability to any person or entity
with respect to any loss or damage caused or declared to be caused directly or indirectly by the instructions contained in this code or by
the software and hardware described in it. As Carbon Aeronautics has no control over the use, setup, assembly, modification or misuse of the hardware,
software and information described in this manual, no liability shall be assumed nor accepted for any resulting damage or injury.
By the act of copying, use, setup or assembly, the user accepts all resulting liability.
1.0 5 February 2023 - initial release
*/
#include <Wire.h>
uint16_t dig_T1, dig_P1;
int16_t dig_T2, dig_T3, dig_P2, dig_P3, dig_P4, dig_P5;
int16_t dig_P6, dig_P7, dig_P8, dig_P9;
float AltitudeBarometer, AltitudeBarometerStartUp;
int RateCalibrationNumber;
void barometer_signals(void){
Wire.beginTransmission(0x76);
Wire.write(0xF7);
Wire.endTransmission();
Wire.requestFrom(0x76,6);
uint32_t press_msb = Wire.read();
uint32_t press_lsb = Wire.read();
uint32_t press_xlsb = Wire.read();
uint32_t temp_msb = Wire.read();
uint32_t temp_lsb = Wire.read();
uint32_t temp_xlsb = Wire.read();
unsigned long int adc_P = (press_msb << 12) | (press_lsb << 4) | (press_xlsb >>4);
unsigned long int adc_T = (temp_msb << 12) | (temp_lsb << 4) | (temp_xlsb >>4);
signed long int var1, var2;
var1 = ((((adc_T >> 3) - ((signed long int )dig_T1 <<1)))* ((signed long int )dig_T2)) >> 11;
var2 = (((((adc_T >> 4) - ((signed long int )dig_T1)) * ((adc_T>>4) - ((signed long int )dig_T1)))>> 12) * ((signed long int )dig_T3)) >> 14;
signed long int t_fine = var1 + var2;
unsigned long int p;
var1 = (((signed long int )t_fine)>>1) - (signed long int )64000;
var2 = (((var1>>2) * (var1>>2)) >> 11) * ((signed long int )dig_P6);
var2 = var2 + ((var1*((signed long int )dig_P5)) <<1);
var2 = (var2>>2)+(((signed long int )dig_P4)<<16);
var1 = (((dig_P3 * (((var1>>2)*(var1>>2)) >> 13))>>3)+((((signed long int )dig_P2) * var1)>>1))>>18;
var1 = ((((32768+var1))*((signed long int )dig_P1)) >>15);
if (var1 == 0) { p=0;}
p = (((unsigned long int )(((signed long int ) 1048576)-adc_P)-(var2>>12)))*3125;
if(p<0x80000000){ p = (p << 1) / ((unsigned long int ) var1);}
else { p = (p / (unsigned long int )var1) * 2; }
var1 = (((signed long int )dig_P9) * ((signed long int ) (((p>>3) * (p>>3))>>13)))>>12;
var2 = (((signed long int )(p>>2)) * ((signed long int )dig_P8))>>13;
p = (unsigned long int)((signed long int )p + ((var1 + var2+ dig_P7) >> 4));
double pressure=(double)p/100;
AltitudeBarometer=44330*(1-pow(pressure
/1013.25, 1/5.255))*100;
}
void setup() {
Serial.begin(57600);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
Wire.setClock(400000);
Wire.begin();
delay(250);
Wire.beginTransmission(0x76);
Wire.write(0xF4);
Wire.write(0x57);
Wire.endTransmission();
Wire.beginTransmission(0x76);
Wire.write(0xF5);
Wire.write(0x14);
Wire.endTransmission();
uint8_t data[24], i=0;
Wire.beginTransmission(0x76);
Wire.write(0x88);
Wire.endTransmission();
Wire.requestFrom(0x76,24);
while(Wire.available()){
data[i] = Wire.read();
i++;
}
dig_T1 = (data[1] << 8) | data[0];
dig_T2 = (data[3] << 8) | data[2];
dig_T3 = (data[5] << 8) | data[4];
dig_P1 = (data[7] << 8) | data[6];
dig_P2 = (data[9] << 8) | data[8];
dig_P3 = (data[11]<< 8) | data[10];
dig_P4 = (data[13]<< 8) | data[12];
dig_P5 = (data[15]<< 8) | data[14];
dig_P6 = (data[17]<< 8) | data[16];
dig_P7 = (data[19]<< 8) | data[18];
dig_P8 = (data[21]<< 8) | data[20];
dig_P9 = (data[23]<< 8) | data[22]; delay(250);
for (RateCalibrationNumber=0; RateCalibrationNumber<2000; RateCalibrationNumber ++) {
barometer_signals();
AltitudeBarometerStartUp+=AltitudeBarometer;
delay(1);
}
AltitudeBarometerStartUp/=2000;
}
void loop() {
barometer_signals();
AltitudeBarometer-=AltitudeBarometerStartUp;
Serial.print("Altitude [cm]: ");
Serial.println(AltitudeBarometer);
delay(50);
}