Hi, after googling around I've modified two python scripts to ad BMP to my Bresser 5in1 and Raspberry pi station. Be carful weewx already calcultes mbar pedending on altitude. mixed of these:
http://www.netzmafia.de/skripten/hardware/RasPi/Projekt-BMP280/index.html https://github.com/eyesnz/weewx_pi_sensors [import syslog import weewx import smbus import time from weewx.wxengine import StdService # number of I2C bus BUS = 1 # altitude 260m ALTITUDE =260 BMP280ADDR = 0x76 bus = smbus.SMBus(BUS) # pressure calibration coeff. array P = [0, 0, 0, 0, 0, 0, 0, 0, 0]; # temperature calibration coeff. array T = [0, 0, 0]; class ExtraSensorsService(StdService): def __init__(self, engine, config_dict): super(ExtraSensorsService, self).__init__(engine, config_dict) d = config_dict.get('ExtraSensorsService', {}) # Read from config which pin to use on the RPI GPIO # Defaults to 22 # Use the loop packet event as that allows data to still get into the WeeWX database # as well as supporting a OLED module on the RPI self.bind(weewx.NEW_LOOP_PACKET, self.load_data) def load_data(self, event): try: self.get_bmp280(event) except Exception, e: syslog.syslog(syslog.LOG_ERR, "extrasensors: cannot read value: %s" % e) # Get BMP180 data def get_bmp280(self, event): # pressure calibration coeff. array #P = [0, 0, 0, 0, 0, 0, 0, 0, 0]; # read calibration data from 0x88, 24 bytes data = bus.read_i2c_block_data(BMP280ADDR, 0x88, 24) # temp coefficents temp coefficents T[0] = data[1] * 256 + data[0] T[0] = data[1] * 256 + data[0] T[1] = data[3] * 256 + data[2] if T[1] > 32767: T[1] -= 65536 T[2] = data[5] * 256 + data[4] if T[2] > 32767: T[2] -= 65536 # pressure coefficents data = bus.read_i2c_block_data(BMP280ADDR, 0x88, 24) P[0]=data[7]* 256 + data[6]; for i in range (0, 8): P[i+1] = data[2*i+9]*256 + data[2*i+8]; if P[i+1] > 32767: P[i+1] -= 65536 # select control measurement register, 0xF4 # 0x27: pressure/temperature oversampling rate = 1, normal mode bus.write_byte_data(BMP280ADDR, 0xF4, 0x27) # select configuration register, 0xF5 # 0xA0: standby time = 1000 ms bus.write_byte_data(BMP280ADDR, 0xF5, 0xA0) time.sleep(1.0) # read data from 0xF7, 8 bytes data = bus.read_i2c_block_data(BMP280ADDR, 0xF7, 8) # convert pressure and temperature data to 19 bits adc_p = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4) adc_t = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4) # convert pressure and temperature data to 19 bits adc_p = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4) adc_t = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4) # temperature offset calculations temp1 = ((adc_t)/16384.0 - (T[0])/1024.0)*(T[1]); temp3 = (adc_t)/131072.0 - (T[0])/8192.0; temp2 = temp3*temp3*(T[2]); temperature = (temp1 + temp2)/5120.0 # pressure offset calculations press1 = (temp1 + temp2)/2.0 - 64000.0 press2 = press1*press1*(P[5])/32768.0 press2 = press2 + press1*(P[4])*2.0 press2 = press2/4.0 + (P[3])*65536.0 press1 = ((P[2])*press1*press1/524288.0 + (P[1])*press1)/524288.0 press1 = (1.0 + press1/32768.0)*(P[0]) press3 = 1048576.0 - (adc_p) if press1 != 0: press3 = (press3 - press2/4096.0)*6250.0/press1 press1 = press3*press3*(P[8])/2147483648.0 press2 = press3*(P[7])/32768.0 pressure = (press3 + (press1 + press2 + (P[6]))/16.0)/100 else: pressure = 0 #pressure relative to sea level pressure_nn = pressure/pow(1 - ALTITUDE/44330.0, 5.255) # syslog.syslog("Luftdruck: %s "%pressure) pressure = pressure_nn # syslog.syslog("Luftdruck relativ zur Hoehe: %s" %pressure_nn) syslog.syslog(syslog.LOG_DEBUG, "extrasensors: found pressure value of %s mbar" % pressure) # syslog.syslog('Luftdruck wurde eingelesen') # NOTE: stores as mbar event.packet['pressure'] = float(pressure) ] -- You received this message because you are subscribed to the Google Groups "weewx-user" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/weewx-user/b75b0456-13e7-40b2-aefb-715ed472cbd5n%40googlegroups.com.
