본문 바로가기

ESPRESSIF/ESP32-C6

[ESP32C6 XBee] Arduino 에서 Zigbee Light End Device 전등 제어 장치 제작

ESP32C6 Gateway 장치에 연결할 다양한 End Device를 테스트 하려고 하다보니 좀더 쉽고 간단하게 End Device를 작성할 방법을 알아보게 된다. 알아보니 ESP32C6 Arduino 예제에 Zigbee 장치에 대한 다양한 것들이 존재한다.

 

 

Arduino를 이용하면 코드도 간단하고 기존에 작성한 다양한 라이브러리를 이용할 수 있어서 쉽게 Zigbee EndDevice를 제작 할수 있을것 같다.

 

 

우선 ESP32C6에서 Zigbee 예제를 사용하려면 Arduino의  Tools 설정에서 Zigbee 관련 세팅을 해 주어야 한다.

Tools->Partition Scheme ->Zigbee 2MB with spiffs 로 설정한다.

 

 

그리고 Tools->Zigbee Mode -> Zigbee ED 으로 설정한다.

만약 Coordinator 예제라면  Zigbee ZCZR로 설정 해야 한다.

 

 

기본 코드를 ESP32C6 SSM 보드에 맞게 핀맵 정보를 수정하고 컴파일 하면 기존에 ESP-IDF로 장성한 예제와 거의 동일하게 동작한다.

// Zigbee End Device 모드로 빌드되지 않았으면 에러 발생
#ifndef ZIGBEE_MODE_ED
#error "Zigbee end device mode is not selected in Tools->Zigbee mode"
#endif

#include "Zigbee.h"  // ESP32 Zigbee Arduino 라이브러리 포함

/* Zigbee light bulb configuration */
#define ZIGBEE_LIGHT_ENDPOINT 10    // 엔드포인트 번호
uint8_t led = 14;          // LED 핀
uint8_t button = 8;          // 버튼 핀 (부트 버튼)

/* Zigbee Light 객체 생성 */
ZigbeeLight zbLight = ZigbeeLight(ZIGBEE_LIGHT_ENDPOINT);

/********************* RGB LED 제어 함수 **************************/
void setLED(bool value) {
  // LED 상태 변경 (ON/OFF)
  digitalWrite(led, value);
}

/********************* Arduino setup 함수 **************************/
void setup() {
  Serial.begin(115200);          // 시리얼 포트 초기화

  // LED 초기화 및 OFF
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);

  // 버튼 초기화 (푸시 버튼 + 풀업)
  pinMode(button, INPUT_PULLUP);

  // 선택 사항: Zigbee 장치 이름과 모델 설정
  zbLight.setManufacturerAndModel("Espressif", "ZBLightBulb");

  // Light 상태 변경 시 호출될 콜백 함수 등록
  zbLight.onLightChange(setLED);

  // Zigbee Core에 Light 엔드포인트 등록
  Serial.println("Adding ZigbeeLight endpoint to Zigbee Core");
  Zigbee.addEndpoint(&zbLight);

  // 모든 엔드포인트 등록 후 Zigbee 시작
  // 기본적으로 ZIGBEE_END_DEVICE 모드로 동작
  if (!Zigbee.begin()) {
    Serial.println("Zigbee failed to start!");
    Serial.println("Rebooting...");
    ESP.restart();  // 실패 시 재부팅
  }

  Serial.println("Connecting to network");
  // 네트워크 연결될 때까지 대기
  while (!Zigbee.connected()) {
    Serial.print(".");
    delay(100);
  }
  Serial.println();
}

/********************* Arduino loop 함수 **************************/
void loop() {
  // 버튼 체크: Factory Reset 및 Light 토글 처리
  if (digitalRead(button) == LOW) {  // 버튼 눌림 감지
    delay(100);  // 간단한 디바운스 처리

    int startTime = millis();
    while (digitalRead(button) == LOW) {  // 버튼 계속 누름 상태
      delay(50);
      if ((millis() - startTime) > 3000) {  // 3초 이상 눌렀으면
        // Zigbee Factory Reset 후 1초 뒤 재부팅
        Serial.println("Resetting Zigbee to factory and rebooting in 1s.");
        delay(1000);
        Zigbee.factoryReset();
      }
    }

    // 버튼을 짧게 눌렀을 경우 Light 상태 토글
    zbLight.setLight(!zbLight.getLightState());
  }

  delay(100);  // 루프 딜레이
}

 

Ardino의 경우 Zigbee 관련 처리 코드를 라이브러리로 제공되기 때문에 코드가 아주 심플하다. 그래서 다양한 예제를 쉽게 작성할 수 있다.

 


여기서 쉽게는 기존에 만들어진 라이브러리가 있을 때는 쉽지만 라이브러리가 제공하지 않는 장치는 사용자가 직접 작성해 주어야 하는데...  라이브러리를 수정하거나 라이브러리의 클래스를 상속 받아서 만들어 주어야 한다.

 

ESP32 Zigbee 관련 라이브러리는 아래 폴더에 있고 이 코드를 이용해서 사용자 정의 장치를 만들 수 있다.

AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.3.0\libraries\Zigbee\src\ep

 

Zigbee HA Device만해도 상당히 많은데 모든 예제를제공하지 않기 때문에 없는 장치는 만들어 주어야 한다.

특히 앞으로 Gateway 에 연결하고 싶은 IAS_ZONE 장치 같은경우가 그렇다.

/** @brief HA Device identifiers.
 */
typedef enum {
    ESP_ZB_HA_ON_OFF_SWITCH_DEVICE_ID                 = 0x0000,  /*!< General On/Off switch */
    ESP_ZB_HA_LEVEL_CONTROL_SWITCH_DEVICE_ID          = 0x0001,  /*!< Level Control Switch  */
    ESP_ZB_HA_ON_OFF_OUTPUT_DEVICE_ID                 = 0x0002,  /*!< General On/Off output */
    ESP_ZB_HA_LEVEL_CONTROLLABLE_OUTPUT_DEVICE_ID     = 0x0003,  /*!< Level Controllable Output */
    ESP_ZB_HA_SCENE_SELECTOR_DEVICE_ID                = 0x0004,  /*!< Scene Selector */
    ESP_ZB_HA_CONFIGURATION_TOOL_DEVICE_ID            = 0x0005,  /*!< Configuration Tool */
    ESP_ZB_HA_REMOTE_CONTROL_DEVICE_ID                = 0x0006,  /*!< Remote Control */
    ESP_ZB_HA_COMBINED_INTERFACE_DEVICE_ID            = 0x0007,  /*!< Combined Interface */
    ESP_ZB_HA_RANGE_EXTENDER_DEVICE_ID                = 0x0008,  /*!< Range Extender */
    ESP_ZB_HA_MAINS_POWER_OUTLET_DEVICE_ID            = 0x0009,  /*!< Mains Power Outlet */
    ESP_ZB_HA_DOOR_LOCK_DEVICE_ID                     = 0x000A,  /*!< Door lock client */
    ESP_ZB_HA_DOOR_LOCK_CONTROLLER_DEVICE_ID          = 0x000B,  /*!< Door lock controller */
    ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID                 = 0x000C,  /*!< Simple Sensor device */
    ESP_ZB_HA_CONSUMPTION_AWARENESS_DEVICE_ID         = 0x000D,  /*!< Consumption Awareness Device */
    ESP_ZB_HA_HOME_GATEWAY_DEVICE_ID                  = 0x0050,  /*!< Home Gateway */
    ESP_ZB_HA_SMART_PLUG_DEVICE_ID                    = 0x0051,  /*!< Smart plug */
    ESP_ZB_HA_WHITE_GOODS_DEVICE_ID                   = 0x0052,  /*!< White Goods */
    ESP_ZB_HA_METER_INTERFACE_DEVICE_ID               = 0x0053,  /*!< Meter Interface */
    ESP_ZB_HA_ON_OFF_LIGHT_DEVICE_ID                  = 0x0100,  /*!< On/Off Light Device */
    ESP_ZB_HA_DIMMABLE_LIGHT_DEVICE_ID                = 0x0101,  /*!< Dimmable Light Device */
    ESP_ZB_HA_COLOR_DIMMABLE_LIGHT_DEVICE_ID          = 0x0102,  /*!< Color Dimmable Light Device */
    ESP_ZB_HA_DIMMER_SWITCH_DEVICE_ID                 = 0x0104,  /*!< Dimmer Switch Device */
    ESP_ZB_HA_COLOR_DIMMER_SWITCH_DEVICE_ID           = 0x0105,  /*!< Color Dimmer Switch Device */
    ESP_ZB_HA_LIGHT_SENSOR_DEVICE_ID                  = 0x0106,  /*!< Light Sensor Device */
    ESP_ZB_HA_SHADE_DEVICE_ID                         = 0x0200,  /*!< Shade */
    ESP_ZB_HA_SHADE_CONTROLLER_DEVICE_ID              = 0x0201,  /*!< Shade controller */
    ESP_ZB_HA_WINDOW_COVERING_DEVICE_ID               = 0x0202,  /*!< Window Covering client*/
    ESP_ZB_HA_WINDOW_COVERING_CONTROLLER_DEVICE_ID    = 0x0203,  /*!< Window Covering controller */
    ESP_ZB_HA_HEATING_COOLING_UNIT_DEVICE_ID          = 0x0300,  /*!< Heating/Cooling Unit device */
    ESP_ZB_HA_THERMOSTAT_DEVICE_ID                    = 0x0301,  /*!< Thermostat Device */
    ESP_ZB_HA_TEMPERATURE_SENSOR_DEVICE_ID            = 0x0302,  /*!< Temperature Sensor */
    ESP_ZB_HA_IAS_CONTROL_INDICATING_EQUIPMENT_ID     = 0x0400,  /*!< IAS Control and Indicating Equipment */
    ESP_ZB_HA_IAS_ANCILLARY_CONTROL_EQUIPMENT_ID      = 0x0401,  /*!< IAS Ancillary Control Equipment */
    ESP_ZB_HA_IAS_ZONE_ID                             = 0x0402,  /*!< IAS Zone */
    ESP_ZB_HA_IAS_WARNING_DEVICE_ID                   = 0x0403,  /*!< IAS Warning Device */
    ESP_ZB_HA_TEST_DEVICE_ID                          = 0xfff0,  /*!< Custom HA device for test */
    ESP_ZB_HA_CUSTOM_TUNNEL_DEVICE_ID                 = 0xfff1,  /*!< Custom Tunnel device (should declared in private profile) */
    ESP_ZB_HA_CUSTOM_ATTR_DEVICE_ID                   = 0xfff2   /*!< Custom Attributes Device */
} esp_zb_ha_standard_devices_t;

 

 

그래서 간단히 Read만 커스텀 할수 있는 Gateway 장치를 만들기 위해 ZigbeeRead.cpp 코드를 생성했는데... Arduino 특성상 디버깅이 어려움이 있어 당분간은 Gateway Device는 ESP-IDF 환경에서 개발하는 것으로 결정했다.

 

반응형