//i2c_tmp_zigbee_PJ85775P_m5nanoc6_1
#ifndef ZIGBEE_MODE_ED
#error "Zigbee end device mode is not selected in Tools->Zigbee mode"
#endif
//インクルド
#include "Zigbee.h"
#include <Wire.h>
//定義
// 定義エンドポイント番号
#define TEMP_SENSOR_ENDPOINT_NUMBER 10
// Zigbee 温度センサーオブジェクトを作成
ZigbeeTempSensor zbTempSensor = ZigbeeTempSensor(TEMP_SENSOR_ENDPOINT_NUMBER);
#define I2C_ADD 0x4F
// 温度データ変数
float temperature = 0.0;
// タスク同期フラグ
volatile bool temp_updated = false;
/************************ SHT30 温度読み取り関数(温度のみ)*****************************/
bool read_SHT30_Temperature(float &temp) { //温度の参照渡し
//サブアドレスの書き込み
Wire.beginTransmission(I2C_ADD); // transmit to device I2C_ADD
Wire.write(0); // sends one byte
Wire.endTransmission(); // stop transmitting
//2バイト読み込み
Wire.requestFrom(I2C_ADD, 2); // request 2 bytes from slave device I2C_ADD
unsigned short re = (Wire.read() << 8) | Wire.read(); // receive 2 byte as character
//re = 0xE700; //-25
//re = 0x1900; //25
//re = 0;
//re = 0xfff0; //-0.0625
//re = 0xffc0; //-0.250
//re = 0xff00; //-1.00
//re = 0x1940; //25.25
//re = 0xFFF0;
//re = 0x7FF0;
//re = 0x8000;
//printf("re = %d\n",re/16);
//温度を表示する
int a = (re >> 4) & 0xFFF; //4ビットシフトして有効12ビットを取り出す。
if (a > 0x7FF) { a = a - 0x1000; } //符号の処理 0x7FF(2047)より大きい、0x1000(4096)引く
a = a * 625; // a * (1 / 16 * 10000)
temp = a; //オートキャストして代入
temp = temp / 10000.0f;
return true;
} //read_SHT30_Temperature
/************************ 温度読み取りタスク *****************************/
static void temp_sensor_value_update(void *arg) {
for (;;) {
//センサーの読み取り
if (read_SHT30_Temperature(temperature)) {
Serial.printf("Temperature: %.2f°C\n", temperature);
zbTempSensor.setTemperature(temperature);
temp_updated = true; //センサーの読み取りが成功
} else {
//センサーの読み取りに失敗
Serial.println("Failed to read SHT30");
} //endif
delay(10000); //10秒待つ
} //for
} //temp_sensor_value_update
void setup() {
//ser
Serial.begin(115200);
delay(1000);
Serial.println("=== NanoC6 End Device + Unit ENV III (Temperature Only) ===");
Wire.begin(); //I2Cの初期化
Serial.println("I2C initialized");
delay(100);
zbTempSensor.setManufacturerAndModel("Espressif", "TempSensor");
zbTempSensor.setMinMaxValue(-40, 120);
zbTempSensor.setTolerance(1);
Zigbee.addEndpoint(&zbTempSensor);
Serial.println("Starting Zigbee End Device...");
//ジグビーの初期化
if (!Zigbee.begin()) {
Serial.println("Zigbee failed to start!");
Serial.println("Rebooting in 5 seconds...");
delay(5000);
ESP.restart(); //リブート
} //endif
Serial.println("Zigbee End Device started");
Serial.println("Connecting to network...");
//ジグビーの接続確認
while (!Zigbee.connected()) {
Serial.print(".");
delay(1000);
} //while
//接続されました。
Serial.println("\nConnected to Zigbee network!");
//センサー
xTaskCreate(temp_sensor_value_update, "temp_sensor_update", 4096, NULL, 10, NULL);
zbTempSensor.setReporting(1, 0, 1);
Serial.println("Temperature reporting configured");
} //setup
void loop() {
if (temp_updated) {
temp_updated = false;
zbTempSensor.reportTemperature(); //送信
Serial.println("Temperature reported to Coordinator");
} //endif
delay(100);
} //loop