#include <WiFiManager.h>
#include <ModbusIP_ESP8266.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
AsyncWebServer server(80);
const int DiscreteInputsAddresses[] = {0, 1}; // Endereços das entradas digitais
const int DiscreteInputPins[] = {16, 17}; // Pinos que serão utilizados como entradas digitais
const int CoilsAddresses[] = {5, 6}; // Endereços das saídas digitais
const int CoilsPins[] = {18, 19}; // Pinos que serão utilizados como saídas digitais
const int WebServerInputAddresses[] = {2, 3}; // Endereço das entradas digitais do webservidor
ModbusIP mb; // ModbusIP object
void setup() {
Serial.begin(921600);
for (int i = 0; i < sizeof(DiscreteInputPins) / sizeof(DiscreteInputPins[0]); i++) {
pinMode(DiscreteInputPins[i], INPUT_PULLUP);
mb.addIsts(DiscreteInputsAddresses[i]);
}
for (int i = 0; i < sizeof(CoilsPins) / sizeof(CoilsPins[0]); i++) {
pinMode(CoilsPins[i], OUTPUT);
mb.addCoil(CoilsAddresses[i]);
}
for (int i = 0; i < sizeof(WebServerInputAddresses) / sizeof(WebServerInputAddresses[0]); i++) {
mb.addIsts(WebServerInputAddresses[i]);
}
// Conexão com Wi-Fi
WiFiManager wm;
//wm.resetSettings();
bool res = wm.autoConnect("AutoConnectAP","password");
Serial.println(res ? "Conectado com sucesso" : "Falha ao conectar");
// Configurações do WebServer
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
String html = "<style>.button {width: 300px; height: 80px; font-size: 28px;}</style>"; // Definindo largura, altura e tamanho da fonte dos botões
html += "<style>.led {width: 300px; height: 80px; display: flex; justify-content: center; align-items: center; font-size: 28px;}</style>"; // Definindo tamanho da fonte dos LEDs
html += "<style>.container {display: flex;}</style>";
html += "<style>.header {background-color: black; color: white; text-align: center; padding: 10px; margin-bottom: 20px;}</style>"; // Estilizando o cabeçalho
// Cabeçalho com retângulo preto
html += "<div class='header'><h1>Automação e Simulação</h1></div>";
// Início do container flexível
html += "<div class='container' style='background-color: #f0f0f0; padding: 20px;'>"; // Adicionando o retângulo cinza claro como background
// Seção LED Azul e botões
html += "<div style='text-align: center; margin-right: 20px;'>";
html += "<div class='led' style='border: 1px solid gray; background-color: black; color: white; margin-bottom: 10px;'>LED AZUL</div>";
html += "<form action='/ligar_azul' method='post'><input type='submit' value='LIGA' class='button' style='background-color:#00FF00; color:#FFFFFF'></form>";
html += "<form action='/desligar_azul' method='post'><input type='submit' value='DESLIGA' class='button' style='background-color:#FF0000; color:#FFFFFF'></form>";
html += "</div>";
// Seção LED Vermelho e botões
html += "<div style='text-align: center; margin-left: 20px;'>";
html += "<div class='led' style='border: 1px solid gray; background-color: black; color: white; margin-bottom: 10px;'>LED VERMELHO</div>";
html += "<form action='/ligar_vermelho' method='post'><input type='submit' value='LIGA' class='button' style='background-color:#00FF00; color:#FFFFFF'></form>";
html += "<form action='/desligar_vermelho' method='post'><input type='submit' value='DESLIGA' class='button' style='background-color:#FF0000; color:#FFFFFF'></form>";
html += "</div>";
html += "</div>"; // Fim do container flexível
request->send(200, "text/html; charset=utf-8", html);
});
server.on("/ligar_azul", HTTP_POST, [](AsyncWebServerRequest *request){
mb.Ists(2, HIGH);
request->redirect("/");
});
server.on("/desligar_azul", HTTP_POST, [](AsyncWebServerRequest *request){
mb.Ists(2, LOW);
request->redirect("/");
});
server.on("/ligar_vermelho", HTTP_POST, [](AsyncWebServerRequest *request){
mb.Ists(3, HIGH);
request->redirect("/");
});
server.on("/desligar_vermelho", HTTP_POST, [](AsyncWebServerRequest *request){
mb.Ists(3, LOW);
request->redirect("/");
});
server.begin();
mb.server();
}
void loop() {
mb.task();
for (int i = 0; i < sizeof(DiscreteInputsAddresses) / sizeof(DiscreteInputsAddresses[0]); i++) {
mb.Ists(DiscreteInputsAddresses[i], digitalRead(DiscreteInputPins[i]));
}
for (int i = 0; i < sizeof(CoilsAddresses) / sizeof(CoilsAddresses[0]); i++) {
digitalWrite(CoilsPins[i], mb.Coil(CoilsAddresses[i]));
}
}