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로 전송하는 장치를 아주 쉽게 제작 할수 있다는것을 확인 할수 있는 간단한 예제 인것 같다.
반응형