在現(xiàn)代電子設(shè)計中,I2C總線因其簡單性和靈活性而廣受歡迎。它允許多個設(shè)備共享同一通信線路,從而節(jié)省空間和成本。Arduino,作為一個多功能的微控制器平臺,自然也支持I2C通信。
I2C總線基礎(chǔ)
I2C總線由兩條線組成:數(shù)據(jù)線(SDA)和時鐘線(SCL)。SDA用于傳輸數(shù)據(jù),而SCL用于同步數(shù)據(jù)傳輸。I2C設(shè)備可以是主設(shè)備或從設(shè)備。主設(shè)備生成時鐘信號并啟動數(shù)據(jù)傳輸,從設(shè)備響應(yīng)主設(shè)備的請求。
Arduino與I2C
Arduino板通常有兩個I2C引腳:A4(SDA)和A5(SCL)。這些引腳可以直接連接到I2C設(shè)備的相應(yīng)引腳。Arduino的軟件庫提供了對I2C通信的支持,使得與I2C設(shè)備的通信變得簡單。
硬件連接
為了演示I2C通信,我們將使用一個常見的I2C設(shè)備:MCP9808溫度傳感器。以下是連接步驟:
- 將MCP9808的VCC引腳連接到Arduino的5V。
- 將MCP9808的GND引腳連接到Arduino的GND。
- 將MCP9808的SDA引腳連接到Arduino的A4引腳。
- 將MCP9808的SCL引腳連接到Arduino的A5引腳。
軟件實現(xiàn)
在Arduino IDE中,我們需要包含Wire庫,這是Arduino提供的用于I2C通信的庫。以下是讀取MCP9808溫度的示例代碼:
#include
// MCP9808 I2C地址
#define MCP9808_ADDRESS 0x18
void setup() {
// 初始化串口通信
Serial.begin(9600);
// 初始化I2C通信
Wire.begin();
}
void loop() {
// 讀取溫度
float temp = readTemperature();
// 打印溫度
Serial.print("Temperature: ");
Serial.print(temp);
Serial.println(" C");
// 等待一秒鐘
delay(1000);
}
float readTemperature() {
// 啟動I2C通信
Wire.beginTransmission(MCP9808_ADDRESS);
// 發(fā)送溫度寄存器地址
Wire.write(0x05);
// 停止I2C通信
Wire.endTransmission();
// 請求兩個字節(jié)的數(shù)據(jù)
Wire.requestFrom(MCP9808_ADDRESS, 2);
// 等待數(shù)據(jù)準備就緒
if (Wire.available() == 2) {
// 讀取兩個字節(jié)的數(shù)據(jù)
byte msb = Wire.read();
byte lsb = Wire.read();
// 將兩個字節(jié)合并為一個16位的值
int16_t raw = (msb < < 8) | lsb;
// 將原始值轉(zhuǎn)換為攝氏度
return raw / 16.0;
}
// 如果沒有數(shù)據(jù),返回0
return 0;
}
代碼解釋
- 包含Wire庫 :
#include
引入Arduino的I2C通信庫。 - 定義I2C地址 :
#define MCP9808_ADDRESS 0x18
定義MCP9808的I2C地址。 - 初始化 :
setup()
函數(shù)中初始化串口和I2C通信。 - 主循環(huán) :
loop()
函數(shù)中讀取溫度并打印到串口。 - 讀取溫度 :
readTemperature()
函數(shù)中實現(xiàn)與MCP9808的I2C通信,讀取溫度值。
-
接口
+關(guān)注
關(guān)注
33文章
8675瀏覽量
151558 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7113瀏覽量
89304 -
I2C總線
+關(guān)注
關(guān)注
8文章
406瀏覽量
61070 -
Arduino
+關(guān)注
關(guān)注
188文章
6475瀏覽量
187447
發(fā)布評論請先 登錄
相關(guān)推薦
評論