아두이노

[아두이노] I2C 통신

다락공방 2024. 8. 5. 16:10

I2C 통신?

뭔가 아이투시 같지만 아이 스퀘어 시라고 읽는게 맞다고 한다. 

위의 그림처럼, 하나의 마스터가, 여러개의 슬레이브간의 통신을 가능하게 하는 프로토콜이다.

마스터는 기준클럭을 생성: SCL

슬레이브와 마스터간 데이터 전송: SDA

 

UART 보다 좋은점 :

UART와 같은 시리얼 통신은 비동기식 방식이다. 비동기식 방식이란 SCL처럼 동기화된 클럭신호가 없어서 사전에 전송속도를 합의해야 어떤 타이밍에 데이터가 전송하는지 확인이 가능하다. 

비동기식 방식은 더많은 하드웨어 장치가 필요하고, 매 데이터 전송단위마다 시작/종료 비트를 포함해야한다. 

그리고 특히 1대1 통신이므로 다수의 장치와의 통신엔 제한이 발생한다. 

 

SCL의 HIGH를 기준으로 정해진 프레임(8bit)단위로 데이터를 전송한다. 

그리고 여러장치와 통신하므로, 8비트의 주소 프레임과 8비트의 데이터 프레임을 차례로 전송된다.

 

I2C 통신을 통해 온도, 습도, 압력 다수의 센서와의 통신으로 값을 측정할 수 있다.

 

void setup(){ 
  Serial.begin(115200); 
  myBME280.setI2CAddress(BME280_ADDR); // BME280 I2C주소값 설정(0x77) myBME280.beginI2C(); // BME280 I2C장치 호출 
  myBME280.beginI2C(); // BME280 I2C장치 호출
  matrix.begin();
}

1. SETUP 함수에서는 115200baud rate로의 begin 함수 선언과 BME 280 센서의 주소값, 장치 호출, MATRIX의 실행을 선언하였다.   


void loop(){ 
  float temp_c = myBME280.readTempC();
  float humm = myBME280.readFloatHumidity();
  matrix.setRotation(0); // 디스플레이 위치 값
  matrix.clear(); // LED Matirx 화면 초기화
  Serial.print(" Temperature(℃): "); 
  Serial.print(myBME280.readTempC(), 2); 
  Serial.println(" ℃"); 
  Serial.print(" Humidity: "); 
  Serial.print(myBME280.readFloatHumidity(), 2); 
  Serial.println(" %"); 
  Serial.println(" ");
if( temp_c <  temp_Threshold && humm < humm_threshold)
{
matrix.drawBitmap(0, 0, smile_bmp, 8, 8, 128);
delay(1000);
} 
matrix.clear();
delay(2000);
}

 

I2C를 통해 BME280의 통신으로 온습도를 측정하고, LED Matrix에 이모티콘을 출력한다. 

위는 온습도가 좋아서 웃는 이모티콘이 출력된다!