Environmental Monitor & Controller with web telemetry (Monitor & Controlador ambiental con...

32
UNIVERSIDAD ANDRÉS BELLO FACULTAD DE INGENIERÍA INGENIERÍA EN AUTOMATIZACION Y ROBOTICA PID con telemetría web Profesor: Néstor Palominos Integrantes -Diego Molina -Camilo Navarro -Marcelo Tapia

description

ENG:This is a university project which is still in development.For this early delivery we focus only on the telemetry of a PID controller via web.The aim is to create a platform to monitor and control via web, environmental conditions to optimize crops and the resources they require in limited space, for both plants and edible mushrooms, in an accessible and simplified way for the general public.ES:Este es un proyecto para la universidad que aún continúa en desarrollo.Para esta entrega temprana nos concentramos únicamente en la telemetría de un controlador PID vía web.El fin es crear una plataforma para monitorear y controlar vía web, variables ambientales en espacios reducidos para optimizar cultivos y los recursos que requieren, tanto de plantas como de setas comestibles, de forma accesible y simplificada para el público en general.

Transcript of Environmental Monitor & Controller with web telemetry (Monitor & Controlador ambiental con...

Page 1: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

UNIVERSIDAD ANDRÉS BELLOFACULTAD DE INGENIERÍA

INGENIERÍA EN AUTOMATIZACION Y ROBOTICA

PID con telemetría web

Profesor:

Néstor Palominos

Integrantes-Diego Molina

-Camilo Navarro-Marcelo Tapia

SANTIAGO – CHILENoviembre, 2015

Page 2: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

IntroducciónA lo largo de la historia el hombre ha buscado mejorar y optimizar todos los procesos tanto sociales como industriales, diseñando distintos métodos y medios para esto. La parte industrial por otra parte se ha dirigido netamente a la parte de automatizar sus procesos, volviendo más óptima su producción. Esto nos lleva a observar las distintas filosofías de control dentro de la industria.En el afán de poder mantener las variables a controlar con un error mínimo antes de poder ser corregido con el controlador es que nace el controlador PID, el cual considera los errores actuales, los pasados y predice los futuros, manteniéndolos al mínimo durante el proceso.

Objetivos del proyecto

Construir un controlador PID con Arduino el cual se maneje a través de la web Configurar un Cliente-Servidor con un módulo wifi y Arduino, el cual envié y

reciba información de parámetros para el PID Crear red LAN para la conexión entre el Arduino (módulo wifi) y un PC para

poder implementar el envió de información entre ambos Crear una interfaz visual con jscript e implementarla en un servidor montado

en un PC

Page 3: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

¿Qué es un sistema de control PID?

El control PID es un mecanismo de control que a través de un lazo de retroalimentación permite regular una variable durante un proceso, El controlador PID calcula la diferencia entre nuestra variable real contra la variable deseada. El algoritmo de control incluye tres parámetros fundamentales: Ganancia proporcional (P), Integral (I) y Derivativo (D).

El parámetro Proporcional (P) mide la diferencia entre el valor actual y el set-point (Valor deseado) y aplica el cambio.

El parámetro Integral (I) se refiere al tiempo que se toma para llevar a cabo acción correctiva. Mientras el valor sea más pequeño, el ajuste es más rápido pero puede causar inestabilidad en el sistema.

El parámetro Derivativo (D) emite una acción predictiva, es decir, prevé el error e inicia una acción oportuna. Responde a la velocidad del cambio del error y produce una corrección significativa antes de que la magnitud del error se vuelva demasiado grande.

La correcta sintonización o programación de estos parámetros nos ayuda a controlar de manera efectiva nuestra variable.

Page 4: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

Componentes a utilizar

Arduino nano

Microcontrolador: Atmel ATmega168 or ATmega328 Voltaje de operación (nivel lógico): 5 V Voltaje de alimentación: 7-12 V Pines digitales I/O 14 (6 PWM) Pines Análogos 8 Memoria flash 32 KB (ATmega328) EEPROM 1 KB (ATmega328) Velocidad reloj 16 MHz Dimensiones 0.73" x 1.70" Largo 45 mm Ancho 18 mm Peso 5 g

Módulo Wifi sp8266 (esp-07)

Page 5: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

Protocolos soportados: 802.11 b/g/n

Wi-Fi Direct (P2p), Soft Access Point

Stack TCP/IP integrado

PLL, reguladores y unidades de manejo de energía integrados

Potencia de salida: +19.5dBm en modo 802.11b

Sensor de temperatura integrado

Consumo en modo de baja energía: <10 uA

Procesador integrado de 32 bits, puede ser utilizado como procesador de

aplicaciones

Termistor

Page 6: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

Temperatura de Trabajo Máx.: 200°C Temperatura de Trabajo Mín.: -55°C Rango de Producto: B57560G Series Resistencia: 100kohm Resistencia a Potencia Cero a 25°C: 100kohm

Ftdi

Un único chip maneja tanto el USB como la tranferencia serie asíncrona.

Tasa de tranferencia de 300 Baudios a 3M Baudio (RS422/RS485 con niveles TTL).

Tasa de tranferencia de 300 Baudios a 1M Baudio (RS232). Soporte para USB suspend/resume a través de los pines SLEEP# y RI#. Soporte para alimentar dispositivos directamente del bus USB a través del pin

PWREN#. Circuito Power-On-Reset incluido. Tensión de alimentación 3,3V a 5,25V. Compatible con el controlador de host UHCI/OHCI/EHCI.

Page 7: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

Esquemáticos de conexión

Esquemático de funcionamiento

Conexión del módulo wifi al Arduino

Sensor(termistor)

Controlador PID(Arduino nano)

Módulo Wifi(sp8266 (esp-

07))

LAN

Servidor

Page 8: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)
Page 9: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

Conexión del Arduino con el PID

Page 10: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)
Page 11: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)
Page 12: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)
Page 13: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

Esquema de conexión paket tracer

Page 14: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

Protocolos de comunicación Json

JavaScript Object Notation, es un formato ligero para el intercambio de datos. JSON es un subconjunto de la notación literal de objetos de JavaScript que no requiere el uso de XML.Se usa especialmente como alternativa a XML en AJAX. Una de las supuestas ventajas de JSON sobre XML como formato de intercambio de datos en este contexto es que es mucho más sencillo escribir un analizador sintáctico (parser) de JSON.

Java Script

JavaScript es un lenguaje de programación que se utiliza principalmente para crear páginas web dinámicas.

Una página web dinámica es aquella que incorpora efectos como texto que aparece y desaparece, animaciones, acciones que se activan al pulsar botones y ventanas con mensajes de aviso al usuario.

Técnicamente, JavaScript es un lenguaje de programación interpretado, por lo que no es necesario compilar los programas para ejecutarlos. En otras palabras, los programas escritos con JavaScript se pueden probar directamente en cualquier navegador sin necesidad de procesos intermedios.

Page 15: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

Códigos de programación Código del módulo Wifi

#include <ESP8266WiFi.h>#include <WiFiClient.h> #include <ESP8266WebServer.h>#include <DNSServer.h>#include <FS.h>#include <Ticker.h>

//#define DEBUG // Comentado default

// CONFIGURACIONES PRE-PROGRAMABLES#define SERIAL_SPEED 115200#define AP_IP 192, 168, 4, 1 // Usar comas en vez de puntos#define AP_MASK 255, 255, 255, 0 // Usar comas en vez de puntos#define WEB_PORT 80#define DNS_PORT 53#define DNS_TTL 300 // Time To Load#define PAGE_REFRESH_TIME 10 // Segundos#define GREEN_HOST "green.com"

// CONFIGURACIONES PROGRAMABLESchar CONFIG_AP_SSID[32] = "INDOOR";char CONFIG_AP_PSWD[64] = "12345678";char CONFIG_WEB_HOST[32] = "*";char CONFIG_STA_SSID[32] = "GPT2";char CONFIG_STA_PSWD[64] = "otrotipo";

// Variables de estadochar STATUS_NETWORK = 0;char STATUS_GREEN = 0;

// Valores sensoresfloat VALUE_TEMPERATURE = 22;float VALUE_HUMIDITY = 45;float VALUE_ILLUMINANCE = 67;float VALUE_GROUND_MOISTURE = 31;float VALUE_PRESSURE = 760;float VALUE_PH = 6.2;float VALUE_CO2 = 452;float VALUE_EC = 1.2;

// GlobalesESP8266WebServer webServer(WEB_PORT);DNSServer dnsServer;Ticker updater;

void setup() { delay(200);

// Comuncacion Serie Serial.begin(SERIAL_SPEED);

// Activa del modo Access Point y Station al mismo tiempo

WiFi.mode(WIFI_AP_STA); // Configuracion del Punto de Acceso WiFi.softAPConfig(IPAddress(AP_IP), IPAddress(AP_IP), IPAddress(AP_MASK)); WiFi.softAP(CONFIG_AP_SSID, CONFIG_AP_PSWD);

// Configuracion Servidor DNS dnsServer.start(DNS_PORT, CONFIG_WEB_HOST, IPAddress(AP_IP)); dnsServer.setTTL(DNS_TTL);

// Configuracion Sistema de Arcvhivos SPIFFS SPIFFS.begin();

// Configuracion Servidor Web webServer.on("/data", webRequestGetData); webServer.onNotFound(webRequestAny); webServer.begin();

// Configuracion Estacion WiFi WiFi.begin(CONFIG_STA_SSID, CONFIG_STA_PSWD); updater.attach(2.0, [](){ // Actualizamos cada 2 segundos el estado de conexion del WiFi STATUS_NETWORK = (WiFi.status() == WL_CONNECTED)?1:0; });}

void loop() { dnsServer.processNextRequest();

webServer.handleClient();}

/* De esta manera podremos acceder a cualquier archivo * del directorio sin tener que hacer un metodo para cada uno */void webRequestAny() { String path = webServer.uri(); if(path.endsWith("/")) path += "index.htm"; // Si se pide el root se envia index String contentType = getContentType(path); if(SPIFFS.exists(path)) { File file = SPIFFS.open(path, "r"); webServer.streamFile(file, contentType); file.close(); } else webServer.send(404, "text/html", "<strong>404</strong><br>File Not Found");}

void webRequestGetData() {

Page 16: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

// Enviamos la peticion Serial.print("GETDATA");

// Esperamos la respuesta while (!Serial.available()) {}

String response = Serial.readString(); webServer.send(200, "application/json", response); /* // Se usa el constructor String(valor, base) porque si el valor es 0 lo entiende como null terminator String json = "{"; json += "\"page_refresh_time\":" + String(PAGE_REFRESH_TIME, 10); json += ", \"status_network\":" + String(STATUS_NETWORK, 10); json += ", \"status_green\":" + String(STATUS_GREEN, 10); json += ", \"value_temperature\":" + String(VALUE_TEMPERATURE, 1); json += ", \"value_humidity\":" + String(VALUE_HUMIDITY, 1); json += ", \"value_illuminance\":" + String(VALUE_ILLUMINANCE, 1); json += ", \"value_ground_moisture\":"+ String(VALUE_GROUND_MOISTURE, 1); json += ", \"value_pressure\":" + String(VALUE_PRESSURE, 0); json += ", \"value_ph\":" + String(VALUE_PH, 2); json += ", \"value_co2\":" + String(VALUE_CO2, 0);

json += ", \"value_ec\":" + String(VALUE_EC, 2); json += "}"; webServer.send(200, "application/json", json); json = String(); */}

String getContentType(String filename){ if(filename.endsWith(".htm")) return "text/html"; else if(filename.endsWith(".html")) return "text/html"; else if(filename.endsWith(".css")) return "text/css"; else if(filename.endsWith(".js")) return "application/javascript"; else if(filename.endsWith(".png")) return "image/png"; else if(filename.endsWith(".gif")) return "image/gif"; else if(filename.endsWith(".jpg")) return "image/jpeg"; else if(filename.endsWith(".ico")) return "image/x-icon"; else if(filename.endsWith(".xml")) return "text/xml"; else if(filename.endsWith(".pdf")) return "application/x-pdf"; else if(filename.endsWith(".zip")) return "application/x-zip"; else if(filename.endsWith(".gz")) return "application/x-gzip"; return "text/plain";}

Código de programación del Arduino

#include <ArduinoJson.h>#include <PID_v1.h>#include "DHT.h"

//Define pins be connecting to#define TermistorPin 5 //Thermistor connected to analog pin #define potPin 6 //Analog pin temp pot connected (Manual PIDT Setpoint)#define HeaterPin 3 //PWM pin for resistive element heater (PIDT Output)#define HumidifierPin 2 //Digintal pin for on/off humidifier (PIDH Output)#define DHTsensorPin 11 //Digital pin for DHT sensor input#define LightPin 4 //Digital pin output to rele for lights controll #define PhotoresPin 4 //Photoresistor to Analog pin for lights and ambient light feedback#define FanPin 5 //PWM pin for fan speed controll

//Define temperature and humidity PID controllers variables and parametersdouble SetpointT, InputT, OutputT, pT, iT, dT;

//Specify the links and initial tuning parametersPID PIDT(&InputT, &OutputT, &SetpointT,pT,iT,dT, DIRECT); // P1 I2 D3

//double SetpointH, InputH, OutputH, ph, iH, dH;//PID PIDH(&InputH, &OutputH, &SetpointH,pH,iH,dH, DIRECT);

//DHT ambient temperature/humidity sensor confgurationDHT dht(DHTsensorPin, DHT22);

float Humidity, AmbientTemperature, HeatIndex;

boolean LightState = 0 ; // Turn off ( 0 ) or on ( 1 ) lights

//Thermister raw data to actual temperaturedouble Termistor(int RawADC) { double Temp; Temp = log(((10240000/RawADC) - 10000)); Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp ); Temp = Temp - 273.15; // Convert Kelvin to Celcius return Temp;

Page 17: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

}

void setup(){ dht.begin(); Serial.begin(9600); pinMode(TermistorPin, INPUT); //pinMode(PhotoresPin, INPUT); //pinMode(potPin, INPUT); pinMode(HeaterPin, OUTPUT); pinMode(LightPin, OUTPUT); //pinMode(HumidifierPin, OUTPUT); //pinMode(FanPin, OUTPUT); //initialize the variables we're linked to //Define initial PIDT parameterspT = 97.0;iT = 1.47;dT = 1675.0;SetpointT = 30; //turn the PID on PIDT.SetMode(AUTOMATIC);

while (!Serial) { // wait serial port initialization }}

void loop(){

digitalWrite(LightPin, LightState);//Turn ON/OF lights Humidity = dht.readHumidity(); AmbientTemperature = dht.readTemperature(); HeatIndex = dht.computeHeatIndex(AmbientTemperature, Humidity, false); //pid-related code InputT = Termistor(analogRead(TermistorPin)); PIDT.Compute(); analogWrite(HeaterPin,OutputT); SerialReceive(); SerialSend(); }

/******************************************** * Serial Communication functions ********************************************/

// json string format: {"variablesPIDT":[InputT, OutputT, SetpointT],"parametrosPIDT":[pT,iT,dT,PIDT_manual,OutputT_reverse], "luz":[LightState]}

void SerialReceive(){

while(Serial.available()){

String serial = Serial.readString();

// Length (with one extra character for the null terminator)int serial_len = serial.length();

// Prepare the character array (the buffer) char json[serial_len];

// Copy it over serial.toCharArray(json, serial_len);

StaticJsonBuffer<200> jsonBuffer;

JsonObject& root = jsonBuffer.parseObject(json);

if(!root.success()){ //In case json root fails Serial.flush(); //Serial.println("Falied json root"); return;}

SetpointT = root["variablesPIDT"][2];

// * read in and set the controller tunings pT = root["parametrosPIDT"][0]; // iT = root["parametrosPIDT"][1]; // dT = root["parametrosPIDT"][2];

PIDT.SetTunings(pT, iT, dT); bool PIDT_manual, OutputT_reverse; PIDT_manual = root["parametrosPIDT"][3]; OutputT_reverse = root["parametrosPIDT"][4];

if(PIDT_manual==1) { // set the controller mode OutputT = root["variablesPIDT"][1]; PIDT.SetMode(MANUAL); } else PIDT.SetMode(AUTOMATIC);

if(OutputT_reverse==1) { // * set the Output direction PIDT.SetControllerDirection(REVERSE); } else PIDT.SetControllerDirection(DIRECT);

LightState = root["luz"][0]; Serial.flush(); // * clear any random data from the serial buffer}}void SerialSend(){

Page 18: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

StaticJsonBuffer<200> jsonBuffer; JsonObject& root = jsonBuffer.createObject();

JsonArray& variablesPIDT = root.createNestedArray("variablesPIDT"); variablesPIDT.add(InputT); variablesPIDT.add(OutputT); variablesPIDT.add(SetpointT); JsonArray& parametrosPIDT = root.createNestedArray("parametrosPIDT"); parametrosPIDT.add(PIDT.GetKp()); parametrosPIDT.add(PIDT.GetKi()); parametrosPIDT.add(PIDT.GetKd()); parametrosPIDT.add(PIDT.GetMode()); parametrosPIDT.add(PIDT.GetDirection());

JsonArray& luz = root.createNestedArray("luz"); luz.add(LightState);//Boolean //luz.add(AmbientLight);// Int %

JsonArray& DHTsensor = root.createNestedArray("DHTsensor"); if (isnan(Humidity) || isnan(AmbientTemperature)) { DHTsensor.add("Error"); DHTsensor.add("Error"); DHTsensor.add("Error"); } else { DHTsensor.add(Humidity); DHTsensor.add(AmbientTemperature); DHTsensor.add(HeatIndex); } root.printTo(Serial); // This prints: // {"variablesPIDT":[InputT, OutputT, SetpointT],"parametrosPIDT":[pT,iT,dT,PIDT_manual,OutputT_reverse], "luz":[LightState,AmbientLight(Aun no definido)], "DHTsensor":[Humidity, AmbientTemperature, HEatIndex]}}

Código de la página web (JavaScript)

<html><head>

<script type = "application/javascript">function loadData() {

var data_file = "/data";var http_request = new XMLHttpRequest();try {

// Opera 8.0+, Firefox, Chrome, Safari

http_request = new XMLHttpRequest();

}catch (e){ // Internet Explorer Browsers try { http_request = new

ActiveXObject("Msxml2.XMLHTTP"); }catch (e) { try { http_request = new

ActiveXObject("Microsoft.XMLHTTP"); }catch (e){

// Something went wrong

alert("Your browser broke!");

return false; }

}}

http_request.onreadystatechange = function(){

if (http_request.readyState == 4 ){

var jsonObj = JSON.parse(http_request.responseText);

document.getElementById("page_refresh_time").innerHTML = jsonObj.page_refresh_time;

document.getElementById("value_temperature").innerHTML = jsonObj.value_temperature;

document.getElementById("value_humidity").innerHTML = jsonObj.value_humidity;

document.getElementById("value_illuminance").innerHTML = jsonObj.value_illuminance;

document.getElementById("value_ground_moisture").innerHTML = jsonObj.value_ground_moisture;

document.getElementById("value_pressure").innerHTML = jsonObj.value_pressure;

document.getElementById("value_ph").innerHTML = jsonObj.value_ph;

document.getElementById("value_co2").innerHTML = jsonObj.value_co2;

Page 19: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

document.getElementById("value_ec").innerHTML = jsonObj.value_ec;

// Hacemos la llamada recursiva

setTimeout ("loadData()", jsonObj.page_refresh_time*1000);

}}http_request.open("GET", data_file, true);http_request.send();

}

loadData();

</script>

<title>Indoor</title><style type="text/css">

*, *:before, *:after { margin: 0; padding: 0;}

html, body { height: 100%; min-height: 100%;}

body { font: 14px/1 'Open Sans', sans-serif; color: #555; background: #EEE;}

#wrapper {min-height:100%;position:relative;

}

header { display: block; content: ""; height: 100px; background-color: #78C043; box-shadow: 0px -8px 5px 5px rgba(22, 22, 22, 0.9);}

#title { max-width: 800px;

margin: 0 auto;color: white;font-family: Verdana, Geneva, sans-serif;height: 90px;

line-height: 90px;text-transform: uppercase;font-weight: bold;

}

#title #icon {display:inline-block;padding-right: 5px;padding-left: 5px;

}#title #icon:before {

font-weight: normal;font-size:60px;color: white;content: '\1F331'

}

#title #text {font-size:28px;display:inline-block;border-top: solid;border-color: white;border-width: 5px;

}

h1 { padding: 50px 0; font-weight: 400; text-align: center;}

p { margin: 0 0 20px; line-height: 1.5;}

main { min-width: 320px; max-width: 800px; margin: 0 auto; margin-top: 40px; background: #EEE; padding-bottom:100px;}

section { display: none; padding: 20px 0 0; border-top: 1px solid #ddd;}

input { display: none;}

label { display: inline-block; margin: 0 0 -1px; padding: 15px 25px; font-weight: 600; text-align: center; color: #bbb; border: 1px solid transparent;}

label:before { font-family: fontawesome; font-weight: normal;

Page 20: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

margin-right: 10px;}

label[for*='1']:before { content: "T\00B0"; }label[for*='2']:before { content: "\1F527"; }label[for*='3']:before { content: '\1F4F6'; }label[for*='4']:before { content: '\1F514'; }

label:hover { color: #888; cursor: pointer;}

input:checked + label { color: #555; border: 1px solid #ddd; border-top: 2px solid orange; border-bottom: 1px solid #EBEBEB;}

#tab1:checked ~ #content1,#tab2:checked ~ #content2,#tab3:checked ~ #content3,#tab4:checked ~ #content4 { display: block;}

footer {background:#666;width:100%;height:70px;position:absolute;text-align: center;margin: 0px auto;color: #CCC;bottom:0;left:0;clear: both;

}

footer p {margin: 10px;

}

@media screen and (max-width: 650px) { label { font-size: 0; } label:before { margin: 0; font-size: 18px; }}

@media screen and (max-width: 400px) { label { padding: 15px; }}

.simplecard {padding: 15px;background: white;

border-radius: 5px 5px 5px 5px;box-shadow: 0px 1px 1px #ddd;

}

.container { width: 800px; height: 226px; margin: 20px auto;}.card {

float: left;width: 180px;height: 100%;border: 1px solid;border-radius: 5px;margin-right: 10px;background: #F9F9F9;position: relative;box-shadow: 0px 0px 3px #ddd;

background: white;border-radius: 5px 5px 5px 5px;box-shadow: 0px 1px 1px #ddd;

}.card .inner { background: #F9F9F9; border: 1px solid #E3E3E3; border-radius: 0px 0px 5px 5px; width: 100%; height: 100px; position: absolute; bottom: -1px; left: -1px; font-family: arial; text-align: center; box-shadow: inset 0px 0px 1px #FFF;}.card .inner .title { display: block; font-size: 9px; color: #fff; margin-top: -10px;}.card .inner .title .text { display: inline-block; padding: 5px 15px; border-radius: 50px; font-weight: bold;}.card .inner .number { color: #313A3E; font-size: 50px; font-weight: bold; display: block; margin-top: 5px;}.card .inner .measure { color: #676767; font-size: 10px; display: block;}.card {

Page 21: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

background: #ec6f69; border: 1px solid #de3932;}.card .inner {

border-top: 1px solid #de3932;}.card .inner .text {

border: 1px solid #de3932;background: #ec6f69;text-shadow: 1px 1px 0px #de3932;

}.card .inner .icon {

display: block;font-size: 90px;position: absolute;color: white;top: -115px;left: 45px;width: 17px;height: 17px;

}.hum {

background: #2B66B9;border: 1px solid #0047AB;

}.hum .inner {

border-top: 1px solid #0047AB;}.hum .inner .text {

border: 1px solid #0047AB;background: #2B66B9;text-shadow: 1px 1px 0px #0047AB;

}.hum .inner .icon {

top: -125px;}.light {

background: #FFD940;border: 1px solid #CCAE33;

}.light .inner {

border-top: 1px solid #CCAE33;}.light .inner .text {

border: 1px solid #CCAE33;background: #FFD940;text-shadow: 1px 1px 0px #CCAE33;

}.light .inner .icon {

top: -100px;font-size: 70px;left: 55px;

}.tmois {

background: #a6c659;border: 1px solid #7dad0a;

}.tmois .inner {

border-top: 1px solid #7dad0a;}.tmois .inner .text {

border: 1px solid #7dad0a;background: #a6c659;

text-shadow: 1px 1px 0px #7dad0a;}.tmois .inner .icon {

top: -100px;font-size: 70px;left: 55px;

}.pres {

background: #42AAFF;border: 1px solid #3280C0;

}.pres .inner {

border-top: 1px solid #3280C0;}.pres .inner .text {

border: 1px solid #3280C0;background: #42AAFF;text-shadow: 1px 1px 0px #3280C0;

}.pres .inner .icon {

top: -50px;font-size: 70px;left: 55px;-webkit-transform: rotate(-90deg);-moz-transform: rotate(-90deg);-ms-transform: rotate(-90deg);-o-transform: rotate(-90deg);filter:

progid:DXImageTransform.Microsoft.BasicImage(rotation=3);

}.ph {

background: #C080C0;border: 1px solid #AB55AB;

}.ph .inner {

border-top: 1px solid #AB55AB;}.ph .inner .text {

border: 1px solid #AB55AB;background: #C080C0;text-shadow: 1px 1px 0px #AB55AB;

}.ph .inner .icon {

top: -100px;font-size: 70px;left: 55px;

}.co2 {

background: #AAA;border: 1px solid #808080;

}.co2 .inner {

border-top: 1px solid #808080;}.co2 .inner .text {

border: 1px solid #808080;background: #AAA;text-shadow: 1px 1px 0px #808080;

}.co2 .inner .icon {

top: -95px;

Page 22: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

font-size: 90px;left: 50px;

}.ec {

background: #FFBC40;border: 1px solid #CC9633;

}.ec .inner {

border-top: 1px solid #CC9633;}.ec .inner .text {

border: 1px solid #CC9633;background: #FFBC40;text-shadow: 1px 1px 0px #CC9633;

}.ec .inner .icon {

top: -115px;font-size: 100px;left: 65px;

}

</style></head><body><div id="wrapper"><header><div id="title"><div id="icon"></div><div id="text"><p>Panel de Control</p></div></div></header>

<main> <input id="tab1" type="radio" name="tabs" checked> <label for="tab1">Estado</label> <input id="tab2" type="radio" name="tabs"> <label for="tab2">Par&#225;metros</label> <input id="tab3" type="radio" name="tabs"> <label for="tab3">Conexi&#243;n</label> <input id="tab4" type="radio" name="tabs"> <label for="tab4">Alertas</label> <section id="content1">

<div class="simplecard">Los datos se actualizan automaticamente

cada <strong><span id='page_refresh_time'>5</span> segundos</strong>.

</div> <div class='container'>

<div class='card temp'><div class='inner'> <div

class='icon'>&#127777;</div> <div class='title'>

<div class='text'>TEMPERATURE</div>

</div>

<div class='number'><div id='value_temperature'>22</div></div>

<div class='measure'>CELCIUS</div>

</div> </div> <div class='card hum'>

<div class='inner'> <div

class='icon'><strong>&#127787;</strong></div>

<div class='title'><div

class='text'>HUMIDITY</div> </div> <div class='number'><div

id='value_humidity'>45</div></div> <div

class='measure'>PERCENT</div></div>

</div> <div class='card light'>

<div class='inner'> <div

class='icon'><strong>&#128262;</strong></div>

<div class='title'><div

class='text'>ILLUMINANCE</div> </div> <div class='number'><div

id='value_illuminance'>67</div></div> <div class='measure'>LUX</div></div>

</div> <div class='card tmois'>

<div class='inner'> <div

class='icon'>&#128166;</div> <div class='title'>

<div class='text'>GROUND MOISTURE</div>

</div> <div class='number'><div

id='value_ground_moisture'>31</div></div> <div

class='measure'>PERCENT</div></div>

</div></div><div class='container'> <div class='card pres'>

<div class='inner'> <div

class='icon'><strong>&#128168;</strong></div>

<div class='title'><div

class='text'>PRESSURE</div> </div> <div class='number'><div

id='value_pressure'>760</div></div>

Page 23: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

<div class='measure'>TORR</div>

</div> </div> <div class='card ph'>

<div class='inner'> <div

class='icon'>&#13271;</div> <div class='title'>

<div class='text'>POWER OF HYDROGEN</div>

</div> <div class='number'><div

id='value_ph'>6.2</div></div> <div class='measure'>PH</div></div>

</div> <div class='card co2'>

<div class='inner'> <div class='icon'>&#9729;</div> <div class='title'>

<div class='text'>CARBON DIOXIDE</div>

</div> <div class='number'><div

id='value_co2'>452</div></div> <div class='measure'>PPM</div></div>

</div> <div class='card ec'>

<div class='inner'> <div

class='icon'><strong>&#9889;</strong></div> <div class='title'>

<div class='text'>ELECTRICAL CONDUCTIVITY</div>

</div> <div class='number'><div

id='value_ec'>1.2</div></div> <div

class='measure'>MS/CM</div></div>

</div></div>

</section> <section id="content2"> <p> Bacon ipsum dolor sit amet landjaeger sausage brisket, jerky drumstick fatback boudin ball tip turducken. Pork belly meatball t-bone bresaola tail filet mignon kevin turkey ribeye shank flank doner cow kielbasa shankle. Pig swine chicken hamburger, tenderloin turkey rump ball tip sirloin frankfurter meatloaf boudin brisket ham hock. Hamburger venison brisket tri-tip andouille pork belly ball tip short ribs biltong meatball chuck. Pork chop ribeye tail short ribs, beef hamburger meatball kielbasa rump corned beef porchetta landjaeger flank. Doner rump frankfurter meatball meatloaf, cow

kevin pork pork loin venison fatback spare ribs salami beef ribs. </p> <p> Jerky jowl pork chop tongue, kielbasa shank venison. Capicola shank pig ribeye leberkas filet mignon brisket beef kevin tenderloin porchetta. Capicola fatback venison shank kielbasa, drumstick ribeye landjaeger beef kevin tail meatball pastrami prosciutto pancetta. Tail kevin spare ribs ground round ham ham hock brisket shoulder. Corned beef tri-tip leberkas flank sausage ham hock filet mignon beef ribs pancetta turkey. </p> </section> <section id="content3"> <p> Bacon ipsum dolor sit amet beef venison beef ribs kielbasa. Sausage pig leberkas, t-bone sirloin shoulder bresaola. Frankfurter rump porchetta ham. Pork belly prosciutto brisket meatloaf short ribs. </p> <p> Brisket meatball turkey short loin boudin leberkas meatloaf chuck andouille pork loin pastrami spare ribs pancetta rump. Frankfurter corned beef beef tenderloin short loin meatloaf swine ground round venison. </p> </section> <section id="content4"> <p> Bacon ipsum dolor sit amet landjaeger sausage brisket, jerky drumstick fatback boudin ball tip turducken. Pork belly meatball t-bone bresaola tail filet mignon kevin turkey ribeye shank flank doner cow kielbasa shankle. Pig swine chicken hamburger, tenderloin turkey rump ball tip sirloin frankfurter meatloaf boudin brisket ham hock. Hamburger venison brisket tri-tip andouille pork belly ball tip short ribs biltong meatball chuck. Pork chop ribeye tail short ribs, beef hamburger meatball kielbasa rump corned beef porchetta landjaeger flank. Doner rump frankfurter meatball meatloaf, cow kevin pork pork loin venison fatback spare ribs salami beef ribs. Bacon ipsum dolor sit amet landjaeger sausage brisket, jerky drumstick fatback boudin ball tip turducken. Pork belly meatball t-bone bresaola tail filet mignon kevin turkey ribeye shank flank doner cow kielbasa shankle. Pig swine chicken hamburger, tenderloin turkey rump ball tip sirloin frankfurter meatloaf boudin brisket ham hock. Hamburger venison brisket tri-tip andouille pork belly ball tip short ribs biltong meatball chuck. Pork chop ribeye tail short ribs, beef hamburger meatball kielbasa rump corned beef porchetta landjaeger flank. Doner rump frankfurter

Page 24: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

meatball meatloaf, cow kevin pork pork loin venison fatback spare ribs salami beef ribs. Bacon ipsum dolor sit amet landjaeger sausage brisket, jerky drumstick fatback boudin ball tip turducken. Pork belly meatball t-bone bresaola tail filet mignon kevin turkey ribeye shank flank doner cow kielbasa shankle. Pig swine chicken hamburger, tenderloin turkey rump ball tip sirloin frankfurter meatloaf boudin brisket ham hock. Hamburger venison brisket tri-tip andouille pork belly ball tip short ribs biltong meatball chuck. Pork chop ribeye tail short ribs, beef hamburger meatball kielbasa rump corned beef porchetta landjaeger flank. Doner rump frankfurter meatball meatloaf, cow kevin pork pork loin venison fatback spare ribs salami beef ribs.Bacon ipsum dolor sit amet landjaeger sausage brisket, jerky drumstick fatback boudin ball tip turducken. Pork belly meatball t-bone bresaola tail filet mignon kevin turkey ribeye shank flank doner cow kielbasa shankle. Pig swine chicken hamburger, tenderloin turkey rump ball tip sirloin frankfurter meatloaf boudin brisket ham hock. Hamburger venison brisket tri-tip andouille pork belly ball tip short ribs biltong meatball chuck. Pork chop ribeye tail short ribs, beef hamburger meatball kielbasa rump corned beef porchetta landjaeger flank. Doner rump frankfurter meatball meatloaf, cow

kevin pork pork loin venison fatback spare ribs salami beef ribs. </p> <p> Jerky jowl pork chop tongue, kielbasa shank venison. Capicola shank pig ribeye leberkas filet mignon brisket beef kevin tenderloin porchetta. Capicola fatback venison shank kielbasa, drumstick ribeye landjaeger beef kevin tail meatball pastrami prosciutto pancetta. Tail kevin spare ribs ground round ham ham hock brisket shoulder. Corned beef tri-tip leberkas flank sausage ham hock filet mignon beef ribs pancetta turkey. </p> </section> </main><footer>

<p> Indoor X version 1.0 <br> Empresa Y &copy; Todos los derechos reservados. </p></footer></div></body></html>

Page 25: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

Proyecciones del proyecto

1) Implementar el sistema de control PID con más sensores y actuadores, permitiendo controlar y regular sistemas, procesos y ambientes a través del sistema de control anteriormente desarrollado.

2) Implementar el sistema fuera de una red LAN y ejecutarlo en un servidor WEB con su propia DNS, logrando así un monitoreo a distancia del sistema o proceso.

3) Mejorar la interfaz gráfica del servicio, a través de gráficos de variables y estados del proceso a tiempo real, volviendo más atractiva la interacción con el usuario.

4) Poder implementar el sistema de control con una maquinaria más robusta, ya sea volviéndolo compatible con PLC u otro controlador industrial.

Page 26: Environmental Monitor & Controller with web telemetry  (Monitor & Controlador ambiental con telemetría web)

Conclusión

Tras el proyecto anteriormente realizado se puede determinar que se logró elaborar un sistema de control PID con monitoreo de parámetros a través de una red LAN, logrando montar un servidor y una interfaz visual atractiva para el usuario. Logrando todos los objetivos propuestos al inicio del proyecto.Para lograr mejorar el sistema, se propone implementar el sistema de monitoreo con mayor número de sensores e incluyendo actuadores al sistema y así pasar de un sistema de monitoreo a un sistema de control completo, el cual se puede implementar a nivel industrial con el fin de abaratar costos de manera industrial y volver más simple la interacción con el usuario.