#ifndef _TEMPERATURE_H_ #define _TEMPERATURE_H_ mqttValueTiming timing_temperature_reservoir; mqttValueTiming timing_temperature_air; mqttValueTiming timing_temperature_case; #include #include void printAddress(DeviceAddress deviceAddress); //first address: 28FF6C1C7216058B //second address: #define ONE_WIRE_BUS 18 //GPIO pin #define TEMPERATURE_PRECISION 12 //max is 12 #define READINTERVAL_DS18B20 1000 //ms // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); #define TEMPMEAN_SIZE 16 uint16_t tempCmean_pos=0; // arrays to hold device addresses DeviceAddress thermometerReservoir={0x28,0xFF,0x30,0xBA,0x85,0x16,0x03,0xB5}; float tempC_reservoir; //last reading float tempCmean_reservoir_array[TEMPMEAN_SIZE]; float tempCmean_reservoir=DEVICE_DISCONNECTED_C; DeviceAddress thermometerAir={0x28,0xFF,0x6C,0x1C,0x72,0x16,0x05,0x8B}; float tempC_air; //last reading float tempCmean_air_array[TEMPMEAN_SIZE]; float tempCmean_air=DEVICE_DISCONNECTED_C; DeviceAddress thermometerCase={0x10,0x7E,0x22,0x99,0x01,0x08,0x00,0xA4}; float tempC_case; //last reading float tempCmean_case_array[TEMPMEAN_SIZE]; float tempCmean_case=DEVICE_DISCONNECTED_C; void temperature_setup() { timing_temperature_reservoir.minchange=0.0; timing_temperature_reservoir.maxchange=0.5; timing_temperature_reservoir.mintime=2*1000; timing_temperature_reservoir.maxtime=60*60*1000; timing_temperature_air.minchange=0.0; timing_temperature_air.maxchange=0.5; timing_temperature_air.mintime=2*1000; timing_temperature_air.maxtime=60*60*1000; timing_temperature_case.minchange=0.0; timing_temperature_case.maxchange=0.5; timing_temperature_case.mintime=2*1000; timing_temperature_case.maxtime=60*60*1000; //initialize mean array for (uint16_t i=0;ilast_read_ds18b20+READINTERVAL_DS18B20) { if (loopmillis>last_read_ds18b20+READINTERVAL_DS18B20*10) { //timeout Serial.println("Warn: Request Temperatures Timeout!"); flag_requestTemperatures=false; } if (!flag_requestTemperatures) { sensors.requestTemperatures(); //this takes ~600ms flag_requestTemperatures=true; } if (sensors.isConversionComplete()) { flag_requestTemperatures=false; last_read_ds18b20=loopmillis; tempC_reservoir = sensors.getTempC(thermometerReservoir); if (tempC_reservoir == DEVICE_DISCONNECTED_C) { Serial.print(" Error reading: "); printAddress(thermometerReservoir); }else{ tempCmean_reservoir_array[tempCmean_pos]=tempC_reservoir; if (isValueArrayOKf(tempCmean_reservoir_array,TEMPMEAN_SIZE,DEVICE_DISCONNECTED_C)) { tempCmean_reservoir=getMeanf(tempCmean_reservoir_array,TEMPMEAN_SIZE); }else{ tempCmean_reservoir=DEVICE_DISCONNECTED_C; } } /* temporarily disabled tempC_air = sensors.getTempC(thermometerAir); if (tempC_air == DEVICE_DISCONNECTED_C) { Serial.print(" Error reading: "); printAddress(thermometerAir); }else{ tempCmean_air_array[tempCmean_pos]=tempC_air; if (isValueArrayOKf(tempCmean_air_array,TEMPMEAN_SIZE,DEVICE_DISCONNECTED_C)) { tempCmean_air=getMeanf(tempCmean_air_array,TEMPMEAN_SIZE); }else{ tempCmean_air=DEVICE_DISCONNECTED_C; } } */ tempC_case = sensors.getTempC(thermometerCase); if (tempC_case == DEVICE_DISCONNECTED_C) { Serial.print(" Error reading: "); printAddress(thermometerCase); }else{ tempCmean_case_array[tempCmean_pos]=tempC_case; if (isValueArrayOKf(tempCmean_case_array,TEMPMEAN_SIZE,DEVICE_DISCONNECTED_C)) { tempCmean_case=getMeanf(tempCmean_case_array,TEMPMEAN_SIZE); }else{ tempCmean_case=DEVICE_DISCONNECTED_C; } } tempCmean_pos++; tempCmean_pos%=TEMPMEAN_SIZE; } } } void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { // zero pad the address if necessary if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } } #endif