byte averageValue (byte maxIndex, byte array[]) //calculate average value from an array of bytes
{
float average = 0.0;
byte result;
for (int i=0;i<=maxIndex;i++)
{
average += array[i];
}
average/=(maxIndex+1);
result=constrain(result,0.0,100.0);
result = floor(average+0.5);
return result;
}
byte minimumValue (byte maxIndex, byte array[]) //calculate minimum value from an array of bytes
{
byte result;
result = array[0];
for (int i=1;i<=maxIndex;i++)
{
if(array[i]<result) result=array[i];
}
return result;
}
byte maximumValue (byte maxIndex, byte array[]) //calculate maximum value from an array of bytes
{
byte result;
result = array[0];
for (int i=1;i<=maxIndex;i++)
{
if(array[i]>result) result=array[i];
}
return result;
}
void tempcalc() //calculate temperature values
{
float temp = 0.0;
temp = floor(temperature*10.0+0.5);
temp = constrain(temp,166,421);
temperature1Minute[temp1MinIndex]=map(temp,166,421,0,255);
averageTemp1Minute = averageValue(5, temperature1Minute);
maxTemp1Minute = maximumValue(5, temperature1Minute);
minTemp1Minute = minimumValue(5, temperature1Minute);
if (temp1MinIndex == 5)
{
temp1MinIndex = 0; //reset index
temperature1Hour[temp1HourIndex] = averageTemp1Minute;
if (fillUpArray) fillarrays();//fill arrays with values 1 min after startup
averageTemp1Hour = averageValue(59, temperature1Hour);
maxTemp1Hour = maximumValue(59, temperature1Hour);
minTemp1Hour = minimumValue(59, temperature1Hour);
if (temp1HourIndex == 59) temp1HourIndex = 0;
else temp1HourIndex++;
}
else temp1MinIndex ++;
}
void fillarrays() //fills arrays with first measurement 1 min after boot-up, run only once
{
for (int i=0;i<=59;i++)
{
humidity1Hour[i]=humidity1Hour[0];
}
for (int i=0;i<=23;i++)
{
humidity24Hours[i]=humidity1Hour[0];
}
averageHum24Hours = averageValue (23, humidity24Hours); //calculate 24 h values right after boot-up
minHum24Hours = minimumValue (23, humidity24Hours);
maxHum24Hours = maximumValue (23, humidity24Hours);
for (int i=1;i<=59;i++)
{
temperature1Hour[i]=temperature1Hour[0];
}
fillUpArray = false;
}
void lcdprint() //display temperature, humidity and time online
{
timevalue = curMillis - lcdMillis;
if (timevalue > LCDTEMP1 && timevalue < LCDTEMP2 && lcdState!=0) //temp display
{
showString(PSTR("?f"));
showString(PSTR("Temperatuur "));
float temp = 0.0;
temp = map(averageTemp1Minute,0,255,166,421)/10.0;
Serial.print(temp,1);
showString(PSTR("?0C** Nu "));
Serial.print(temperature);
showString(PSTR("?0C **"));
showString(PSTR("Max 1m: "));
temp = map(maxTemp1Minute,0,255,166,421)/10.0;
Serial.print(temp,1);
showString(PSTR("?0C?n"));
showString(PSTR("Min 1m: "));
temp = map(minTemp1Minute,0,255,166,421)/10.0;
Serial.print(temp,1);
showString(PSTR("?0C"));
lcdState=0;
}
if (timevalue > LCDTEMP2 && timevalue < LCDHUM1 && lcdState!=1)
{
float temp = 0.0;
showString(PSTR("?f"));
showString(PSTR("Gem temperatuur 1h: ** "));
temp = map(averageTemp1Hour,0,255,166,421)/10.0;
Serial.print(temp,1);
showString(PSTR("?0C **"));
showString(PSTR("Max: "));
temp = map(maxTemp1Hour,0,255,166,421)/10.0;
Serial.print(temp,1);
showString(PSTR("?0C?n"));
showString(PSTR("Min: "));
temp = map(minTemp1Hour,0,255,166,421)/10.0;
Serial.print(temp,1);
showString(PSTR("?0C"));
lcdState=1;
}
if (timevalue > LCDHUM1 && timevalue < LCDHUM2 && lcdState!=2)
{ //display rh
float temp = 0.0;
showString(PSTR("?f"));
showString(PSTR("Rel Luchtvochtigheid"));
Serial.print(averageHum1Min);
showString(PSTR("%"));
showString(PSTR(" Nu "));
Serial.print(humidity);
showString(PSTR("%freeRAM "));
Serial.print(freeMemory());
showString(PSTR(" / 2048"));
//showString(PSTR("%Setpoint:?n"));
//showString(PSTR("** "));
//Serial.print(map(Setpoint,0,1023,0,100));
//showString(PSTR("% **"));
lcdState=2;
}
if(timevalue > LCDHUM2 && timevalue < LCDTURN && lcdState!=3)
{
byte temp = 0;
showString(PSTR("?f"));
showString(PSTR("1 uur: "));
temp = averageHum1Hour;
Serial.print(averageHum1Hour);
showString(PSTR("%?n"));
showString(PSTR("Min: "));
temp = minHum1Hour;
Serial.print(minHum1Hour);
showString(PSTR("% Max: "));
temp = maxHum1Hour;
Serial.print(temp);
showString(PSTR("%"));
showString(PSTR("24 uur: "));
temp = averageHum24Hours;
Serial.print(temp);
showString(PSTR("%?n"));
showString(PSTR("Min: "));
temp = minHum24Hours;
Serial.print(temp);
showString(PSTR("%"));
showString(PSTR(" Max: "));
temp = maxHum24Hours;
Serial.print(temp);
showString(PSTR("%"));
lcdState=3;
}
if(timevalue > LCDTURN && timevalue < LCDPID && lcdState!=4)
{ //display time incubator has been online
showString(PSTR("?f"));
showString(PSTR("freeRAM "));
Serial.print(freeMemory());
showString(PSTR(" / 2048"));
showString(PSTR("?n Kast staat al?n"));
//showString(PSTR(" "));
Serial.print(curMillis/86400000);
showString(PSTR("d "));
Serial.print((curMillis%86400000)/3600000);
showString(PSTR("h "));
Serial.print((curMillis%3600000)/60000);
showString(PSTR("m aan?n"));
//showString(PSTR("**** aan *****"));
showString(PSTR("freeRAM "));
Serial.print(freeRam());
showString(PSTR(" / 2048"));
lcdState=4;
}
if(timevalue > LCDPID && timevalue < LCDSTOP && lcdState!=5)
{
showString(PSTR("?f"));
showString(PSTR("Instellingen RL PID "));
showString(PSTR("P="));
float temp = 0.0;
temp = PTERM;
Serial.print(temp);
showString(PSTR(" I="));
temp = ITERM;
Serial.print(temp);
showString(PSTR("?n"));
showString(PSTR("D="));
temp = DTERM;
Serial.print(temp);
showString(PSTR("?n"));
showString(PSTR(" Mist aan "));
temp = Output*100.0/windowSize;
Serial.print(temp);
showString(PSTR(" %"));
lcdState=5;
}
if(curMillis - lcdMillis > LCDSTOP) lcdMillis = curMillis;
}
void showString (PGM_P s) //store strings in flash memory
{
char c;
while ((c = pgm_read_byte(s++)) != 0)
Serial.print(c);
}
int freeRam () //returns free RAM
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}