如何使用python I2C TCA9548A读取多路复用器

2024-10-01 22:42:55 发布

您现在位置:Python中文网/ 问答频道 /正文

基于以下链接: https://forums.adafruit.com/viewtopic.php?f=19&t=83918&p=541562&hilit=TCA9548A#p541562https://github.com/kizniche/Mycodo/issues/43#issuecomment-156718451

我创建了以下项目:

多路复用器

#!/usr/bin/python

# Change channel of TCA9548A
# Example: sudo ./multiplexer_channel.py 0

import smbus
import time
import sys

I2C_address = 0x77
I2C_bus_number = 1
I2C_ch_0 = 0b00000001
I2C_ch_1 = 0b00000010
I2C_ch_2 = 0b00000100
I2C_ch_3 = 0b00001000
I2C_ch_4 = 0b00010000
I2C_ch_5 = 0b00100000
I2C_ch_6 = 0b01000000
I2C_ch_7 = 0b10000000

def I2C_setup(i2c_channel_setup):
    bus = smbus.SMBus(I2C_bus_number)
    bus.write_byte(I2C_address,i2c_channel_setup)
    time.sleep(0.1)
    print "TCA9548A I2C channel status:", bin(bus.read_byte(I2C_address))

I2C_setup(int(sys.argv[1]))

及 index2.py

from tentacle_pi.BMP180 import BMP180
import time
bmp = BMP180(0x70,"/dev/i2c-1")


for x in range(0,1005):
        print "temperature: %s" % bmp.temperature()
        print "pressure: %s" % bmp.pressure()
        print "altitude: %s" % bmp.altitude()
        print
        time.sleep(2)

如果我使用参数0到7(多路复用器端口)执行第一个文件,我总是会得到一个连接超时

请注意,我使用的是覆盆子皮3和一切都是连接

如果我执行第二个文件,我会得到读数,但它们总是有误导性(固定读数),顺便说一句,如果我有许多传感器(BMP180),我认为第二个文件将无法工作

编辑1: 1.当我们尝试i2cy时,我们一无所获。 2.我们找到了另一个Pythong程序与多路复用器一起工作

# coding=utf-8

import argparse
import smbus
import time


class TCA9548A(object):
    def __init__(self, bus, address=0x70, ):
        self.i2c_address = address
        self.i2c_bus = bus
        self.bus = smbus.SMBus(self.i2c_bus)

    def setup(self, channel):
        try:
            self.bus.write_byte(self.i2c_address, channel)
            return 1, "Success"
        except Exception as msg:
            return 0, "Fail: {}".format(msg)

    def read(self):
        time.sleep(0.1)
        return self.bus.read_byte(self.i2c_address)


def menu():
    parser = argparse.ArgumentParser(description='Select I2C address and channel of TCA9548A I2C multiplexer')
    parser.add_argument('-a', '--address', metavar='ADDRESS', type=int,
                        help='I2C address of the multiplexer, only last two digits, (ex. enter "70" if 0x70)',
                        required=True)
    parser.add_argument('-b', '--bus', metavar='BUS', type=int,
                        help='I2C bus of the multiplexer',
                        required=True)
    group = parser.add_mutually_exclusive_group()
    group.add_argument('-c', '--channel', metavar='CHANNEL', type=int,
                       help='Channel to be activated with the multiplexer')
    group.add_argument('-r', '--read', action='store_true',
                       help='Only read multiplexer and return channel number')

    args = parser.parse_args()

    i2c_address = int(str(args.address), 16)
    multiplexer = TCA9548A(args.bus, i2c_address)
    if args.channel:
        multiplexer.setup(args.channel)
    read_response = multiplexer.read()
    print("TCA9548A I2C channel status: {} (channel {})".format(bin(read_response), read_response))


if __name__ == "__main__":
    menu()

当我们尝试这样执行时:

sudo python index3py -a 70 -b 1

我们还得到一个连接超时

我开始相信,也许我们有一些错误的联系

我们使用了adafruit布线样本

编辑2:带着照片来

enter image description here

enter image description here

enter image description here

编辑3: 我重新启动了PI,现在我可以看到77地址上的i2c

然而,我得到了误导性的结果,我用相同的程序(index2.py)尝试了所有7个频道,将70改为77。我的体温总是很低,这毫无意义

pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index3.py -a 77 -b 1 -c 0
TCA9548A I2C channel status: 0b11111000 (channel 248)
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index2.py
temperature: -125.599998474
pressure: 40287
altitude: -31.4230690002

temperature: -52.5
pressure: 40183
altitude: -31.5887317657

temperature: -52.5
pressure: 40281
altitude: -37.2313270569

temperature: -52.5
pressure: 40284
altitude: -34.078414917

^CTraceback (most recent call last):
  File "index2.py", line 11, in <module>
    time.sleep(2)
KeyboardInterrupt
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index3.py -a 77 -b 1 -c 1
TCA9548A I2C channel status: 0b1 (channel 1)
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index2.py
temperature: -125.699996948
pressure: 40166
altitude: -31.7548980713

temperature: -52.4000015259
pressure: 40163
altitude: -34.5762786865

^CTraceback (most recent call last):
  File "index2.py", line 11, in <module>
    time.sleep(2)
KeyboardInterrupt
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index3.py -a 77 -b 1 -c 2
TCA9548A I2C channel status: 0b0 (channel 0)
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index2.py
temperature: -125.699996948
pressure: 28375
altitude: 1204.44226074

temperature: -52.4000015259
pressure: 28303
altitude: 1222.52453613

^CTraceback (most recent call last):
  File "index2.py", line 11, in <module>
    time.sleep(2)
KeyboardInterrupt
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index3.py -a 77 -b 1 -c 3
TCA9548A I2C channel status: 0b0 (channel 0)
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index2.py
temperature: -125.699996948
pressure: 28304
altitude: 1205.19128418

temperature: -52.5
pressure: 28301
altitude: 1222.90002441

^CTraceback (most recent call last):
  File "index2.py", line 11, in <module>
    time.sleep(2)
KeyboardInterrupt
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index3.py -a 77 -b 1 -c 4
TCA9548A I2C channel status: 0b100 (channel 4)
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index2.py
temperature: -125.699996948
pressure: 40136
altitude: -46.9332351685

temperature: -52.5
pressure: 40116
altitude: -47.5958938599

^CTraceback (most recent call last):
  File "index2.py", line 11, in <module>
    time.sleep(2)
KeyboardInterrupt
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index3.py -a 77 -b 1 -c 5
TCA9548A I2C channel status: 0b101 (channel 5)
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index2.py
temperature: -125.699996948
pressure: 40185
altitude: -46.9332351685

temperature: -52.5
pressure: 40136
altitude: -47.0986480713

^CTraceback (most recent call last):
  File "index2.py", line 11, in <module>
    time.sleep(2)
KeyboardInterrupt
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index3.py -a 77 -b 1 -c 6
TCA9548A I2C channel status: 0b0 (channel 0)
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index2.py
temperature: -125.699996948
pressure: 28365
altitude: 1216.15002441

temperature: -52.5
pressure: 28297
altitude: 1215.96289062

^CTraceback (most recent call last):
  File "index2.py", line 11, in <module>
    time.sleep(2)
KeyboardInterrupt
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index3.py -a 77 -b 1 -c 7
TCA9548A I2C channel status: 0b0 (channel 0)
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index2.p
python: can't open file 'index2.p': [Errno 2] No such file or directory
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ sudo python index2.py
temperature: -125.699996948
pressure: 28368
altitude: 1219.89953613

temperature: -52.5
pressure: 28283
altitude: 1219.71179199

temperature: -52.5
pressure: 28353
altitude: 1219.71179199

^CTraceback (most recent call last):
  File "index2.py", line 11, in <module>
    time.sleep(2)
KeyboardInterrupt
pi@pi1:~/Documents/NodeJSProjects/PythonTests $ ^C

Tags: pychannelpisudoi2cdocumentstemperaturebus
1条回答
网友
1楼 · 发布于 2024-10-01 22:42:55

我修改了您原来的示例,这对我来说很有用:

我的TCA9548A.py如下所示:

#!/usr/bin/python
# intended for import to change channel of TCA9548A
# import then call I2C_setup(multiplexer_addr,multiplexer_channel)

import smbus
import time
import sys

channel_array=[0b00000001,0b00000010,0b00000100,0b00001000,0b00010000,0b00100000,0b01000000,0b10000000]

def I2C_setup(multiplexer,i2c_channel_setup):
    bus = smbus.SMBus(1)
    bus.write_byte(multiplexer,channel_array[i2c_channel_setup])
    time.sleep(0.01)
    #uncomment to debug #print("TCA9548A I2C channel status:", bin(bus.read_byte(multiplexer)))

然后在同一目录中,我有一个文件read_sensor.py,它利用了您的示例:

#!/usr/bin/python

import TCA9548A

# set specific multiplexer to a specific channel
# TCA9548A.I2C_setup( multiplexer_addr , multiplexer_channel )
TCA9548A.I2C_setup(0x70,5)

接下来,根据需要导入库并从传感器获取数据。我有多个BMP280,它们都具有相同的0x76地址。因此,当我在0x76从BMP280传感器读取数据时,多路复用器将只选择一个通道,并向I2C线路开放。下一步,我可能会转到TCA9548A.I2C_设置(0x70,6),然后在0x76再次从BMP280读取数据,但我将从该多路复用器通道6上的下一个BMP280接收数据

我有另一个多路复用器,我将通过它的自定义地址0x71调用它。我把它的A0引脚高拉到VCC,将多路复用器的地址更改为0x71。请注意,我这里的代码没有利用多路复用器不选择通道的能力,因此请注意,任何多路复用器的最后选择通道都将对I2C线路开放。我没有像在Adafruit's example中那样使用Wire.write(0)方法。。。因此,在使用多个多路复用器上的通道之前,可能需要在未使用的多路复用器上选择未使用的通道,或者使用GPIO将多路复用器RST引脚拉低以禁用它

相关问题 更多 >

    热门问题