一. 開(kāi)啟IIC
樹(shù)莓派的IIC默認(rèn)是關(guān)閉的, 需要配置開(kāi)啟
1. 方法一. 圖形界面


2. 方法二. 終端開(kāi)啟
在終端輸入:
sudo raspi-config



3. 查看iic是否啟動(dòng)
在終端輸入:
lsmod
可以看到i2c-bcm2708 和 i2c-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)