[아두이노] 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);
}
Author And Source
이 문제에 관하여([아두이노] I2C통신), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@from-minju/아두이노-I2C통신저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)