2022年8月23日 星期二

NodeMCU I2C 與 Arduino IDE

介紹

I2C(Inter-Integrated Circuit)是一種串行總線接口連接協議。它也被稱為 TWI(雙線接口),因為它只使用兩條線進行通信。這兩條線是 SDA(串行數據)和 SCL(串行時鐘)。

I2C 是一種基於確認的通信協議,即發送器在發送數據後檢查接收器的確認,以了解接收器是否成功接收數據。

I2C以兩種模式工作,即,

  • 主模式
  • 從機模式

SDA(串行數據)線用於主從設備之間的數據交換。SCL(串行時鐘)用於主從設備之間的同步時鐘。

主設備發起與從設備的通信。主設備需要從設備地址來發起與從設備的對話。當從設備被主設備尋址時,從設備響應主設備。

NodeMCU 在其 GPIO 引腳上支持 I2C 功能。由於 ESP-12E 的內部功能,我們不能將其所有 GPIO 用於 I2C 功能。因此,在將任何 GPIO 用於 I2C 應用之前進行測試。

 

例子

讓我們為作為 I2C 主設備的 NodeMCU 編寫一個 Arduino 草圖,為作為 I2C 從設備的 Arduino Uno 編寫一個 Arduino 草圖。主設備向從設備發送一個​​問候字符串,從設備將發送一個問候字符串以響應主設備。

在這裡,我們使用

主設備: NodeMCU

從設備: Arduino Uno

從設備地址: 8

接口圖如下圖所示

NodeMCU Arduino I2C 接口

NodeMCU Arduino I2C 接口

 

用於 NodeMCU(主 I2C 設備)的 Arduino 草圖

#include <Wire.h>

void setup() {
 Serial.begin(9600); /* begin serial for debug */
 Wire.begin(D1, D2); /* join i2c bus with SDA=D1 and SCL=D2 of NodeMCU */
}

void loop() {
 Wire.beginTransmission(8); /* begin with device address 8 */
 Wire.write("Hello Arduino");  /* sends hello string */
 Wire.endTransmission();    /* stop transmitting */

 Wire.requestFrom(8, 13); /* request & read data of size 13 from slave */
 while(Wire.available()){
    char c = Wire.read();
  Serial.print(c);
 }
 Serial.println();
 delay(1000);
}

Arduino Uno(從 I2C 設備)的 Arduino Sketch

#include <Wire.h>

void setup() {
 Wire.begin(8);                /* join i2c bus with address 8 */
 Wire.onReceive(receiveEvent); /* register receive event */
 Wire.onRequest(requestEvent); /* register request event */
 Serial.begin(9600);           /* start serial for debug */
}

void loop() {
 delay(100);
}

// function that executes whenever data is received from master
void receiveEvent(int howMany) {
 while (0 <Wire.available()) {
    char c = Wire.read();      /* receive byte as a character */
    Serial.print(c);           /* print the character */
  }
 Serial.println();             /* to newline */
}

// function that executes whenever data is requested from master
void requestEvent() {
 Wire.write("Hello NodeMCU");  /*send string on request */
}

輸出窗口

從設備上串行監視器的輸出窗口(Arduino Uno)

Arduino Slave 輸出窗口

主設備(NodeMCU)上串行監視器的輸出窗口

NodeMCU I2C主控的Arduino輸出窗口

  

資料來源:https://www.electronicwings.com/nodemcu/nodemcu-i2c-with-arduino-ide

沒有留言: