#include <Wire.h>
// LED 핀 번호 배열
const uint8_t ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
const uint8_t ledCount = sizeof(ledPins) / sizeof(ledPins[0]);
void setup() {
// LED 핀 출력 모드로 설정
for (uint8_t i = 0; i < ledCount; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW); // 초기 상태는 꺼짐
}
// I2C Slave 설정
Wire.begin(0x08); // I2C slave address 0x08
Wire.onReceive(receiveEvent);
Serial.begin(9600);
Serial.println("Arduino I2C LED Controller Ready");
}
void loop() {
// 메인 루프는 I2C 이벤트만 처리
}
// Raspberry Pi에서 데이터 수신 이벤트 처리
void receiveEvent(int howMany) {
Serial.print("Received bytes: ");
Serial.println(howMany);
// write_i2c_block_data(LED_I2C_ADDRESS, 0, [ledIndex, onOff])
// -> 실제로 아두이노에서는 [command, ledIndex, onOff]로 들어온다.
if (howMany < 3) {
Serial.println("Not enough data received");
return;
}
uint8_t dummy = Wire.read(); // 첫 바이트(command)는 무시
uint8_t ledIndex = Wire.read();
uint8_t onOff = Wire.read();
if (ledIndex >= ledCount) {
Serial.print("Invalid LED index: ");
Serial.println(ledIndex);
return;
}
Serial.print("LED ");
Serial.print(ledIndex);
Serial.print(" -> ");
Serial.println(onOff ? "ON" : "OFF");
digitalWrite(ledPins[ledIndex], onOff ? HIGH : LOW);
}