python玩轉(zhuǎn)樹(shù)莓派(六) IIC 及 smbus2

一. 開(kāi)啟IIC

樹(shù)莓派的IIC默認(rèn)是關(guān)閉的, 需要配置開(kāi)啟

1. 方法一. 圖形界面

2. 方法二. 終端開(kāi)啟

在終端輸入:

sudo raspi-config

3. 查看iic是否啟動(dòng)

在終端輸入:

lsmod

可以看到i2c-bcm2708i2c-dev,證明啟動(dòng)成功

二. 硬件監(jiān)控及設(shè)備識(shí)別

1. 安裝i2ctool

這個(gè)工具用于I2c硬件監(jiān)控, 設(shè)備識(shí)別

sudo apt-get install i2c-tools

2. 查詢i2c總線

i2cdetect -l

3. 查詢i2c設(shè)備

i2cdetect -y 1

我試驗(yàn)了AHT10 SHT20 OLED12864(SH1106) 發(fā)現(xiàn)SHT20并不能識(shí)別????????

4. 從i2c設(shè)備讀出寄存器

sudo i2cdump -y 1 0x38

5. 向i2c設(shè)備寫(xiě)寄存器

sudo i2cset -y 1 0x38 0x90 0x55

其中 0x90: 寄存器地址 ,0x55 : 數(shù)據(jù)

6. 從i2c設(shè)備讀出特定寄存器

sudo i2cget -y 1 0x38 0x90

三. python IIC庫(kù) -- smbus2

https://pypi.org/project/smbus2/
安裝smbus2

pip install smbus2

1. 導(dǎo)入模塊,實(shí)例化

from smbus2 import SMBus
i2c = SMBus(1)   # 1 代表 /dev/i2c-1

2. 當(dāng)前支持的功能

獲取i2c功能(I2C_FUNCS)
SMBus數(shù)據(jù)包錯(cuò)誤檢查(PEC)支持
read_byte
write_byte
read_byte_data
write_byte_data
read_word_data
write_word_data
read_i2c_block_data
write_i2c_block_data
write_quick
process_call
read_block_data
write_block_data
block_process_call
i2c_rdwr-具有重復(fù)啟動(dòng)功能的組合讀/寫(xiě)事務(wù)

3. open() 打開(kāi)一個(gè)i2c bus

i2c.open(1)  # 1 代表 /dev/i2c-1

4. close() 關(guān)閉一個(gè)i2c bus

i2c.close()

5.read_byte //從設(shè)備讀取一個(gè)字節(jié)

read_byte(i2c_addr, force=None)

參數(shù):

  • i2c_addr (整形) – i2c 地址

返回值:

  • 讀取的字節(jié)

6.write_byte //向設(shè)備寫(xiě)入一個(gè)字節(jié)

write_byte(i2c_addr, value, force=None)

參數(shù):

  • i2c_addr (整形) – i2c 地址
  • value(整形) -要寫(xiě)入的值

返回值:

  • 無(wú)

7.read_byte_data //從指定的寄存器中讀取一個(gè)字節(jié)

read_byte_data(i2c_addr, register, force=None)

參數(shù):

  • i2c_addr (整形) – i2c 地址
  • register(整形)–讀取的寄存器

返回值:

  • 讀取的字節(jié)

8.write_byte_data //向指定的寄存器中寫(xiě)入一個(gè)字節(jié)

write_byte_data(i2c_addr, register, value, force=None)

參數(shù):

  • i2c_addr (整形) – i2c 地址
  • register(整形)–讀取的寄存器
  • value(整形) -要寫(xiě)入的值

返回值:

  • 無(wú)

9.read_i2c_block_data //從給定的寄存器中讀取字節(jié)數(shù)據(jù)塊

read_i2c_block_data(i2c_addr, register, length, force=None)

參數(shù):

  • i2c_addr (整形) – i2c 地址
  • register(整形)–開(kāi)始寄存器
  • length(整形)–所需的塊長(zhǎng)度

返回值:

  • 字節(jié)組成的列表

10.write_i2c_block_data //將字節(jié)數(shù)據(jù)塊寫(xiě)入給定寄存器

write_i2c_block_data(i2c_addr, register, data, force=None)

參數(shù):

  • i2c_addr (整形) – i2c 地址
  • register(整形)–開(kāi)始寄存器
  • data(整形)–字節(jié)組成的列表

返回值:

  • 無(wú)

11. read_word_data //從給定的寄存器中讀取一個(gè)字(2個(gè)字節(jié))

read_byte_data(i2c_addr, register, force=None)

參數(shù):

  • i2c_addr (整形) – i2c 地址
  • register(整形)–開(kāi)始寄存器

返回值:

  • 整形

12. write_word_data //將一個(gè)字(2個(gè)字節(jié))寫(xiě)入給定的寄存器

write_word_data(i2c_addr, register, value, force=None)

參數(shù):

  • i2c_addr (整形) – i2c 地址
  • register(整形)–開(kāi)始寄存器
  • value(整形) -要寫(xiě)入的字

返回值:

  • 無(wú)

四. 舉例: 使用smbus2讀寫(xiě)AHT10溫濕度傳感器

AHT10的基本信息:
iic從地址: 0x38
寫(xiě)命令(寫(xiě)地址): 0x70
讀命令(讀地址): 0x71
初始化方法: 寫(xiě)命令 0xE1,0x08,0x00
復(fù)位方法: 寫(xiě)命令 0xBA
讀狀態(tài)和測(cè)量結(jié)果(返回1字節(jié)狀態(tài)+20比特濕度+20比特溫度,共6字節(jié))

import time

AHT10_ADDRESS = 0x38 # AHT10 i2c地址
AHT_TEMPERATURE_CONST = 200 #溫度常量
AHT_TEMPERATURE_OFFSET = 50 #溫度偏移
CMD_INITIALIZE = [0xE1, 0x08, 0x00] #初始化命令
CMD_RESET = 0xBA #復(fù)位命令
CMD_MEASURE = [0xAC, 0x33, 0x00] #測(cè)量命令

class AHT10:
    def __init__(self, i2c):
        if i2c is None:
            raise ValueError('I2C object required.')
        self.i2c = i2c
        self.address = AHT10_ADDRESS
        self.aht10_init()
        self.readings_raw = []
        self.results_parsed = [0, 0]
    # 初始化AHT10
    def aht10_init(self):
        self.aht10_reset()
        self.i2c.write_i2c_block_data(self.address,0x70,CMD_INITIALIZE)
    # 復(fù)位
    def aht10_reset(self):
        self.i2c.write_byte_data(self.address,0x70,CMD_RESET)
        time.sleep(0.1)
    # 讀數(shù)據(jù)
    def read_raw(self):
        self.i2c.write_i2c_block_data(self.address,0x70, CMD_MEASURE)
        time.sleep(0.075)
        self.readings_raw = self.i2c.read_i2c_block_data(AHT10_ADDRESS,0x71,6)
        self.results_parsed[0] = self.readings_raw[1] << 12 | self.readings_raw[2] << 4 | self.readings_raw[3] >> 4
        self.results_parsed[1] = (self.readings_raw[3] & 0x0F) << 16 | self.readings_raw[4] << 8 | self.readings_raw[5]
    # 濕度
    @property
    def humidity(self):
        self.read_raw()
        return (self.results_parsed[0] / 0x100000) * 100 
    # 溫度
    @property
    def temperature(self):
        self.read_raw()
        return (self.results_parsed[1] / 0x100000) * AHT_TEMPERATURE_CONST - AHT_TEMPERATURE_OFFSET
    #打印方法
    def print(self):
        print("Temperature: " + str(self.temperature) + "C"+ ", Humidity: " + str(self.humidity))


if __name__ =='__main__':
    import smbus2
    i2c = smbus2.SMBus(1)
    aht10 = AHT10(i2c)
    while True:
        aht10.print()
        time.sleep(2)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容