You are on page 1of 4

//Inclui todas as bibliotecas necessárias

#include <ESP8266WiFi.h> //Macros para uso do ESP8266


#include <WiFiClient.h> //Funções de conexão wireless
#include <ESP8266WiFiMulti.h> //Biblioteca que permite conexões em multiplas redes
#include <ESP8266mDNS.h> //Permite o uso de DNS, facilitando acesso a sites
#include <ESP8266WebServer.h> //Permite a criação de um sevidor Web

ESP8266WiFiMulti wifiMulti; //Define elemento wifiMulti da clase ESP8266WiFiMulti

ESP8266WebServer server(80); //Define utilização de Porta 80, padrão do HTML

//Codigo html utilizado, permitindo o ajuste entre dois valores padrões de 8 e 10 Volts (submetido pelo handler "v"
) ,
//alem de oferecer a possibilidade de um valor customizado entre 5 e 14 Volts com passo de 0.5 Volts (submetido
pelo handler "valor" )
//Submete os handlers pela URI '\LED' com o método POST

const char MAIN_page[] PROGMEM = R"=====(


<!DOCTYPE html>
<form action="/LED" method="POST">

<fieldset>
<legend> Tensao </legend>
<p>
<label>
<input type="radio" name="v" value="8"> 8 Volts
</label>
</p>

<p>
<label>
<input type="radio" name="v" value="10"> 10 Volts
</label>
</p>
<p>
<label>
<input type="radio" name="v" value="a"> Valor: <input type="number" name="valor" min="5" max="14"
step="0.5">
</label>
</p>

</fieldset>

<input type="submit" name="led" value="OK">

</form>

)=====";

String s = MAIN_page;

void handleRoot(); // Funções que deverão lidar com as informações submetidas pelo usuário
void handleLED();
void handleNotFound();

void setup(void){
Serial.begin(115200); //Inicia a porta serial a 115200bps, usada apenas para depuração
delay(10);

wifiMulti.addAP("AndroidAP", "matlab12345678"); // Nomeia as redes wifi que o dispositivo pode ser conectado,
ele se conectará a de melhor sinal.
wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");
wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3");

int i = 0;
while (wifiMulti.run() != WL_CONNECTED) { //Espera haver conexão com alguma das redes cadastradas
delay(250);
Serial.print('.');
}
MDNS.begin("esp8266"); //Inicia Conexão mutinodal com os elementos da rede, permitindo mais de
um usuario por vez
server.on("/", HTTP_GET, handleRoot); // Chama a função 'handleRoot' quando um cliente se conecta ao ip do
dispositivo
server.on("/LED", HTTP_POST, handleLED); // Chama a função 'handleLED' quando um método POST é chamado para
'\LED'
server.onNotFound(handleNotFound); // chama a função 'handleNotFound' quando uma ação não permitida é
executada

server.begin(); // Inicia o servidor com os parâmetros acima citados

analogWriteFreq(10300); //Define Frequencia do PWM para 10300 no software, Porém efetivamente


foi medido 10KHz
analogWrite(16,1023); //Inicia a Saída do Conversor em 5V
}

float v=5; //Inicia variável que armazena o valor de tensão requerido na saída

float c=0,ca,e,ea=0; //Inicia variáveis de controle(c), controle atrasado em uma


amostra(ca), erro atual(e) e erro atrasado em uma amostra(ea)

void loop(void){ //Laço executado continuamente


server.handleClient(); //Verifica se há requisições do usuário Web

int d; //Variável que armazena o duty cycle calculado(saída do


controle)

ea=e; //Atualiza variaveis de controle atrasado em uma amostra(ca) e


erro atrasado em uma amostra(ea)
ca=c;

float vs=0.8*(analogRead(A0)*3.3/1023)*13.5/2; //Lê a porta analógica e converte de binário para tensão


e=v-vs; //Calcula o erro atual
c=-2.7*ea+3*e+ca; //Computa a ação de controle
c=constrain(c,0,80); //Limita a ação de controle afim de evitar saturação do atuador
d=c; //Atualiza o duty cycle
float x=1-d/100.; //Inverte o valor de duty cycle devido ao uso do driver
transistorizado
float y=round(x*1023); //Arredonda para tornar possivel o seu uso

analogWrite(16,int(y)); //Aplica o valor de controle no atuador


delay(15); // Aplica delay de 15ms que é o cilco de operação do controlador
}

void handleRoot() { // Carrega a pagina HTML descrita no início


server.send(200, "text/html", s);

void handleLED() { //Lida com as requisições de mudança de setpoint


if(server.arg("v")!=NULL){
if(server.arg("v") == "a"){ //Verifica se um valor customizado foi escolhido
Serial.println(server.arg("valor")); //Lê o valor customizado
v=server.arg("valor").toFloat(); //Converte de texto para número, alterando o setpoint
}
else{
Serial.println(server.arg("v")); //Se um valor padão for escolhido, lê este valor
v=server.arg("v").toFloat(); //Converte de texto para número, alterando o setpoint
}
}
server.sendHeader("Location","/"); // Carrega e redireciona o usuário de volta a pagina inicial
server.send(303);
}

void handleNotFound(){
server.send(404, "text/plain", "404: Not found"); // Manda o erro 404 quando uma URI desconhecida é informada
}

You might also like