아두이노 I2C 제어 코드 - CBNU-SafePark/io GitHub Wiki

#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);
}
⚠️ **GitHub.com Fallback** ⚠️