WiFi - Embedded Remote Supervisory System ? ERSS

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(&deg;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(&deg;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;
    }   
}