전자 공작 > 기압계 도착 > MPL115A2(I2C 접속)/유니버설 기판 실장
htp // 아키즈키덴시. 코 m/타타 g/g/기-04596/
관련 h tp : // 쿠이타. m / 7, f9 / ms / 02433dfc, 8c840b878f
자료
DataSheet
【기무차 공방 차고 하우스】 : 이전 모듈 정보?
회로
AQM0802 접속에 사용한 유니버설 기판을 유용.
ぃ tp // m / 7, f9 / ms / bf5, 653d1925cb38569
다음과 같이 연결했다.
SDA와 SCL은 4.7k로 풀업과 데이터 시트에 있지만, 이번은 기판의 유용으로 10k 풀업으로 동작.
회로도 @ upverter
브레드 보드로 구현.
황색: SCL
황색과 교차하는 오렌지: SDA
녹색: GND
빨간색: VCC
코드 v0.1
【기무차 공방 차고 하우스】
의 코드를 참고로 데이터 시트를 보면서 변경했다.
평균화 처리는 미실장.
esp8266_160528_MPL115A2.ino
#include <Wire.h>
/*
* v0.1 2016 May 28
* - add PrintPressure()
* - add ReadPressureAndTemperature()
* - add ReadCofficient()
*/
#define MPL_ADDR (0x60)
static float s_a0, s_b1, s_b2, s_c12; // 係数データ
unsigned long iPress, iTemp;
void setup() {
Serial.begin(115200);
Serial.println("");
Wire.begin();
delay(3000); // msec
ReadCoefficient();
}
bool ReadCoefficient()
{
int len;
unsigned int hi, lw;
Wire.beginTransmission(MPL_ADDR);
Wire.write(0x04);
len = Wire.endTransmission();
if (len == 0) {
len = Wire.requestFrom(MPL_ADDR, 8);
if (len == 8) {
hi = Wire.read();
lw = Wire.read();
s_a0 = (hi << 5) + (lw >> 3) + (lw & 0x07) / 8.0;
hi = Wire.read();
lw = Wire.read();
s_b1 = ( hi & 0x1F) * 0x100 + lw;
s_b1 = s_b1 / 8192.0 - 3.0;
hi = Wire.read();
lw = Wire.read();
s_b2 = (hi & 0x80) << 8 + lw;
s_b2 = s_b2 / 16384.0 - 2.0;
hi = Wire.read();
lw = Wire.read();
s_c12 = (hi * 0x100) + lw;
s_c12 = s_c12 / 16777216.0;
Serial.println(s_a0);
Serial.println(s_b1);
Serial.println(s_b2);
Serial.println(s_c12);
return true;
}
}
return false;
}
bool ReadPressureAndTemperature()
{
int len;
unsigned int hi, lw;
// 1. start conversion
Wire.beginTransmission(MPL_ADDR);
Wire.write(0x12);
Wire.write(0x01);
len = Wire.endTransmission();
if (len != 0) return false;
delay(3); // msec
// 2. get values
Wire.beginTransmission(MPL_ADDR);
Wire.write(0x00);
len = Wire.endTransmission();
if (len == 0) {
len = Wire.requestFrom(MPL_ADDR, 4);
if (len == 4) {
hi = Wire.read();
lw = Wire.read();
iPress = (hi * 256 + lw) / 64;
hi = Wire.read();
lw = Wire.read();
iTemp = ( hi * 256 + lw) / 64;
return true;
}
}
return false;
}
void PrintPressure()
{
float prs, f0;
f0 = s_a0 + ( s_b1 + s_c12 * iTemp) * iPress + s_b2 * iTemp;
prs = f0 * ( (115.0 - 50.0) / 1023.0 ) + 50.0;
Serial.print("Pressure=");
Serial.println(prs);
}
void loop() {
if (ReadPressureAndTemperature()) {
PrintPressure();
}
delay(1000); // msec
}
결과 (v0.1) > 계수 실수
4개의 계수와 압력(kPa).
맞는지는 미확인. 우선 통신은 되어 있다는 정도.
계수의 계산식에 대해서는 요 확인.
1905.00
-2.24
-2.00
0.00
Pressure=66.94
Pressure=66.83
Pressure=66.72
Pressure=66.83
Pressure=66.94
Pressure=66.72
Pressure=66.94
Pressure=66.94
Pressure=66.95
Pressure=66.71
코드 v0.2
계수가 아무래도 이상한 것 같았다.
이하, 계수의 계산이 상세하다.
ht tp // 스피나. 여기 g-에 fty. 이 m/b㎉g/2014/09/피시 2c--mpl115. HTML
esp8266_160528_MPL115A2.ino
#include <Wire.h>
/*
* v0.2 2016 May 29
* - fix bug > coefficients calculation
* v0.1 2016 May 28
* - add PrintPressure()
* - add ReadPressureAndTemperature()
* - add ReadCoefficient()
*/
#define MPL_ADDR (0x60)
static float s_a0, s_b1, s_b2, s_c12; // 係数データ
unsigned long iPress, iTemp;
void setup() {
Serial.begin(115200);
Serial.println("");
Wire.begin();
delay(3000); // msec
ReadCoefficient();
}
bool ReadCoefficient()
{
int len;
unsigned int hi, lw;
Wire.beginTransmission(MPL_ADDR);
Wire.write(0x04);
len = Wire.endTransmission();
if (len == 0) {
len = Wire.requestFrom(MPL_ADDR, 8);
if (len == 8) {
hi = Wire.read();
lw = Wire.read();
s_a0 = (hi << 8) + lw;
s_a0 /= 8.0;
if (hi & 0x80) s_a0 -= 8192.0;
hi = Wire.read();
lw = Wire.read();
s_b1 = (hi << 8) + lw;
s_b1 /= 8192.0;
if (hi & 0x80) s_b1 -= 8.0;
hi = Wire.read();
lw = Wire.read();
s_b2 = (hi << 8) + lw;
s_b2 /= 16384.0;
if (hi & 0x80) s_b2 -= 4.0;
hi = Wire.read();
lw = Wire.read();
s_c12 = (hi << 8) + lw;
s_c12 /= 32768.0;
if (hi & 0x80) s_c12 -= 2.0;
s_c12 /= 512.0;
Serial.println(s_a0);
Serial.println(s_b1);
Serial.println(s_b2);
Serial.println(s_c12);
return true;
}
}
return false;
}
bool ReadPressureAndTemperature()
{
int len;
unsigned int hi, lw;
// 1. start conversion
Wire.beginTransmission(MPL_ADDR);
Wire.write(0x12);
Wire.write(0x01);
len = Wire.endTransmission();
if (len != 0) return false;
delay(3); // msec
// 2. get values
Wire.beginTransmission(MPL_ADDR);
Wire.write(0x00);
len = Wire.endTransmission();
if (len == 0) {
len = Wire.requestFrom(MPL_ADDR, 4);
if (len == 4) {
hi = Wire.read();
lw = Wire.read();
iPress = (hi * 256 + lw) / 64;
hi = Wire.read();
lw = Wire.read();
iTemp = ( hi * 256 + lw) / 64;
return true;
}
}
return false;
}
void PrintPressure()
{
float prs, f0;
f0 = s_a0 + ( s_b1 + s_c12 * iTemp) * iPress + s_b2 * iTemp;
prs = f0 * ( (115.0 - 50.0) / 1023.0 ) + 50.0;
Serial.print("Pressure=");
Serial.println(prs);
}
void loop() {
if (ReadPressureAndTemperature()) {
PrintPressure();
}
delay(1000); // msec
}
결과(v0.2)
결과
1905.00
-2.24
-0.94
0.00
Pressure=100.48
Pressure=100.68
Pressure=100.60
Pressure=100.48
Pressure=100.60
Pressure=100.40
Pressure=100.60
기압은 100.48kPa = 1004.8hPa.
대체로 잘 듣는 기압(1013hPa)의 오더가 되었다.
계수의 네 번째는 표시 자리수가 소수 2 자리수가 되어 버리고 있다.
직렬 출력을 계속하면 중간에 출력이 멈 춥니 다. 코드가 나쁜지 기판, 전지가 나쁜지 요조사.
범용 기판 실장
범용 기판 실장.
왼쪽은 microSD로 보존하기 위한 기판.
오른쪽이 기압계를 실장한 기판.
각각, XHP 커넥터로부터 전원 공급할 수 있지만, 옥외 사용을 위해서 CR-123A를 직삽할 수 있도록 했다.
기압계의 풀업 저항은 4.7k로 하고 있다.
Reference
이 문제에 관하여(전자 공작 > 기압계 도착 > MPL115A2(I2C 접속)/유니버설 기판 실장), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/7of9/items/09272fcfb56bd479c679텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)