Source Code Part #2
//draw status table in html
void draw_status()
{
WiServer.print_P(ht_table_green);
WiServer.print_P(ht_table_row); WiServer.print("<caption>"); WiServer.print_P(ht_status_header); WiServer.print_P("</caption>"); WiServer.print_P(ht_table_endrow);
WiServer.print ("<tr><td>Temperatura atual(°C)</td><td>"); WiServer.print (dInputTemperature); WiServer.print_P(ht_table_endcol); WiServer.print_P(ht_table_endrow);
WiServer.print ("<tr><td>Cooler(0 a 255)</td><td>"); WiServer.print (fan_speed); WiServer.print_P(ht_table_endcol); WiServer.print_P(ht_table_endrow);
WiServer.print_P(ht_endtable);
}
//draw the main page in html
void drawMainPage()
{
char buffer[50];
WiServer.print_P(htmlreader);
WiServer.print_P(ht_script);
WiServer.print_P(ht_endhead);
WiServer.print_P(ht_body);
WiServer.print_P(ht_form);
WiServer.print_P(ht_table_gray);
WiServer.print_P(ht_table_row); WiServer.print_P(ht_table_header); WiServer.print_P(ht_painel); WiServer.print_P(ht_table_endheader); WiServer.print_P(ht_table_endrow);
sresprintf(buffer, dSetPointTemperature);
writeInputHTM("Temperatura(°C)", "text", "SetPointTemperature", buffer );
WiServer.print_P(ht_table_row); WiServer.print_P(ht_table_header); WiServer.print_P(ht_pid_header); WiServer.print_P(ht_table_endheader); WiServer.print_P(ht_table_endrow);
sresprintf(buffer, lightKc); writeInputHTM("Proporcional", "text", "KcLight", buffer);
sresprintf(buffer, lightTauI); writeInputHTM("Integral", "text", "TauILight", buffer);
sresprintf(buffer, lightTauD); writeInputHTM("Derivativo", "text", "TauDLight", buffer);
WiServer.print_P(ht_submit);
WiServer.print_P(ht_endtable);
WiServer.print_P(ht_endform);
WiServer.print_P(ht_form);
WiServer.print("<div id=\"status\">");
draw_status();
WiServer.print("</div>");
WiServer.print_P(ht_endform);
WiServer.print_P(ht_credits);
WiServer.print_P(ht_endbody);
WiServer.print_P(ht_endhtml);
}
//get the html parameter value by name
boolean getDoubleParam(char* szParam, char* szName, double &output)
{
char * pos;
pos = strstr(szParam, szName);
if( pos )
{
int name_len = strlen(szName);
char * p_sep = strstr(pos, "&");
char buffer[255];
pos += name_len + 1;
int value_len = p_sep - pos;
strncpy(buffer, pos, value_len);
buffer[value_len] = 0;
output = atof(buffer);
return true;
}
return false;
}
//called by http request, draw the main page and/or get the parameters
boolean sendSSREPage(char* URL)
{
if( strcmp(URL, "/") == 0)
{
//if this is root call, call main page
drawMainPage();
return true;
} else {
if( strcmp(URL, "/status.htm") == 0)
{
draw_status();
}
else
{
//detect vars and values
double dValue;
if (getDoubleParam(URL, "SetPointTemperature", dValue) dSetPointTemperature = dValue;
if (getDoubleParam(URL, "KcLight", dValue)) lightKc = dValue;
if (getDoubleParam(URL, "TauILight", dValue)) lightTauI = dValue;
if (getDoubleParam(URL, "TauDLight", dValue)) lightTauD = dValue;
temperaturePID.SetTunings(lightKc, lightTauI, lightTauD);
drawMainPage();
}
return true;
}
return false;
}
//Startup funcion
void setup()
{
#ifdef _USE_SERIAL
Serial.begin(9600);
#endif //_USE_SERIAL
WiServer.init(sendSSREPage);
//PID controls
dSetPointTemperature = 45;
temperatureServo.attach( PIN_OUTPUT_PWM_LIGHT );
temperaturePID.SetMode(AUTO);
temperaturePID.SetInputLimits(0, 100); //set input to temperature range
temperaturePID.SetOutputLimits(0,255);
temperaturePID.SetSampleTime(500);
temperaturePID.SetTunings(lightKc, lightTauI, lightTauD);
}
//main loop
void loop()
{
WiServer.server_task();
//read temperature from LM35
int temperature = analogRead(PIN_INPUT_LM35);
//convert from sensor range to Celcius
double dTempCelcius = map(temperature, 0,1023, 0, 50000);
dInputTemperature = (dTempCelcius /100.00)+2.6;
//run PIDs
temperaturePID.Compute();
//set pwm value to temperature ligth
int out_servo = map(dOutputTemperature, 0, 255, 0, 180);
temperatureServo.write(out_servo);
//set pwm value to fan speed
double dOutputFan = dInputTemperature - dSetPointTemperature;
fan_speed = 0;
if (dOutputFan>2)
{
fan_speed = map(dOutputFan, 2, 6, 100, 255);
fan_speed = constrain(fan_speed, 100, 255);
}
else
fan_speed = 0;
analogWrite( PIN_OUTPUT_PWM_FAN, fan_speed );
if (--nLoopCount == 0);
{
#ifdef _USE_SERIAL
Serial.print("A/D temp.="); Serial.print(temperature);
Serial.print("temp="); Serial.print(dInputTemperature);
Serial.print(" Setpoint="); Serial.print(dSetPointTemperature);
Serial.print(" light position="); Serial.print(out_servo);
Serial.print(" fan speed="); Serial.println(fan_speed);
#endif //_USE_SERIAL
nLoopCount = N_LOOP_FOR_SERIAL;
}
}