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.

Reply via email to