intégrer capteur BMP280 en I2C

Forum pour tous les autres objets : sondes météo, capteurs, actionneurs ...
Vous avez un besoin mais vous ne savez pas quel matériel choisir ? C'est ici.
Capi
Messages : 11
Inscription : 29 oct. 2016, 00:34

Re: intégrer capteur BMP280 en I2C

Message par Capi »

Bjr,

J'avais bien retiré les # sur les 4 lignes lors des essais.

Après avoir parcouru le net, j'ai modifié le script et il y a un peu de nouveau mais cela ne marche toujours pas:

Code : Tout sélectionner

!/usr/bin/python
#Distributed with a free-will license.
# Use it any way you want, profit or free, provided it fits in the licenses of its associated works.
# BMP280
# This code is designed to work with the BMP280_I2CS I2C Mini Module available from ControlEverything.com.
# https://www.controleverything.com/content/Barometer?sku=BMP280_I2CSs#tabs-0-product_tabset-2


import smbus
import time
import domoticz
import reloader
import datetime
import re


# Get I2C bus
bus = smbus.SMBus(1)

# BMP280 address, 0x76(118)
# Read data back from 0x88(136), 24 bytes
b1 = bus.read_i2c_block_data(0x76, 0x88, 24)

# Convert the data
# Temp coefficents
dig_T1 = b1[1] * 256 + b1[0]
dig_T2 = b1[3] * 256 + b1[2]
if dig_T2 > 32767 :
    dig_T2 -= 65536
dig_T3 = b1[5] * 256 + b1[4]
if dig_T3 > 32767 :
    dig_T3 -= 65536

# Pressure coefficents
dig_P1 = b1[7] * 256 + b1[6]
dig_P2 = b1[9] * 256 + b1[8]
if dig_P2 > 32767 :
    dig_P2 -= 65536
dig_P3 = b1[11] * 256 + b1[10]
if dig_P3 > 32767 :
    dig_P3 -= 65536
dig_P4 = b1[13] * 256 + b1[12]
if dig_P4 > 32767 :
    dig_P4 -= 65536
dig_P5 = b1[15] * 256 + b1[14]
if dig_P5 > 32767 :
    dig_P5 -= 65536
dig_P6 = b1[17] * 256 + b1[16]
if dig_P6 > 32767 :
    dig_P6 -= 65536
dig_P7 = b1[19] * 256 + b1[18]
if dig_P7 > 32767 :
    dig_P7 -= 65536
dig_P8 = b1[21] * 256 + b1[20]
if dig_P8 > 32767 :
    dig_P8 -= 65536
dig_P9 = b1[23] * 256 + b1[22]
if dig_P9 > 32767 :
    dig_P9 -= 65536

# BMP280 address, 0x76(118)
# Select Control measurement register, 0xF4(244)
#               0x27(39)        Pressure and Temperature Oversampling rate = 1
#                                       Normal mode
bus.write_byte_data(0x76, 0xF4, 0x27)
# BMP280 address, 0x76(118)
# Select Configuration register, 0xF5(245)
#               0xA0(00)        Stand_by time = 1000 ms
bus.write_byte_data(0x76, 0xF5, 0xA0)

time.sleep(0.5)

# BMP280 address, 0x76(118)
# Read data back from 0xF7(247), 8 bytes
# Pressure MSB, Pressure LSB, Pressure xLSB, Temperature MSB, Temperature LSB
# Temperature xLSB, Humidity MSB, Humidity LSB
data = bus.read_i2c_block_data(0x76, 0xF7, 8)

# Convert pressure and temperature data to 19-bits
adc_p = ((data[0] * 65536) + (data[1] * 256) + (data[2] & 0xF0)) / 16
adc_t = ((data[3] * 65536) + (data[4] * 256) + (data[5] & 0xF0)) / 16
adc_t = ((data[3] * 65536) + (data[4] * 256) + (data[5] & 0xF0)) / 16

# Temperature offset calculations
var1 = ((adc_t) / 16384.0 - (dig_T1) / 1024.0) * (dig_T2)
var2 = (((adc_t) / 131072.0 - (dig_T1) / 8192.0) * ((adc_t)/131072.0 - (dig_T1)/8192.0)) * (dig_T3)
t_fine = (var1 + var2)
cTemp = (var1 + var2) / 5120.0
fTemp = cTemp * 1.8 + 32

# Pressure offset calculations
var1 = (t_fine / 2.0) - 64000.0
var2 = var1 * var1 * (dig_P6) / 32768.0
var2 = var2 + var1 * (dig_P5) * 2.0
var2 = (var2 / 4.0) + ((dig_P4) * 65536.0)
var1 = ((dig_P3) * var1 * var1 / 524288.0 + ( dig_P2) * var1) / 524288.0
var1 = (1.0 + var1 / 32768.0) * (dig_P1)
p = 1048576.0 - adc_p
p = (p - (var2 / 4096.0)) * 6250.0 / var1
var1 = (dig_P9) * p * p / 2147483648.0
var2 = p * (dig_P8) / 32768.0
pressure = (p + (var1 + var2 + (dig_P7)) / 16.0) / 100

# --------------------------------------------------
# START OF UPLOAD TO DOMOTICZ
# --------------------------------------------------
# Imports for script-operation

#import json
import urllib
from datetime import date

httpresponse = urllib.urlopen("http://192.168.0.51:8080/json.htm?type=command&param=udevice&idx=48&svalue="+ str(pressure) )
httpresponse = urllib.urlopen("http://192.168.0.51:8080/json.htm?type=command&param=udevice&idx=49&svalue="+ str(cTemp) )
print "Temperature en Celsius : %.2f C" %cTemp
print "Pressure :%.2f hPa " %pressure

# --------------------------------------------------
# END OF UPLOAD TO DOMOTICZ
# --------------------------------------------------

# Output data to screen
#print "Temperature en Celsius : %.2f C" %cTemp
#print "Pressure : %.2f hPa " %pressure

#def main():
#
#    c = pycurl.Curl()
#    c.setopt(c.URL, 'http://192.168.0.51:8080/json.htm?type=command&param=udevice&idx=49&svalue='+ str(pressure))
#    c.setopt(c.URL, 'http://192.168.0.51:8080/json.htm?type=command&param=udevice&idx=48&svalue='+ str(cTemp))
#    c.perform()
le capteur idx=48 est de type Barometer
le capteur idx =49 est de type Thermomètre
J'ai fait normalemnt un crontab -e pour exécution du script toutes les 10 minutes

Si j' exécute manuellement le script:
=> les valeurs affichées en console sont correctes
=>il y a rafraichissement du capteur température mais il semble afficher un mélange des 2 valeurs (temp+pression)
[img]file:///home/ob/Bureau/Capture%20d%E2%80%99%C3%A9cran_2017-02-14_00-48-46.png
[/img]
les valeurs étaient t=13.70°C et p=1012.99hPa
=> rien d'affiché dans le capteur Barometer
=> il n'y a pas d'exécution automatique répétée du script

Merci d'avance pour vos conseils.
Capi
Messages : 11
Inscription : 29 oct. 2016, 00:34

Re: intégrer capteur BMP280 en I2C

Message par Capi »

Pas de réponse mais je suis persévérant donc je poste un nouveau message!

Le script fonctionne à priori car les bonnes valeurs apparaissent dans le tableau des Devices:
Image

Mais rien ne s'affiche pour le capteur baromètre:
Image

Et l'arrondi n'est pas bon pour le capteur température:
Image

Si qqu'un a la solution.

Merci
Répondre