// #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_RF24 // #define MY_RF24_PA_LEVEL RF24_PA_MIN // #define MY_RF24_PA_LEVEL RF24_PA_LOW #define MY_RF24_PA_LEVEL RF24_PA_HIGH //#define MY_RF24_PA_LEVEL RF24_PA_MAX #define MY_RF24_CHANNEL 14 // INFO coincell optimization // https://www.openhardware.io/view/398/NModule-Temperature-Humidity-Light-Door-sensor-shield#tabs-source #define MY_TRANSPORT_UPLINK_CHECK_DISABLED // Timeout for transport to be ready during initialization, after this duration, even if it didn't manage to enable transport the node will enter the loop() method // For battery powered nodes, I set this to 5000 so after 5 seconds it will stop eating the battery // 5s is long enough to connect to gateway so you should connect your node back to your computer and check the log if your node cannot connect #define MY_TRANSPORT_WAIT_READY_MS 5000 // no more than 5 seconds of waiting for transport to be ready // Reduce maximum delay before going to sleep, as we do not want to kill the battery if gateway is not available // Before going to sleep MySensors will make sure we don't have a connection problem to MySensors network // If this value is too high and you have connection problem, MySensors will never go to sleep and bye bye battery ... // If using AA/AAA batteries you can set a longer duration like 5000ms #define MY_SLEEP_TRANSPORT_RECONNECT_TIMEOUT_MS 2000 // #define MY_SIGNING_SIMPLE_PASSWD "C@KptBi1L@5op?8!" // #define MY_SECURITY_SIMPLE_PASSWD "C@KptBi1L@5op?8!" #include #include // https://github.com/enjoyneering/AHTxx/blob/main/examples/AHT10_Serial/AHT10_Serial.ino #include #include static const uint64_t UPDATE_INTERVAL = 900000; // (15min * 60sec = 900 seconds * 1000 milliseconds) #define CHILD_ID_HUM 0 #define CHILD_ID_TEMP 1 #define CHILD_ID_BAT 2 #define CHILD_ID_BATV 3 bool metric = true; float ahtTemp; //to store T/RH result float last_ahtTemp; //to store T/RH result float ahtHumi; float last_ahtHumi; int oldBatteryPcnt = 0; #define FULL_BATTERY 3 // 3V for 2xAA alkaline. Adjust if you use a different battery setup. MyMessage msgHum(CHILD_ID_HUM, V_HUM); MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); MyMessage msgBat(CHILD_ID_BAT, V_VAR1); MyMessage msgBatPrefix(CHILD_ID_BAT, V_UNIT_PREFIX); // Custom unit message. MyMessage msgBatV(CHILD_ID_BATV, V_VAR2); MyMessage msgBatVPrefix(CHILD_ID_BATV, V_UNIT_PREFIX); // Custom unit message. // AHT10 // #define AHT1X_POWER_ON_DELAY 100 //wait for AHT1x to initialize after power-on, in milliseconds // #define AHTXX_I2C_SPEED_HZ 400000 AHTxx aht10(0x38, AHT1x_SENSOR); //sensor address, sensor type // AHTxx aht10(0x00, 0x38); // Sleep between sendings to preserve coin cell void sleepForCoinCell() { sleep(400); } void presentation() { #ifdef MY_DEBUG Serial.println("- - - - - presentation - - - - -"); #endif // Send the sketch version information to the gateway sendSketchInfo("aht10", "0.5"); sleepForCoinCell(); // Register all sensors to gw (they will be created as child devices) present(CHILD_ID_TEMP, S_TEMP, "Temperature"); sleepForCoinCell(); present(CHILD_ID_HUM, S_HUM, "Humidity"); sleepForCoinCell(); present(CHILD_ID_BAT, S_CUSTOM, "Battery Percent"); sleepForCoinCell(); present(CHILD_ID_BATV, S_CUSTOM, "Battery Voltage"); sleepForCoinCell(); metric = getControllerConfig().isMetric; sleepForCoinCell(); } void setup() { #ifdef MY_DEBUG Serial.println("- - - - - setup - - - - -"); // Serial.println(AHT1x_SENSOR); // aht10.setType(AHT1x_SENSOR); #endif while (aht10.begin() != true) //for ESP-01 use aht10.begin(0, 2); { Serial.println(F("AHT1x not connected or fail to load calibration coefficient")); //(F()) save string to flash & keeps dynamic memory free delay(5000); } #ifdef MY_DEBUG Serial.println(F("AHT10 OK")); #endif } void loop() { #ifdef MY_DEBUG Serial.println("- - - - - loop - - - - -"); Serial.println("getting humidity & temperature"); #endif ahtTemp = aht10.readTemperature(); //read 6-bytes via I2C, takes 80 milliseconds #ifdef MY_DEBUG Serial.print(F("Temperature: ")); Serial.print(ahtTemp); Serial.println(F(" +-0.3C")); #endif // static MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); if (ahtTemp != last_ahtTemp) { send(msgTemp.set(ahtTemp, 1)); last_ahtTemp = ahtTemp; } sleep(2000); //measurement with high frequency leads to heating of the sensor, see NOTE ahtHumi = aht10.readHumidity(); //read another 6-bytes via I2C, takes 80 milliseconds #ifdef MY_DEBUG Serial.print(F("Humidity: ")); Serial.print(ahtHumi); Serial.println(F(" +-2%")); #endif // static MyMessage msgHum(CHILD_ID_HUM, V_HUM); if (ahtHumi != last_ahtHumi) { send(msgHum.set(ahtHumi, 1)); last_ahtHumi = ahtHumi; } sleep(2000); // get the battery Voltage long batteryMillivolts = hwCPUVoltage(); float batteryVolts = batteryMillivolts / 1000.0; int batteryPcnt = batteryMillivolts / FULL_BATTERY / 1000.0 * 100 + 0.5; #ifdef MY_DEBUG Serial.print("Battery voltage: "); Serial.print(batteryVolts); Serial.println("V"); Serial.print("Battery percent: "); Serial.print(batteryPcnt); Serial.println(" %"); #endif if (oldBatteryPcnt != batteryPcnt) { sendBatteryLevel(batteryPcnt); sleepForCoinCell(); oldBatteryPcnt = batteryPcnt; send(msgBatPrefix.set("%")); // Set custom unit. sleepForCoinCell(); send(msgBat.set(batteryPcnt, 1)); sleepForCoinCell(); send(msgBatVPrefix.set("V")); // Set custom unit. sleepForCoinCell(); send(msgBatV.set(batteryVolts, 1)); } // Sleep for a while to save energy sleep(UPDATE_INTERVAL); }