/********************* Measurement **************************************/ void measurement() { #ifdef BME2_USE if (bme280Check) { bme.read(pressure, temperature, humidity, tempUnit, presUnit); yield(); delay(10); bme.read(pressure, temperature, humidity, tempUnit, presUnit); yield(); } #endif #ifdef SHT_USE if (sht30Check) { if (sht.readSample()) { yield(); humidity = sht.getHumidity(); yield(); temperature = sht.getTemperature(); yield(); } } #endif #ifdef SI7021_USE if (si7021Check) { // Measure Relative Humidity from the HTU21D or Si7021 humidity = THMeter.getRH(); yield(); delay(10); // Measure Temperature from the HTU21D or Si7021 temperature = THMeter.getTemp(); yield(); //ToDo Heater https://www.silabs.com/community/sensors/forum.topic.html/when_si7021_is_neede-8a2a if (humidity >= 80.0) { THMeter.heaterOn(); delay(50); //THMeter.heaterOff(); } } #endif #ifdef BH_USE if (bh1750Check) { //vislight = float(lightMeter.readLightLevel(true, false)); vislight = lightMeter.readLightLevel(true); yield(); if (vislight > 40000.0 ) { if (lightMeter.setMTreg(32)) { yield(); } } else { if (vislight > 10.0 && vislight <= 40000.0 && lightMeter.setMTreg(69)) { yield(); } } if (vislight < 10.0) { if (lightMeter.setMTreg(254)) { yield(); } } yield(); if (vislight < 0.0) { vislight = -1; } else { vislight = lightMeter.readLightLevel(true); yield(); } } #endif #ifdef VEML_USE if (veml6075Check) { //uvMeter.triggerMeasurement(); delay(10); uvMeter.poll(); yield(); uvalight = float(uvMeter.getUVA()); yield(); uvblight = float(uvMeter.getUVB()); yield(); uvi = uvMeter.getUVIndex(); yield(); uvMeter.sleep(true); yield(); } #endif #ifdef CCS_USE if (ccs811Check) { yield(); uint8_t ccs_error = 0; // set environmental data ccs.setEnvData(temperature, humidity); while (digitalRead(CCSINTERRUPT) == HIGH) { delay(100); Serial.print("."); } // Read the sensor data, this updates multiple fields // in the CCS811 library ccs.readAlgResultDataRegister(); if (ccs.hasERROR()) { ccs_error = ccs.getERROR_ID(); #ifdef SERIAL_DEBUG Serial.println(F("ERROR: CCS811 Error Flag Set")); Serial.print(F("INFO: CCS811 Error Register = ")); Serial.println(ccs_error); errorDecode(ccs_error); Serial.println(); #endif ccs811Check = false; } if (ccs811Check) { // Data is ready eco2 = float(ccs.geteCO2()); tvoc = float(ccs.getTVOC()); } #ifdef SERIAL_DEBUG //Serial.println(F("ERROR: CCS811 Data Not Ready")); #endif } #endif /******************** SGP30 ********************/ #ifdef SGP30_USE if (sgp30Check) { yield(); uint8_t sgp_error = 0; // set environmental data //sgp.setHumidity(humidity); sgp.measureAirQuality(); // Data is ready eco2 = float(sgp.CO2); tvoc = float(sgp.TVOC); } #ifdef SERIAL_DEBUG //Serial.println(F("ERROR: SGP30 Data Not Ready")); #endif #endif /************************** ADC Measurement *********************************/ #ifdef BATTERY_USE adc = analogRead(A0); #ifdef SERIAL_DEBUG Serial.println("ADC Read:\t" + String(adc) ); #endif yield(); delay(10); batt_str = String(float(voltageDivCorrelation(adc) - BATT_MEASUREMENT_OFFSET) / 100); batt_str.toCharArray(batt, batt_str.length() + 1); #ifdef SERIAL_DEBUG Serial.print("Battery Read:\t" + batt_str + " V" + "\t\t\t"); #endif #ifdef SERIAL_DEBUG Serial.print("Publish Battery: \t\t"); #endif if (! mqttClient.publish(BATTERY_FEED, batt, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif } yield(); mqttClient.loop(); yield(); delay(10); #endif /********************* Temperature **************************************/ #ifdef BME2_USE if (bme280Check) { #ifdef SERIAL_DEBUG Serial.print("Temperature:\t"); Serial.print(temperature); Serial.print(" °" + String(metric ? 'C' : 'F') ); Serial.print("\t\t\t"); #endif temp_str = String(temperature); temp_str.toCharArray(temp, temp_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 0, 128, " " + temp_str + "°" + String(metric ? 'C' : 'F')); #endif #ifdef SERIAL_DEBUG Serial.print("Publish Temperature: \t"); #endif if (! mqttClient.publish(TEMPERATURE_FEED, temp, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); /********************* Pressure **************************************/ #ifdef SERIAL_DEBUG Serial.print("Pressure:\t"); Serial.print(pressure); Serial.print(" hPa"); Serial.print("\t\t"); #endif pres_str = String(pressure); pres_str.toCharArray(pres, pres_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 16, 128, pres_str + " hPa"); #endif #ifdef SERIAL_DEBUG Serial.print("Publish Pressure: \t"); #endif if (! mqttClient.publish(PRESSURE_FEED, pres, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 16, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 16, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); /********************* Humidity **************************************/ #ifdef SERIAL_DEBUG Serial.print("Humidity:\t"); Serial.print(humidity); Serial.print(" %" ); Serial.print("\t\t\t"); #endif hum_str = String(humidity); hum_str.toCharArray(hum, hum_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 32, 128, " " + String(hum) + " %"); #endif #ifdef SERIAL_DEBUG Serial.print("Publish Humidity: \t"); #endif if (! mqttClient.publish(HUMIDITY_FEED, hum, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 32, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 32, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); } #endif /********************* Temperature **************************************/ #ifdef SHT_USE if (sht30Check) { #ifdef SERIAL_DEBUG Serial.print("Temperature:\t"); Serial.print(temperature); Serial.print(" °" + String(metric ? 'C' : 'F') ); Serial.print("\t\t\t"); #endif temp_str = String(temperature); temp_str.toCharArray(temp, temp_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 0, 128, " " + temp_str + "°" + String(metric ? 'C' : 'F')); #endif #ifdef SERIAL_DEBUG Serial.print("Publish Temperature: \t"); #endif if (! mqttClient.publish(TEMPERATURE_FEED, temp, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); /********************* Humidity **************************************/ #ifdef SERIAL_DEBUG Serial.print("Humidity:\t"); Serial.print(humidity); Serial.print(" %" ); Serial.print("\t\t\t"); #endif hum_str = String(humidity); hum_str.toCharArray(hum, hum_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 32, 128, " " + String(hum) + " %"); #endif #ifdef SERIAL_DEBUG Serial.print("Publish Humidity: \t"); #endif if (! mqttClient.publish(HUMIDITY_FEED, hum, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 32, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 32, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); } #endif //SHT_USE /********************* Temperature **************************************/ #ifdef SI7021_USE if (si7021Check) { #ifdef SERIAL_DEBUG Serial.print("Temperature:\t"); Serial.print(temperature); Serial.print(" °" + String(metric ? 'C' : 'F') ); Serial.print("\t\t\t"); #endif temp_str = String(temperature); temp_str.toCharArray(temp, temp_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 0, 128, " " + temp_str + "°" + String(metric ? 'C' : 'F')); #endif #ifdef SERIAL_DEBUG Serial.print("Publish Temperature: \t"); #endif if (! mqttClient.publish(TEMPERATURE_FEED, temp, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); /********************* Humidity **************************************/ #ifdef SERIAL_DEBUG Serial.print("Humidity:\t"); Serial.print(humidity); Serial.print(" %" ); Serial.print("\t\t\t"); #endif hum_str = String(humidity); hum_str.toCharArray(hum, hum_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 32, 128, " " + String(hum) + " %"); #endif #ifdef SERIAL_DEBUG Serial.print("Publish Humidity: \t"); #endif if (! mqttClient.publish(HUMIDITY_FEED, hum, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 32, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 32, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); } #endif /********************* UVA **************************************/ #ifdef VEML_USE if (veml6075Check) { #ifdef SERIAL_DEBUG Serial.print("UVA:\t\t"); Serial.print(uvalight); Serial.print(" Ctr per mW/cm²" ); Serial.print("\t"); #endif uva_str = String(uvalight); uva_str.toCharArray(uva, uva_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 32, 128, " " + String(uva) + " "); #endif #ifdef SERIAL_DEBUG Serial.print("Publish UVA: \t\t"); #endif if (! mqttClient.publish(UVA_FEED, uva, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 32, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 32, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); /********************* UVB **************************************/ #ifdef SERIAL_DEBUG Serial.print("UVB:\t\t"); Serial.print(uvblight); Serial.print(" Ctr per mW/cm²" ); Serial.print("\t"); #endif uvb_str = String(uvblight); uvb_str.toCharArray(uvb, uvb_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 32, 128, " " + String(uvb) + " "); #endif #ifdef SERIAL_DEBUG Serial.print("Publish UVB: \t\t"); #endif if (! mqttClient.publish(UVB_FEED, uvb, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 32, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 32, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); /********************* UVIndex **************************************/ #ifdef SERIAL_DEBUG Serial.print("UVIndex:\t\t"); Serial.print(uvi); Serial.print("\t\t\t"); #endif uvindex_str = String(uvi); uvindex_str.toCharArray(uvindex, uvindex_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 32, 128, " " + String(uvindex) + " "); #endif #ifdef SERIAL_DEBUG Serial.print("Publish UVIndex: \t\t"); #endif if (! mqttClient.publish(UVINDEX_FEED, uvindex, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 32, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 32, 128, "o"); #endif } mqttClient.loop(); delay(10); } #endif /********************* visible light **************************************/ #ifdef BH_USE if (bh1750Check && vislight >= 0.0) { #ifdef SERIAL_DEBUG Serial.print("Light:\t\t"); Serial.print(vislight); Serial.print(" lx" ); Serial.print("\t\t"); #endif light_str = String(int(vislight)); light_str.toCharArray(light, light_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 32, 128, " " + String(light) + " lx"); #endif #ifdef SERIAL_DEBUG Serial.print("\tPublish Light: \t\t"); #endif if (!mqttClient.publish(LIGHT_FEED, light, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 32, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 32, 128, "o"); #endif } mqttClient.loop(); delay(10); } #endif /********************* Absolute Humidity **************************************/ #ifdef SHT_USE if (sht30Check) { absHumidity = EnvironmentCalculations::AbsoluteHumidity(temperature, humidity, EnvironmentCalculations::TempUnit_Celsius); #ifdef SERIAL_DEBUG Serial.print("abs Humidity:\t"); Serial.print(absHumidity); Serial.print(" g/m^3"); Serial.print("\t\t"); #endif absHum_str = String(absHumidity); absHum_str.toCharArray(absHum, absHum_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 0, 128, " " + absHum_str + "g/m^3" ); #endif #ifdef SERIAL_DEBUG Serial.print("Publish abs Humidity: \t"); #endif if (! mqttClient.publish(ABSHUMIDITY_FEED, absHum, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); } #endif /********************* Absolute Humidity **************************************/ #ifdef SI7021_USE if (si7021Check) { absHumidity = EnvironmentCalculations::AbsoluteHumidity(temperature, humidity, EnvironmentCalculations::TempUnit_Celsius); #ifdef SERIAL_DEBUG Serial.print("abs Humidity:\t"); Serial.print(absHumidity); Serial.print(" g/m^3"); Serial.print("\t\t"); #endif absHum_str = String(absHumidity); absHum_str.toCharArray(absHum, absHum_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 0, 128, " " + absHum_str + "g/m^3" ); #endif #ifdef SERIAL_DEBUG Serial.print("Publish abs Humidity: \t"); #endif if (! mqttClient.publish(ABSHUMIDITY_FEED, absHum, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); } #endif /********************* Absolute Humidity **************************************/ #ifdef BME2_USE if (bme280Check) { absHumidity = EnvironmentCalculations::AbsoluteHumidity(temperature, humidity, EnvironmentCalculations::TempUnit_Celsius); #ifdef SERIAL_DEBUG Serial.print("abs Humidity:\t"); Serial.print(absHumidity); Serial.print(" g/m^3"); Serial.print("\t\t"); #endif absHum_str = String(absHumidity); absHum_str.toCharArray(absHum, absHum_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 0, 128, " " + absHum_str + "g/m^3" ); #endif #ifdef SERIAL_DEBUG Serial.print("Publish abs Humidity: \t"); #endif if (! mqttClient.publish(ABSHUMIDITY_FEED, absHum, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); } #endif /********************* eCO2 **************************************/ #ifdef CCS_USE //fix sensors internal wait delay if (ccs811Check && eco2 > 0.00) { #ifdef SERIAL_DEBUG Serial.print("eCO2:\t\t"); Serial.print(eco2); Serial.print(" ppm"); Serial.print("\t\t"); #endif eco2_str = String(eco2); eco2_str.toCharArray(eco2C, eco2_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 0, 128, " " + eco2_str + "ppm" ); #endif #ifdef SERIAL_DEBUG Serial.print("Publish eCO2: \t\t"); #endif if (! mqttClient.publish(ECO2_FEED, eco2C, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); } #endif /********************* TVOC **************************************/ #ifdef CCS_USE //fix sensors internal wait delay if (ccs811Check && eco2 > 0.00) { #ifdef SERIAL_DEBUG Serial.print("TVOC:\t\t"); Serial.print(tvoc); Serial.print(" ppb"); Serial.print("\t\t"); #endif tvoc_str = String(tvoc); tvoc_str.toCharArray(tvocC, tvoc_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 0, 128, " " + tvoc_str + "ppb" ); #endif #ifdef SERIAL_DEBUG Serial.print("Publish TVOC: \t\t"); #endif if (! mqttClient.publish(TVOC_FEED, tvocC, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); } #endif /********************* SGP30 eCO2 **************************************/ #ifdef SGP30_USE //fix sensors internal wait delay if (sgp30Check) { #ifdef SERIAL_DEBUG Serial.print("eCO2:\t\t"); Serial.print(eco2); Serial.print(" ppm"); Serial.print("\t\t"); #endif eco2_str = String(eco2); eco2_str.toCharArray(eco2C, eco2_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 0, 128, " " + eco2_str + "ppm" ); #endif #ifdef SERIAL_DEBUG Serial.print("Publish eCO2: \t\t"); #endif if (! mqttClient.publish(ECO2_FEED, eco2C, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); } #endif /********************* TVOC **************************************/ #ifdef SGP30_USE //fix sensors internal wait delay if (sgp30Check) { #ifdef SERIAL_DEBUG Serial.print("TVOC:\t\t"); Serial.print(tvoc); Serial.print(" ppb"); Serial.print("\t\t"); #endif tvoc_str = String(tvoc); tvoc_str.toCharArray(tvocC, tvoc_str.length() + 1); #ifdef OLED_OUTPUT display.drawStringMaxWidth(0, 0, 128, " " + tvoc_str + "ppb" ); #endif #ifdef SERIAL_DEBUG Serial.print("Publish TVOC: \t\t"); #endif if (! mqttClient.publish(TVOC_FEED, tvocC, true, 1) || !mqttClient.loop()) { #ifdef SERIAL_DEBUG Serial.println("Failed!"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "x"); #endif } else { #ifdef SERIAL_DEBUG Serial.println("OK"); #endif #ifdef OLED_OUTPUT display.drawStringMaxWidth(110, 0, 128, "o"); #endif } mqttClient.loop(); yield(); delay(10); } #endif /************************************ END *******************************/ mqttClient.loop(); yield(); delay(10); return; }