[아두이노] I2C통신

1. master -> slave로 데이터 전송


실행결과 : 1초에 한 번씩 slave쪽 시리얼 모니터에 hello가 출력됨

  • master
#include <Wire.h>
#define SLAVE 2
// master
//
void setup()
{
  Wire.begin(); //매개변수없음-마스터모드로 동작
}

void loop()
{
  const char *p = "hello\n";
  //m -> s : beginTransmission, endTransmission
  Wire.beginTransmission(SLAVE); //s에게 전송
  for(int i=0; i<strlen(p); i++){
    Wire.write(p[i]);
  }
  Wire.endTransmission(SLAVE);
  delay(1000);
}
  • slave
#include <Wire.h>
#define SLAVE 2
// slave
//
void setup()
{
  Wire.begin(SLAVE);
  //s에서 수신하는 함수 : onReceive
  Wire.onReceive(fromMaster);
  Serial.begin(9600);
}

void loop()
{
  
}

void fromMaster(int bytes) {
  for(int i=0; i<bytes; i++){
    char ch = Wire.read();
    Serial.print(ch);
  }
}

2. slave -> master로 데이터 전송


실행결과 : 1초에 한 번씩 master쪽 시리얼 모니터에 1씩 증가하며 정수가 출력됨. 1, 2, 3, ...

  • master
#include <Wire.h>
#define SLAVE 2
// master
//
void setup()
{
  Wire.begin(); //매개변수없음-마스터모드로 동작
  Serial.begin(9600);
}

void loop()
{
  //master가 값 수신하는 함수 : requestFrom
  Wire.requestFrom(SLAVE, 1); //1byte씩
  char c = Wire.read();
  Serial.println(String(c, DEC)); //string형으로 바꿔서 출력
  delay(1000);
}
  • slave
#include <Wire.h>
#define SLAVE 2
// slave
//

byte count = 0;

void setup()
{
  Wire.begin(SLAVE);
  //s에서 전송하는 함수 : onRequest
  Wire.onRequest(sendToMaster);
  Serial.begin(9600);
}

void loop()
{
  
}

void sendToMaster() {
  Wire.write(++count);
}

3. 퍼텐셔미터의 값을 slave에게 전송하기


실행결과 : 퍼텐셔미터를 조절하면 slave쪽 시리얼 모니터에 변경된 퍼텐셔미터 값들이 1초마다 출력됨. ex) 0, 153, 255, 13 ...

  • master
#include <Wire.h>
#define SLAVE 2
// master
//
void setup()
{
  Wire.begin(); //매개변수없음-마스터모드로 동작
  Serial.begin(9600);
}

void loop()
{
  int a = analogRead(A0);
  byte send = a/4; //최대값255 (원래는0-1023)
  Wire.beginTransmission(SLAVE);//slave에게 전송
  Wire.write(send);
  Wire.endTransmission(SLAVE); //slave와 연결 끝냄
  delay(1000);
}
  • slave
#include <Wire.h>
#define SLAVE 2
// slave
//

byte count = 0;

void setup()
{
  Wire.begin(SLAVE);
  Wire.onReceive(fromMaster);
  Serial.begin(9600);
}

void loop()
{
  
}

void fromMaster(int bytes){
  byte a = Wire.read();
  Serial.println(a);
}

4. master의 퍼텐셔미터로 slave의 LED 밝기 조절하기


실행결과 : master쪽의 퍼텐셔미터를 조절하면 slave쪽의 LED 밝기가 조절된다.

  • master
#include <Wire.h>
#define SLAVE 2
// master
//
void setup()
{
  Wire.begin(); //매개변수없음-마스터모드로 동작
  Serial.begin(9600);
}

void loop()
{
  int a = analogRead(A0);
  byte send = a/4; //최대값255 (원래는0-1023)
  Wire.beginTransmission(SLAVE);//slave에게 전송
  Wire.write(send);
  Wire.endTransmission(SLAVE); //slave와 연결 끝냄
  delay(1000);
}
  • slave
#include <Wire.h>
#define SLAVE 2
// slave
//

byte count = 0;

void setup()
{
  Wire.begin(SLAVE);
  Wire.onReceive(fromMaster);
  Serial.begin(9600);
  pinMode(6, OUTPUT);
}

void loop()
{
  
}

void fromMaster(int bytes){
  byte a = Wire.read();
  analogWrite(6, a); 
}

5. 1:n


실행결과 : 4번의 기능 + 버튼을 누를 때 마다 slave2의 시리얼 모니터에 1이 출력됨.

  • master
#include <Wire.h>
#define SLAVE 2
#define SLAVE2 3
// master
//

int previous = 0;

void setup()
{
  Wire.begin(); //매개변수없음-마스터모드로 동작
  Serial.begin(9600);
  pinMode(9, INPUT);
}

void loop()
{
  int a = analogRead(A0);
  int btn = digitalRead(9);
  byte send = a/4; //최대값255 (원래는0-1023)
  if(send != previous){
    previous = send;
    Wire.beginTransmission(SLAVE);//slave에게 전송
    Wire.write(send);
    Wire.endTransmission(SLAVE); //slave와 연결 끝냄
  }
  if(btn){
    Wire.beginTransmission(SLAVE2);//slave2에게 전송
    Wire.write(1);
    Wire.endTransmission(SLAVE2); //slave2와 연결 끝냄
  }
  delay(50);
}
  • slave1
    4와 동일

  • slave2

#include <Wire.h>
#define SLAVE2 3
// slave 2번째
//
void setup()
{
  Wire.begin(SLAVE2);
  Serial.begin(9600);
  Wire.onReceive(fromMaster);
}

void loop()
{
  
}

void fromMaster(int bytes){
  byte n = Wire.read();
  Serial.println(n);
}

좋은 웹페이지 즐겨찾기