|
|
@ -155,7 +155,7 @@ char HeaterSi7021 (float humidity) |
|
|
|
// If Smart heater algorithm is disabled, reset the statemachine forever.
|
|
|
|
// If Smart heater algorithm is disabled, reset the statemachine forever.
|
|
|
|
// TempValid bit is also forced to 1, but it could be that we just came out of a heater period.
|
|
|
|
// TempValid bit is also forced to 1, but it could be that we just came out of a heater period.
|
|
|
|
// We assume that the client on the other side of the ModBus is smart enough to understand.
|
|
|
|
// We assume that the client on the other side of the ModBus is smart enough to understand.
|
|
|
|
if (MeasuredData.StatusBits & 0x04) |
|
|
|
if ( (MeasuredData.StatusBits & 0x04) == 0) |
|
|
|
state = 0; |
|
|
|
state = 0; |
|
|
|
|
|
|
|
|
|
|
|
switch (state) |
|
|
|
switch (state) |
|
|
@ -172,6 +172,7 @@ char HeaterSi7021 (float humidity) |
|
|
|
case 1: |
|
|
|
case 1: |
|
|
|
if (humidity >= 95) { |
|
|
|
if (humidity >= 95) { |
|
|
|
if ( (millis() - StatemachineTimer) >= 3.6e+6 ) { |
|
|
|
if ( (millis() - StatemachineTimer) >= 3.6e+6 ) { |
|
|
|
|
|
|
|
//if ( (millis() - StatemachineTimer) >= 300000 ) { // short delay for testing
|
|
|
|
Heater = 1; |
|
|
|
Heater = 1; |
|
|
|
TempValid = 0; |
|
|
|
TempValid = 0; |
|
|
|
StatemachineTimer = millis(); |
|
|
|
StatemachineTimer = millis(); |
|
|
@ -185,9 +186,9 @@ char HeaterSi7021 (float humidity) |
|
|
|
}
|
|
|
|
}
|
|
|
|
break; |
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
// Heater is now on, let the sensor cook for 10 minutes
|
|
|
|
// Heater is now on, let the sensor cook for 5 minutes
|
|
|
|
case 2: |
|
|
|
case 2: |
|
|
|
if ( (millis() - StatemachineTimer) >= 600000 ) { |
|
|
|
if ( (millis() - StatemachineTimer) >= 300000 ) { |
|
|
|
StatemachineTimer = millis(); |
|
|
|
StatemachineTimer = millis(); |
|
|
|
Heater = 0; |
|
|
|
Heater = 0; |
|
|
|
state = 3; |
|
|
|
state = 3; |
|
|
@ -196,9 +197,9 @@ char HeaterSi7021 (float humidity) |
|
|
|
} |
|
|
|
} |
|
|
|
TempValid = 0; |
|
|
|
TempValid = 0; |
|
|
|
break; |
|
|
|
break; |
|
|
|
// Heater is now off, let the sensor cool for 10 minutes
|
|
|
|
// Heater is now off, let the sensor cool for 15 minutes
|
|
|
|
case 3: |
|
|
|
case 3: |
|
|
|
if ( (millis() - StatemachineTimer) >= 600000 ) { |
|
|
|
if ( (millis() - StatemachineTimer) >= 900000 ) { |
|
|
|
TempValid = 1; // Sensor cooled, so we can take a valid temperature reading
|
|
|
|
TempValid = 1; // Sensor cooled, so we can take a valid temperature reading
|
|
|
|
if (humidity >= 95) { |
|
|
|
if (humidity >= 95) { |
|
|
|
// Humidity still above 95%, repeat heating/cooling
|
|
|
|
// Humidity still above 95%, repeat heating/cooling
|
|
|
@ -229,27 +230,31 @@ char HeaterSi7021 (float humidity) |
|
|
|
void ReadSi7021 (void) |
|
|
|
void ReadSi7021 (void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
char result=0x2; |
|
|
|
char result=0x2; |
|
|
|
|
|
|
|
float humidity; |
|
|
|
|
|
|
|
|
|
|
|
si7021.triggerMeasurement(); |
|
|
|
si7021.triggerMeasurement(); |
|
|
|
si7021.getHumidity(MeasuredData.Humidity); |
|
|
|
si7021.getHumidity(humidity); |
|
|
|
|
|
|
|
|
|
|
|
if (MeasuredData.Humidity>100 || MeasuredData.Humidity<0) |
|
|
|
if (humidity>100 || humidity<0) |
|
|
|
MeasuredData.Humidity = 100; |
|
|
|
humidity = 100; |
|
|
|
|
|
|
|
|
|
|
|
//If humidity is larger than 95% switch on heater to get more acurate measurement and prevent memory offset
|
|
|
|
//If humidity is larger than 95% switch on heater to get more acurate measurement and prevent memory offset
|
|
|
|
result = HeaterSi7021(MeasuredData.Humidity); |
|
|
|
result = HeaterSi7021(humidity); |
|
|
|
MeasuredData.StatusBits &= 0xFFFC; // Reset heater status bits to zero
|
|
|
|
MeasuredData.StatusBits &= 0xFFFC; // Reset heater status bits to zero
|
|
|
|
MeasuredData.StatusBits |= result; // And set the proper bits to one if there are any. The result is we copied the status bits to the register
|
|
|
|
MeasuredData.StatusBits |= result; // And set the proper bits to one if there are any. The result is we copied the status bits to the register
|
|
|
|
|
|
|
|
|
|
|
|
// Scale for more decimal positions when converted to integer value for ModBus
|
|
|
|
|
|
|
|
MeasuredData.Humidity *= 100; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Temperture readings are valid (as the sensor is not heated)
|
|
|
|
// Temperture and humidity readings are valid (as the sensor is not heated)
|
|
|
|
if (result & 0x2) { |
|
|
|
if (result & 0x2) { |
|
|
|
si7021.getTemperature(MeasuredData.Temperature); |
|
|
|
si7021.getTemperature(MeasuredData.Temperature); |
|
|
|
// Scale for more decimal positions when converted to integer value for ModBus
|
|
|
|
// Scale for more decimal positions when converted to integer value for ModBus
|
|
|
|
MeasuredData.Temperature *= 100; |
|
|
|
MeasuredData.Temperature *= 100; |
|
|
|
//Serial.print(F("Valid temp"));
|
|
|
|
//Serial.print(F("Valid temp"));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
si7021.getHumidity(MeasuredData.Humidity); |
|
|
|
|
|
|
|
if (MeasuredData.Humidity>100 || MeasuredData.Humidity<0) |
|
|
|
|
|
|
|
MeasuredData.Humidity = 100; |
|
|
|
|
|
|
|
// Scale for more decimal positions when converted to integer value for ModBus
|
|
|
|
|
|
|
|
MeasuredData.Humidity *= 100;
|
|
|
|
} |
|
|
|
} |
|
|
|
// Statemachine thinks it is time to switch on the heater
|
|
|
|
// Statemachine thinks it is time to switch on the heater
|
|
|
|
if (result & 0x1) { |
|
|
|
if (result & 0x1) { |
|
|
|