본문 바로가기

ESPRESSIF/ESP32-C6

[ESP32C6 SSM] Arduino에서 Zigbee 써모커플 온도 센서 장치 제작

ESP32C6 Arduino에서 Zigbee End Device 제작예제 작성에서 Zigbee 출력 장치에 대한  ESP32C6 Arduino Zigbee 세팅 방법을 알아으니 이제는 입력에 해다하는 온도 센서 데이터를 입력 받을 수 있는 End Device를 만들어 보자.

 

이전 예제에서도 그렇지만 Arduio를 이용하면 아주 쉽고 간단하게 표준화된 코드를 작성할 수 있다. 그리고 기존에 작성된 라이브러리를 이용하면 다양한 장치들을 쉽게 연결 할수도 있다.

이번 예제처럼 써모커플 온도 센서를 연결하려면 ESP-IDF코드에서는 I2C부터 MAX31855코드 작성까지 코드 수정이 많이 해야 하는데 Arduino 를 이용하면 간단히 써모커플 온도 센서를 아주 쉽게 추가 할 수 있다.

 

온도 센서는 MAX31856 써모커플 온도 센서 테스트 예제를 사용할 것이다.

 

 

ESP32C6 Arduino Zigbee 온도 센서 초기화 함수

#include <Adafruit_MAX31856.h>
#ifndef ZIGBEE_MODE_ED
#error "Zigbee end device mode is not selected in Tools->Zigbee mode"
#endif

#include "Zigbee.h"

/* Zigbee temperature sensor configuration */
#define TEMP_SENSOR_ENDPOINT_NUMBER 10
uint8_t button = BOOT_PIN;

ZigbeeTempSensor zbTempSensor = ZigbeeTempSensor(TEMP_SENSOR_ENDPOINT_NUMBER);

#define DRDY_PIN 7

// use hardware SPI, just pass in the CS pin
Adafruit_MAX31856 maxthermo = Adafruit_MAX31856(13);


void setup() {
  Serial.begin(115200);
  pinMode(button, INPUT_PULLUP);

  //써모커플 MAX31856 센서 초기화
  if (!maxthermo.begin()) {
    Serial.println("Could not initialize thermocouple.");
    while (1) delay(10);
  }

  maxthermo.setThermocoupleType(MAX31856_TCTYPE_K);
  maxthermo.setConversionMode(MAX31856_CONTINUOUS);


  // Zigbee 디바이스 정보 설정 (제조사명 / 모델명)
  zbTempSensor.setManufacturerAndModel("Espressif", "ZigbeeTempSensor");

  // 온도 센서 측정 범위 설정 (기본값은 10~300°C)
  zbTempSensor.setMinMaxValue(10, 300);

  // 온도 측정 허용 오차 설정 (단위: °C, 최소 가능 값은 0.01°C)
  zbTempSensor.setTolerance(0.1);

  // Zigbee Core에 Temperature Sensor 엔드포인트 등록
  Zigbee.addEndpoint(&zbTempSensor);

  Serial.println("Starting Zigbee...");

  // 모든 엔드포인트가 등록된 후 Zigbee를 End Device 모드로 시작
  if (!Zigbee.begin()) {
    Serial.println("Zigbee failed to start!");
    Serial.println("Rebooting...");
    ESP.restart(); // Zigbee 초기화 실패 시 장치 재부팅
  } else {
    Serial.println("Zigbee started successfully!");
  }

  Serial.println("Connecting to network");

  // Zigbee 네트워크 연결 대기
  while (!Zigbee.connected()) {
    Serial.print(".");
    delay(100);
  }

  
  // 온도 리포팅 주기 설정 (Zigbee 클러스터 리포팅 규칙에 따름)
  // setReporting(min_interval, max_interval, delta)
  // - min=1, max=0  → 온도가 delta만큼 변할 때만 보고
  // - min=0, max=10 → 10초마다 또는 delta만큼 변할 때 보고
  // - min=0, max=10, delta=0 → 10초마다 무조건 보고
  zbTempSensor.setReporting(1, 0, 1);
}

 

 

ESP32C6 Arduino Zigbee 메인루프

void loop() {
  // Zigbee 내부 처리 루프 (필수)
  Zigbee.loop();

  // 주기적 업데이트 (RTOS Task 대신 millis 사용)
  unsigned long now = millis();
  if (now - lastUpdate >= interval) {
    lastUpdate = now;

    //써모커플의 온도 읽기
    float temperature = maxthermo.readThermocoupleTemperature();

    zbTempSensor.setValue(temperature);          // Zigbee Attribute 업데이트
    Serial.printf("Temp updated: %.2f °C\n", temperature);
  }
}

 

온도를 전송하는 방법은 아래와같이 3가지 함수로 전달 가는하다.

setValue() → 속성 값만 갱신

setReporting() → 주기/조건에 맞게 자동 보고

reportTemperature() → 조건 무시하고 즉시 전송



Arduino코드를 이용하면 써모커플 온도데이터를 Zigbee로 전송하는 장치를 아주 쉽게 제작 할수 있다는것을 확인 할수 있는 간단한 예제 인것 같다.

 

반응형