8000 Sat Feb 4 10:22:20 CST 2017 · programmer131/esp32-snippets@d11d8a5 · GitHub
[go: up one dir, main page]

Skip to content

Commit d11d8a5

Browse files
author
kolban
committed
Sat Feb 4 10:22:20 CST 2017
1 parent 70e0e5d commit d11d8a5

File tree

1 file changed

+216
-0
lines changed
  • hardware/temperature and pressure

1 file changed

+216
-0
lines changed
Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
#include <driver/i2c.h>
2+
#include <esp_log.h>
3+
#include <freertos/FreeRTOS.h>
4+
#include <freertos/task.h>
5+
#include "sdkconfig.h"
6+
7+
#define BMP180_ADDRESS 0x77
8+
9+
enum
10+
{
11+
BMP085_REGISTER_CAL_AC1 = 0xAA, // R Calibration data (16 bits)
12+
BMP085_REGISTER_CAL_AC2 = 0xAC, // R Calibration data (16 bits)
13+
BMP085_REGISTER_CAL_AC3 = 0xAE, // R Calibration data (16 bits)
14+
BMP085_REGISTER_CAL_AC4 = 0xB0, // R Calibration data (16 bits)
15+
BMP085_REGISTER_CAL_AC5 = 0xB2, // R Calibration data (16 bits)
16+
BMP085_REGISTER_CAL_AC6 = 0xB4, // R Calibration data (16 bits)
17+
BMP085_REGISTER_CAL_B1 = 0xB6, // R Calibration data (16 bits)
18+
BMP085_REGISTER_CAL_B2 = 0xB8, // R Calibration data (16 bits)
19+
BMP085_REGISTER_CAL_MB = 0xBA, // R Calibration data (16 bits)
20+
BMP085_REGISTER_CAL_MC = 0xBC, // R Calibration data (16 bits)
21+
BMP085_REGISTER_CAL_MD = 0xBE, // R Calibration data (16 bits)
22+
BMP085_REGISTER_CHIPID = 0xD0,
23+
BMP085_REGISTER_VERSION = 0xD1,
24+
BMP085_REGISTER_SOFTRESET = 0xE0,
25+
BMP085_REGISTER_CONTROL = 0xF4,
26+
BMP085_REGISTER_TEMPDATA = 0xF6,
27+
BMP085_REGISTER_PRESSUREDATA = 0xF6,
28+
BMP085_REGISTER_READTEMPCMD = 0x2E,
29+
BMP085_REGISTER_READPRESSURECMD = 0x34 // 0011 0100
30+
};
31+
typedef enum
32+
{
33+
BMP085_MODE_ULTRALOWPOWER = 0,
34+
BMP085_MODE_STANDARD = 1,
35+
BMP085_MODE_HIGHRES = 2,
36+
BMP085_MODE_ULTRAHIGHRES = 3
37+
} bmp085_mode_t;
38+
39+
static char tag[] = "bmp180";
40+
41+
static short readRegister16(uint8_t reg) {
42+
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
43+
i2c_master_start(cmd);
44+
i2c_master_write_byte(cmd, (BMP180_ADDRESS << 1) | I2C_MASTER_WRITE, 1 /* expect ack */);
45+
i2c_master_write_byte(cmd, reg, 1);
46+
i2c_master_stop(cmd);
47+
i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS);
48+
i2c_cmd_link_delete(cmd);
49+
50+
uint8_t msb;
51+
uint8_t lsb;
52+
cmd = i2c_cmd_link_create();
53+
i2c_master_start(cmd);
54+
i2c_master_write_byte(cmd, (BMP180_ADDRESS << 1) | I2C_MASTER_READ, 1 /* expect ack */);
55+
i2c_master_read_byte(cmd, &msb, 1);
56+
i2c_master_read_byte(cmd, &lsb, 0);
57+
i2c_master_stop(cmd);
58+
i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS);
59+
i2c_cmd_link_delete(cmd);
60+
short ret = (short)((msb << 8) | lsb);
61+
return ret;
62+
}
63+
64+
static int readRegister24(uint8_t reg) {
65+
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
66+
i2c_master_start(cmd);
67+
i2c_master_write_byte(cmd, (BMP180_ADDRESS << 1) | I2C_MASTER_WRITE, 1 /* expect ack */);
68+
i2c_master_write_byte(cmd, reg, 1);
69+
i2c_master_stop(cmd);
70+
i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS);
71+
i2c_cmd_link_delete(cmd);
72+
73+
uint8_t msb;
74+
uint8_t lsb;
75+
uint8_t xlsb;
76+
cmd = i2c_cmd_link_create();
77+
i2c_master_start(cmd);
78+
i2c_master_write_byte(cmd, (BMP180_ADDRESS << 1) | I2C_MASTER_READ, 1 /* expect ack */);
79+
i2c_master_read_byte(cmd, &msb, 1);
80+
i2c_master_read_byte(cmd, &lsb, 1);
81+
i2c_master_read_byte(cmd, &xlsb, 0);
82+
i2c_master_stop(cmd);
83+
i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS);
84+
i2c_cmd_link_delete(cmd);
85+
int ret = (int)((msb << 16) | (lsb << 8) | xlsb);
86+
return ret;
87+
}
88+
89+
static uint32_t readUncompensatedTemp() {
90+
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
91+
i2c_master_start(cmd);
92+
i2c_master_write_byte(cmd, (BMP180_ADDRESS << 1) | I2C_MASTER_WRITE, 1 /* expect ack */);
93+
i2c_master_write_byte(cmd, BMP085_REGISTER_CONTROL, 1);
94+
i2c_master_write_byte(cmd, BMP085_REGISTER_READTEMPCMD, 1);
95+
i2c_master_stop(cmd);
96+
i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS);
97+
i2c_cmd_link_delete(cmd);
98+
vTaskDelay(5/portTICK_PERIOD_MS);
99+
long ret = (unsigned short)readRegister16(BMP085_REGISTER_TEMPDATA);
100+
return ret;
101+
}
102+
103+
static uint32_t readUncompensatedPressure(uint32_t mode) {
104+
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
105+
i2c_master_start(cmd);
106+
i2c_master_write_byte(cmd, (BMP180_ADDRESS << 1) | I2C_MASTER_WRITE, 1 /* expect ack */);
107+
i2c_master_write_byte(cmd, BMP085_REGISTER_CONTROL, 1);
108+
i2c_master_write_byte(cmd, BMP085_REGISTER_READPRESSURECMD + (mode << 6), 1);
109+
i2c_master_stop(cmd);
110+
i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS);
111+
i2c_cmd_link_delete(cmd);
112+
switch(mode) {
113+
case BMP085_MODE_ULTRALOWPOWER:
114+
vTaskDelay(5/portTICK_PERIOD_MS);
115+
break;
116+
case BMP085_MODE_STANDARD:
117+
vTaskDelay(8/portTICK_PERIOD_MS);
118+
break;
119+
case BMP085_MODE_HIGHRES:
120+
vTaskDelay(14/portTICK_PERIOD_MS);
121+
break;
122+
case BMP085_MODE_ULTRAHIGHRES:
123+
default:
124+
vTaskDelay(26/portTICK_PERIOD_MS);
125+
break;
126+
}
127+
long ret;
128+
if (mode != BMP085_MODE_ULTRAHIGHRES) {
129+
ret = readRegister24(BMP085_REGISTER_PRESSUREDATA);
130+
} else {
131+
ret = readRegister24(BMP085_REGISTER_PRESSUREDATA);
132+
}
133+
return ret >> (8-mode);
134+
}
135+
136+
double centigrade_to_fahrenheit(double centigrade) {
137+
return centigrade * 9 / 5 + 32.0;
138+
}
139+
140+
double pascals_to_inHg(double pressure) {
141+
return pressure * 0.00029530;
142+
}
143+
144+
void x() {
145+
146+
147+
short AC1 = readRegister16(BMP085_REGISTER_CAL_AC1);
148+
short AC2 = readRegister16(BMP085_REGISTER_CAL_AC2);
149+
short AC3 = readRegister16(BMP085_REGISTER_CAL_AC3);
150+
unsigned short AC4 = readRegister16(BMP085_REGISTER_CAL_AC4);
151+
unsigned short AC5 = readRegister16(BMP085_REGISTER_CAL_AC5);
152+
unsigned short AC6 = readRegister16(BMP085_REGISTER_CAL_AC6);
153+
short B1 = readRegister16(BMP085_REGISTER_CAL_B1);
154+
short B2 = readRegister16(BMP085_REGISTER_CAL_B2);
155+
// short MB = readRegister16(BMP085_REGISTER_CAL_MB);
156+
short MC = readRegister16(BMP085_REGISTER_CAL_MC);
157+
short MD = readRegister16(BMP085_REGISTER_CAL_MD);
158+
159+
160+
//ESP_LOGD(tag, "Params: AC1: %d, AC2: %d, AC3: %d, AC4:%d, AC5: %d, AC6: %d, B1: %d, B2: %d, MB: %d, MC: %d, MD: %d",
161+
// AC1, AC2, AC3, AC4, AC5, AC6, B1, B2, MB, MC, MD);
162+
163+
164+
int32_t bmpMode = BMP085_MODE_STANDARD;
165+
int32_t UT = readUncompensatedTemp();
166+
int32_t UP = readUncompensatedPressure(bmpMode);
167+
168+
int32_t X1 = (UT - (int32_t)AC6) * ((int32_t)AC5) >> 15;
169+
int32_t X2 = ((int32_t)MC<<11) / (X1+(int32_t)MD);
170+
int32_t B5 = X1 + X2;
171+
double temp = ((B5 + 8)>>4)/10.0;
172+
173+
ESP_LOGD(tag, "Temp = %.1foC = %.1foF", temp, centigrade_to_fahrenheit(temp));
174+
175+
int32_t B6 = B5 - 4000;
176+
X1 = (B2 * (B6 * B6) >> 12) >> 11;
177+
X2 = (AC2 * B6) >> 11;
178+
int32_t X3 = X1 + X2;
179+
int32_t B3 = (((((int32_t)AC1)*4 + X3) << bmpMode) + 2) >> 2;
180+
X1 = (AC3 * B6) >> 13;
181+
X2 = (B1 * ((B6 * B6) >> 12)) >> 16;
182+
X3 = ((X1 + X2) + 2) >> 2;
183+
uint32_t B4 = ((uint32_t)AC4 * (uint32_t)(X3 + 32768)) >> 15;
184+
uint32_t B7 = ((((uint32_t)UP) - B3) * (50000 >> bmpMode));
185+
int32_t P;
186+
if (B7 < 0x80000000) {
187+
P = (B7 << 1) / B4;
188+
} else {
189+
P = (B7 / B4) << 1;
190+
}
191+
X1 = (P >> 8) * (P >> 8);
192+
X1 = (X1 * 3038) >> 16;
193+
X2 = (-7357 * P) >> 16;
194+
int32_t pressure = P + ((X1 + X2 + 3791) >> 4);
195+
ESP_LOGD(tag, "pressure = %d pa, = %f inHg, UP=%d", pressure, pascals_to_inHg(pressure), UP);
196+
}
197+
198+
199+
200+
void task_bmp180(void *ignore) {
201+
i2c_config_t conf;
202+
conf.mode = I2C_MODE_MASTER;
203+
conf.sda_io_num = 18;
204+
conf.scl_io_num = 19;
205+
conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
206+
conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
207+
conf.master.clk_speed = 100000;
208+
i2c_param_config(I2C_NUM_0, &conf);
209+
210+
i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0);
211+
while(1) {
212+
x();
213+
vTaskDelay(1000/portTICK_PERIOD_MS);
214+
}
215+
vTaskDelete(NULL);
216+
}

0 commit comments

Comments
 (0)
0