class BME280
BME280_ADDRESS = 0x76
def initialize
@osrs_t = 1
@osrs_p = 1
@osrs_h = 1
@mode = 3
@t_sb = 5
@filter = 0 #Filter off
@spi3w_en = 0 #3-wire SPI Disable
@ctrl_meas_reg = (@osrs_t << 5) | (@osrs_p << 2) | @mode
@config_reg = (@t_sb << 5) | (@filter << 2) | @spi3w_en
@ctrl_hum_reg = @osrs_h
Serial.begin(9600)
$wire.begin()
writeReg(0xF2,@ctrl_hum_reg)
writeReg(0xF4,@ctrl_meas_reg)
writeReg(0xF5,@config_reg)
readTrim
end
def readTrim
data = Array.new
i=0
$wire.beginTransmission(self::BME280_ADDRESS)
$wire.write(0x88)
$wire.endTransmission()
$wire.requestFrom(self::BME280_ADDRESS,24)
while $wire.available
data[i] = $wire.read
i += 1
end
$wire.beginTransmission(self::BME280_ADDRESS)
$wire.write(0xA1)
$wire.endTransmission()
$wire.requestFrom(self::BME280_ADDRESS,1)
data[i] = $wire.read
i += 1
$wire.beginTransmission(self::BME280_ADDRESS)
$wire.write(0xE1)
$wire.endTransmission()
$wire.requestFrom(self::BME280_ADDRESS,7)
while $wire.available do
data[i] = $wire.read
i += 1
end
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]
dig_H1 = data[24]
dig_H2 = (data[26]<< 8) | data[25]
dig_H3 = data[27]
dig_H4 = (data[28]<< 4) | (0x0F & data[29])
dig_H5 = (data[30] << 4) | ((data[29] >> 4) & 0x0F)
dig_H6 = data[31]
end
def writeReg(reg_address, data)
$wire.beginTransmission(self::BME280_ADDRESS)
$wire.write(reg_address)
$wire.write(data)
$wire.endTransmission()
end
def readData
i = 0
data = Array.new
$wire.beginTransmission(self::BME280_ADDRESS)
$wire.write(0xF7)
$wire.endTransmission()
$wire.requestFrom(self::BME280_ADDRESS,8)
while $wire.available do
data[i] = $wire.read
i += 1
end
pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
hum_raw = (data[6] << 8) | data[7]
end
def calibration_T(adc_T)
var1 = ((((adc_T >> 3) - (dig_T1<<1))) * (dig_T2)) >> 11
var2 = (((((adc_T >> 4) - (dig_T1)) * ((adc_T>>4) - (dig_T1))) >> 12) * (dig_T3)) >> 14
t_fine = var1 + var2
T = (t_fine * 5 + 128) >> 8
return T
end
def calibration_P(adc_P)
var1 = ((t_fine)>>1) - 64000
var2 = (((var1>>2) * (var1>>2)) >> 11) * (dig_P6)
var2 = var2 + ((var1*(dig_P5))<<1)
var2 = (var2>>2)+((dig_P4)<<16)
var1 = (((dig_P3 * (((var1>>2)*(var1>>2)) >> 13)) >>3) + (((dig_P2) * var1)>>1))>>18
var1 = ((((32768+var1))*(dig_P1))>>15)
if (var1 == 0)
return 0
end
P = ((((1048576)-adc_P)-(var2>>12)))*3125
if(P<0x80000000)
P = (P << 1) / ( var1)
else
P = (P / var1) * 2
end
var1 = ((dig_P9) * ((((P>>3) * (P>>3))>>13)))>>12
var2 = (((P>>2)) * (dig_P8))>>13
P = (P + ((var1 + var2 + dig_P7) >> 4))
return P
end
def calibration_H(adc_H)
v_x1 = (t_fine - (76800))
v_x1 = (((((adc_H << 14) -((dig_H4) << 20) - ((dig_H5) * v_x1)) + (16384)) >> 15) * (((((((v_x1 * (dig_H6)) >> 10) * (((v_x1 * (dig_H3)) >> 11) + ( 32768))) >> 10) + (2097152)) * ( dig_H2) + 8192) >> 14))
v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * (dig_H1)) >> 4))
v_x1 = (v_x1 < 0 ? 0 : v_x1)
v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1)
return (v_x1 >> 12)
end
end
$wire = Wire.new( 0x0, $wire::DutyCycle_2 )
sensor = BME280.new
loop do
temp_cal = sensor.calibration_T(temp_raw)
press_cal = sensor.calibration_P(pres_raw)
hum_cal = sensor.calibration_H(hum_raw)
temp_act = temp_cal / 100.0
press_act = press_cal / 100.0
hum_act = hum_cal / 1024.0
print "TEMP : "
print temp_act
print " DegC PRESS : "
print press_act
print " hPa HUM : "
print hum_act
print " %"
delay(1000)
end