Posts: 48
Threads: 8
Joined: Jan 2021
Reputation:
2
Would it be possible to do this re-editing of all existing sensors automagically in the post-install script? Just to avoid bug reports... ;-)
Best regards,
Tobias
Posts: 2,836
Threads: 60
Joined: Mar 2016
Reputation:
267
It would but too dirty. I am sure I will forget to remove that
This is not stable yet, just a beta.
Posts: 74
Threads: 6
Joined: Nov 2022
Reputation:
3
2023-01-01, 09:58 PM
(This post was last modified: 2023-01-02, 10:30 PM by DroZDi .)
Just to confirm after installation openplotter from the scratch (openplotter-i2c version 3.3.7):
pi@openplotter:~/work $ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- 38 -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- 77
IMU: ICM-20948 (address 0x68, pypilot 3.2.6, SEN-15335) - detected and working
BMP280 - 0x77 detected and working
AHT20* - 0x38 detected and working
Good job!
*)AHT20 added to I2C sensors by myself
Posts: 21
Threads: 5
Joined: Apr 2022
Reputation:
0
I2C no data in SignalK
Somehow I got a strange problem. I'm running I2C 3.3.12 an installation from scratch. I added BME280. Sensors are detected by I2c. Read/Write access confirmed in SignalK. I2C ID is shown under "connection activity" but I'm getting no data regarding Temp. Hum. or Pressure. In log is no error, just the confirmation that the sensor is detected. Any help is highly appreciated.
If you need any additional information, please let me know. I'm a little desperate ....
Thank you.
Posts: 322
Threads: 10
Joined: Sep 2016
Reputation:
21
My first piece of diagnosis would be to validate that you really do have a BME280 and not a BMP280.
Delete the existing I2C entries and try configuring it as a BMP280 (pressure and temperature only of course) and see if you get any data then.
Posts: 21
Threads: 5
Joined: Apr 2022
Reputation:
0
Thanks for trying to help ... this is what I did first ...
Posts: 322
Threads: 10
Joined: Sep 2016
Reputation:
21
2023-10-21, 02:34 PM
(This post was last modified: 2023-10-21, 02:36 PM by baltika_no_9 .)
Code:
#!/usr/bin/python
#--------------------------------------
# ___ ___ _ ____
# / _ \/ _ \(_) __/__ __ __
# / , _/ ___/ /\ \/ _ \/ // /
# /_/|_/_/ /_/___/ .__/\_, /
# /_/ /___/
#
# bme280.py
# Read data from a digital pressure sensor.
#
# Official datasheet available from :
# https://www.bosch-sensortec.com/bst/products/all_products/bme280
#
# Author : Matt Hawkins
# Date : 21/01/2018
#
# https://www.raspberrypi-spy.co.uk/
#
#--------------------------------------
import smbus
import time
from ctypes import c_short
from ctypes import c_byte
from ctypes import c_ubyte
DEVICE = 0x76 # Default device I2C address
bus = smbus.SMBus(1) # Rev 2 Pi, Pi 2 & Pi 3 uses bus 1
# Rev 1 Pi uses bus 0
def getShort(data, index):
# return two bytes from data as a signed 16-bit value
return c_short((data[index+1] << 8) + data[index]).value
def getUShort(data, index):
# return two bytes from data as an unsigned 16-bit value
return (data[index+1] << 8) + data[index]
def getChar(data,index):
# return one byte from data as a signed char
result = data[index]
if result > 127:
result -= 256
return result
def getUChar(data,index):
# return one byte from data as an unsigned char
result = data[index] & 0xFF
return result
def readBME280ID(addr=DEVICE):
# Chip ID Register Address
REG_ID = 0xD0
(chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2)
return (chip_id, chip_version)
def readBME280All(addr=DEVICE):
# Register Addresses
REG_DATA = 0xF7
REG_CONTROL = 0xF4
REG_CONFIG = 0xF5
REG_CONTROL_HUM = 0xF2
REG_HUM_MSB = 0xFD
REG_HUM_LSB = 0xFE
# Oversample setting - page 27
OVERSAMPLE_TEMP = 2
OVERSAMPLE_PRES = 2
MODE = 1
# Oversample setting for humidity register - page 26
OVERSAMPLE_HUM = 2
bus.write_byte_data(addr, REG_CONTROL_HUM, OVERSAMPLE_HUM)
control = OVERSAMPLE_TEMP<<5 | OVERSAMPLE_PRES<<2 | MODE
bus.write_byte_data(addr, REG_CONTROL, control)
# Read blocks of calibration data from EEPROM
# See Page 22 data sheet
cal1 = bus.read_i2c_block_data(addr, 0x88, 24)
cal2 = bus.read_i2c_block_data(addr, 0xA1, 1)
cal3 = bus.read_i2c_block_data(addr, 0xE1, 7)
# Convert byte data to word values
dig_T1 = getUShort(cal1, 0)
dig_T2 = getShort(cal1, 2)
dig_T3 = getShort(cal1, 4)
dig_P1 = getUShort(cal1, 6)
dig_P2 = getShort(cal1, 8)
dig_P3 = getShort(cal1, 10)
dig_P4 = getShort(cal1, 12)
dig_P5 = getShort(cal1, 14)
dig_P6 = getShort(cal1, 16)
dig_P7 = getShort(cal1, 18)
dig_P8 = getShort(cal1, 20)
dig_P9 = getShort(cal1, 22)
dig_H1 = getUChar(cal2, 0)
dig_H2 = getShort(cal3, 0)
dig_H3 = getUChar(cal3, 2)
dig_H4 = getChar(cal3, 3)
dig_H4 = (dig_H4 << 24) >> 20
dig_H4 = dig_H4 | (getChar(cal3, 4) & 0x0F)
dig_H5 = getChar(cal3, 5)
dig_H5 = (dig_H5 << 24) >> 20
dig_H5 = dig_H5 | (getUChar(cal3, 4) >> 4 & 0x0F)
dig_H6 = getChar(cal3, 6)
# Wait in ms (Datasheet Appendix B: Measurement time and current calculation)
wait_time = 1.25 + (2.3 * OVERSAMPLE_TEMP) + ((2.3 * OVERSAMPLE_PRES) + 0.575) + ((2.3 * OVERSAMPLE_HUM)+0.575)
time.sleep(wait_time/1000) # Wait the required time
# Read temperature/pressure/humidity
data = bus.read_i2c_block_data(addr, REG_DATA, 8)
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]
#Refine temperature
var1 = ((((temp_raw>>3)-(dig_T1<<1)))*(dig_T2)) >> 11
var2 = (((((temp_raw>>4) - (dig_T1)) * ((temp_raw>>4) - (dig_T1))) >> 12) * (dig_T3)) >> 14
t_fine = var1+var2
temperature = float(((t_fine * 5) + 128) >> 8);
# Refine pressure and adjust for temperature
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
if var1 == 0:
pressure=0
else:
pressure = 1048576.0 - pres_raw
pressure = ((pressure - var2 / 4096.0) * 6250.0) / var1
var1 = dig_P9 * pressure * pressure / 2147483648.0
var2 = pressure * dig_P8 / 32768.0
pressure = pressure + (var1 + var2 + dig_P7) / 16.0
# Refine humidity
humidity = t_fine - 76800.0
humidity = (hum_raw - (dig_H4 * 64.0 + dig_H5 / 16384.0 * humidity)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * humidity * (1.0 + dig_H3 / 67108864.0 * humidity)))
humidity = humidity * (1.0 - dig_H1 * humidity / 524288.0)
if humidity > 100:
humidity = 100
elif humidity < 0:
humidity = 0
return temperature/100.0,pressure/100.0,humidity
def main():
(chip_id, chip_version) = readBME280ID()
print("Chip ID :"), chip_id
print("Version :"), chip_version
temperature,pressure,humidity = readBME280All()
print("Temperature : ", temperature, "C")
print("Pressure : ", pressure, "hPa")
print("Humidity : ", humidity, "%")
if __name__=="__main__":
main()
Mmmm OK, that's a pity, sorry.
Have you tried testing the device with one of the many Python scripts available on the web to ensure that the sensor is working?
The attached one should work but you need to change the DEVICE address on line 27 to 0x77.
Good luck
Posts: 21
Threads: 5
Joined: Apr 2022
Reputation:
0
Yes, the sensor is working. Because when I'm installing this signalk addon all data are shown and changing accordingly.
https://github.com/jncarter123/signalk-r...-pi-bme280
Posts: 322
Threads: 10
Joined: Sep 2016
Reputation:
21
2023-10-21, 04:31 PM
(This post was last modified: 2023-10-21, 04:36 PM by baltika_no_9 .)
Then I am puzzling to understand what your problem is. I configure my BME280 in I2C and can see the data in signalk without the signalk app you refer to.
Attached Files
Image(s)
Posts: 21
Threads: 5
Joined: Apr 2022
Reputation:
0
2023-10-21, 04:34 PM
(This post was last modified: 2023-10-21, 04:36 PM by ojessie .)
Perhaps a stupid question ... as version 3.xx is using Websocket as communication, do I have to add a websocket manually in SignalK?
(2023-10-21, 01:56 PM) baltika_no_9 Wrote: My first piece of diagnosis would be to validate that you really do have a BME280 and not a BMP280.
Delete the existing I2C entries and try configuring it as a BMP280 (pressure and temperature only of course) and see if you get any data then.
(2023-10-21, 04:31 PM) baltika_no_9 Wrote: Then I am puzzling to understand what your problem is. I configure my BME280 in I2C and can see the data in signalk without the signalk app you refer to.
yes, it worked exactly this way in my previous 32Bit 2.x installation.