Skip to content

Instantly share code, notes, and snippets.

@satakagi
Last active November 15, 2018 11:44
Show Gist options
  • Save satakagi/71bef8cc77020d96708f51d3532d28ac to your computer and use it in GitHub Desktop.
Save satakagi/71bef8cc77020d96708f51d3532d28ac to your computer and use it in GitHub Desktop.
BMP180 driver for CHIRIMEN
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1">
<title>i2c-BMP180</title>
<script src="../../../polyfill/polyfill.js"></script>
<script src="../../drivers/i2c-BMP180.js"></script>
<script src="./mainBmp.js"></script>
<style>
table,p {
color: blue;
text-align: center;
font-size: 24px;
}
img {
position: absolute;
top: 50px;
right: 0px;
display: block;
margin-left: auto;
margin-right: auto;
}
</style>
</head>
<body>
<p id="head">BMP-180</p>
<img src="schematic.png" width="400"/>
<table>
<tr><td>temperature</td><td id="temp"></td></tr>
<tr><td>pressure</td><td id="pres"></td></tr>
</table>
</body>
</html>
// BMP180 driver for CHIRIMEN WebI2C
// ported from hhttps://qiita.com/uchino-tama/items/efccfe871ab3abc782f3
// by Satoru Takagi
var BMP180 = function(i2cPort,slaveAddress){
this.AC = [];
this.B = [];
this.M = [];
this.t_fine = 0;
this.i2cPort = i2cPort;
this.i2cSlave = null;
if (slaveAddress){
this.slaveAddress = slaveAddress;
} else {
this.slaveAddress = 0x77;
}
console.log("this.slaveAddress:",this.slaveAddress);
};
BMP180.prototype = {
init: async function(){
this.i2cSlave = await this.i2cPort.open(this.slaveAddress);
console.log("init ok:"+this.i2cSlave);
await this.getCalibParam();
},
getSVal: function(val){
if ( val & 0x8000 ){
return (( -val ^ 0xFFFF) + 1);
} else {
return ( val );
}
},
getCalibParam: async function(){
var calib = [];
var dat;
var getSVal = this.getSVal;
console.log("getCalibParam");
for ( var ra = 0xAA ; ra <= 0xAA+21 ; ra++ ){
dat = await this.i2cSlave.read8(ra);
calib.push(dat);
}
var AC = this.AC;
var B = this.B;
var M = this.M;
AC.push(getSVal((calib[0] << 8) | calib[1])); // AC1 AC[0]
AC.push(getSVal((calib[2] << 8) | calib[3])); // AC2
AC.push(getSVal((calib[4] << 8) | calib[5])); // AC3
AC.push((calib[6] << 8) | calib[7]); // uint AC4
AC.push((calib[8] << 8) | calib[9]); // uint AC5
AC.push((calib[10] << 8) | calib[11]); // uint AC6
B.push(getSVal((calib[12] << 8) | calib[13])); // B1 B[0]
B.push(getSVal((calib[14] << 8) | calib[15])); // B2
M.push(getSVal((calib[16] << 8) | calib[17])); // MB M[0]
M.push(getSVal((calib[18] << 8) | calib[19])); // MC
M.push(getSVal((calib[20] << 8) | calib[21])); // MD
console.log(AC,B,M);
},
readAndCalcB5: async function(){
var AC = this.AC;
var B = this.B;
var M = this.M;
await this.i2cSlave.write8(0xF4,0x2E); // read temp.
var dat0 = await this.i2cSlave.read8(0xF6);
var dat1 = await this.i2cSlave.read8(0xF7);
var UT = ((dat0 << 8) | dat1);
var X1 = ((UT - AC[5]) * AC[4]) >> 15;
var X2 = (M[1] << 11) / (X1 + M[2]);
var B5 = X1 + X2;
return ( B5);
},
readTemperature : async function(){
var b5 = await this.readAndCalcB5();
return ((b5 + 8) >> 4) / 10.0;
},
readPressure : async function(){
var AC = this.AC;
var B = this.B;
var M = this.M;
var getSVal = this.getSVal;
var mode = 1; // standard mode 0:ULPW,1:STD,2:HIRES,3:UHIRES
await this.i2cSlave.write8(0xF4,(0x34 + (mode << 6))); // read pressure standard mode
await this.sleep(5+3*mode*mode);
var data = [];
var dat;
for ( var ra = 0xF6 ; ra <= 0xF6+2 ; ra++ ){
dat = await this.i2cSlave.read8(ra);
data.push(dat);
}
console.log("data:",data);
var UP = (( (data[0]<<16 ) | (data[1] << 8 ) | data[2]) >> (8 - mode) ) ;
// Calibration for Pressure
var B6 = await this.readAndCalcB5() - 4000;
var X1 = (B[1] * (B6 * B6) >> 12) >> 11;
var X2 = (AC[1] * B6) >> 11;
var X3 = X1 + X2;
var B3 = (((AC[0] * 4 + X3) << mode) + 2) / 4;
X1 = (AC[2] * B6) >> 13;
X2 = (B[0] * ((B6 * B6) >> 12)) >> 16;
X3 = ((X1 + X2) + 2) >> 2;
var B4 = (AC[3] * (X3 + 32768)) >> 15;
var B7 = (UP - B3) * (50000 >> mode);
var p = B7 < 0x80000000 ? (B7 * 2) / B4 : (B7 / B4) * 2;
X1 = (p >> 8) * (p >> 8);
X1 = (X1 * 3038) >> 16;
X2 = (-7357 * p) >> 16;
p = p + ((X1 + X2 + 3791) >> 4);
return (p / 100.0);
},
sleep: function (ms) {
return new Promise(function(resolve) {
setTimeout(resolve, ms);
});
}
};
"use strict";
var head;
window.addEventListener(
"load",
function() {
head = document.querySelector("#head");
mainFunction();
},
false
);
async function mainFunction() {
try {
var i2cAccess = await navigator.requestI2CAccess();
var port = i2cAccess.ports.get(1);
var bmp180 = new BMP180(port, 0x77);
await bmp180.init();
while (1) {
var temperature = await bmp180.readTemperature();
temp.innerHTML=temperature;
var pressure = await bmp180.readPressure();
pres.innerHTML=pressure;
await sleep(1000);
}
} catch (error) {
console.error("error", error);
}
}
function sleep(ms) {
return new Promise(function(resolve) {
setTimeout(resolve, ms);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment