/**
* Proper Zigbee mode must be selected in Tools->Zigbee mode
* and also the correct partition scheme must be selected in Tools->Partition Scheme.
*/
#ifndef ZIGBEE_MODE_ED
#error "Zigbee end device mode is not selected in Tools->Zigbee mode"
#endif
#include "Zigbee.h"
#include <GyverDS18.h>
#include <GyverSegment.h>
// DS18B20 temperature sensor
#define SENSOR_PIN 20
// TM1637 display
#define DISPLAY_CLOCK 8
#define DISPLAY_DATA 9
// Zigbee temperature sensor configuration
#define TEMP_SENSOR_ENDPOINT_NUMBER 10
GyverDS18Single sensor(SENSOR_PIN);
Disp1637Colon display(DISPLAY_DATA, DISPLAY_CLOCK);
ZigbeeTempSensor zbTempSensor = ZigbeeTempSensor(TEMP_SENSOR_ENDPOINT_NUMBER);
void initZigbeeTempSensor() {
zbTempSensor.setManufacturerAndModel("Ineu", "DS18B20");
zbTempSensor.setMinMaxValue(-30, 40); // °C
zbTempSensor.setTolerance(1); // lowest possible value is 0.01°C
Zigbee.addEndpoint(&zbTempSensor); // Add endpoint to Zigbee Core
}
void startZigbee() {
Serial.println("Starting Zigbee...");
// When all EPs are registered, start Zigbee in End Device mode
if (!Zigbee.begin()) {
Serial.println("Zigbee failed to start!");
Serial.println("Rebooting...");
ESP.restart();
} else {
Serial.println("Zigbee started successfully!");
}
Serial.println("Connecting to network");
while (!Zigbee.connected()) {
Serial.print(".");
delay(500);
}
delay(500);
Serial.println("Connected");
}
void updateDisplay(float value) {
char str[5];
sprintf(str, "%4.0f", round(value));
display.setCursor(0);
display.print(str);
display.update();
}
void initDisplay() {
display.clear();
display.brightness(0);
}
void setup() {
Serial.begin(115200);
sensor.requestTemp(); // первый запрос на измерение
pinMode(BOOT_PIN, INPUT_PULLUP);
initDisplay();
initZigbeeTempSensor();
startZigbee();
/* Set reporting interval for temperature measurement in seconds, must be called after Zigbee.begin() */
/* min_interval and max_interval in seconds, delta (temp change in 0,1 °C) */
/* if min = 1 and max = 0, reporting is sent only when temperature changes by delta */
/* if min = 0 and max = 10, reporting is sent every 10 seconds or temperature changes by delta */
/* if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of temperature change */
zbTempSensor.setReporting(1, 0, 1);
}
void checkButton() {
if (digitalRead(BOOT_PIN) == LOW) {
// Key debounce handling
delay(100);
int startTime = millis();
while (digitalRead(BOOT_PIN) == LOW) {
delay(50);
if ((millis() - startTime) > 3000) {
// If key pressed for more than 3secs, factory reset Zigbee and reboot
Serial.println("Resetting Zigbee to factory and rebooting in 1s.");
delay(1000);
Zigbee.factoryReset();
}
}
zbTempSensor.reportTemperature();
}
}
void loop() {
checkButton();
if(sensor.ready() && sensor.readTemp()) {
float temperature = sensor.getTemp();
Serial.printf("Updated temperature sensor value to %.2f°C\r\n", temperature);
sensor.requestTemp(); // for the next reading
zbTempSensor.setTemperature(temperature);
updateDisplay(temperature);
}
delay(1000);
}