#include <WiFiManager.h> // Biblioteca para facilitar a configuração do WiFi
#include <ModbusIP_ESP8266.h> // Biblioteca para comunicação Modbus TCP/IP
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
AsyncWebServer server(80);
// Definição dos endereços e pinos para entradas digitais
const int DiscreteInputAddresses[] = {0, 1, 2}; // Endereços das entradas digitais no Modbus
const int DiscreteInputPins[] = {26, 27, 14}; // Pinos que serão utilizados como entradas digitais na ESP32
// Definição dos endereços e pinos para saídas digitais
const int CoilsAddresses[] = {3, 4, 5}; // Endereços das saídas digitais no Modbus
const int CoilPins[] = {32, 33, 25}; // Pinos que serão utilizados como saídas digitais na ESP32
const int WebServerInputAddresses[] = {6, 7, 8}; // Endereço das entradas digitais do webservidor
IPAddress remote(192, 168, 18, 103); // Endereço IP do dispositivo Modbus remoto
ModbusIP mb; // Objeto para comunicação Modbus IP
void setup() {
Serial.begin(921600); // Inicialização da comunicação serial
// Configuração dos pinos de entradas digitais
for (int i = 0; i < sizeof(DiscreteInputPins) / sizeof(DiscreteInputPins[0]); i++) {
pinMode(DiscreteInputPins[i], OUTPUT);
}
// Configuração dos pinos de saídas digitais
for (int i = 0; i < sizeof(CoilsAddresses) / sizeof(CoilsAddresses[0]); i++) {
pinMode(CoilPins[i], OUTPUT);
}
for (int i = 0; i < sizeof(WebServerInputAddresses) / sizeof(WebServerInputAddresses[0]); i++) {
mb.addIsts(WebServerInputAddresses[i]);
}
// Configuração do WiFi usando WiFiManager
WiFiManager wm;
//wm.resetSettings();
bool res = wm.autoConnect("AutoConnectAP", "password"); // Tenta conectar automaticamente a uma rede WiFi
Serial.println(res ? "Conectado com sucesso" : "Falha ao conectar"); // Mensagem de conexão bem-sucedida ou falha
mb.client(); // Inicialização do Modbus TCP/IP como cliente
// 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 das luzes
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 Luz Verde 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;'>LUZ VERDE</div>";
html += "<form action='/ligar_verde' method='post'><input type='submit' value='LIGA' class='button' style='background-color:#00FF00; color:#FFFFFF'></form>";
html += "<form action='/desligar_verde' method='post'><input type='submit' value='DESLIGA' class='button' style='background-color:#FF0000; color:#FFFFFF'></form>";
html += "</div>";
// Seção Luz Amarela e botões
html += "<div style='text-align: center; margin-left: 20px; margin-right: 20px;'>";
html += "<div class='led' style='border: 1px solid gray; background-color: black; color: white; margin-bottom: 10px;'>LUZ AMARELA</div>";
html += "<form action='/ligar_amarela' method='post'><input type='submit' value='LIGA' class='button' style='background-color:#00FF00; color:#FFFFFF'></form>";
html += "<form action='/desligar_amarela' method='post'><input type='submit' value='DESLIGA' class='button' style='background-color:#FF0000; color:#FFFFFF'></form>";
html += "</div>";
// Seção Luz Vermelha 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;'>LUZ VERMELHA</div>";
html += "<form action='/ligar_vermelha' method='post'><input type='submit' value='LIGA' class='button' style='background-color:#00FF00; color:#FFFFFF'></form>";
html += "<form action='/desligar_vermelha' 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_verde", HTTP_POST, [](AsyncWebServerRequest *request){
mb.Ists(6, HIGH);
request->redirect("/");
});
server.on("/desligar_verde", HTTP_POST, [](AsyncWebServerRequest *request){
mb.Ists(6, LOW);
request->redirect("/");
});
server.on("/ligar_amarela", HTTP_POST, [](AsyncWebServerRequest *request){
mb.Ists(7, HIGH);
request->redirect("/");
});
server.on("/desligar_amarela", HTTP_POST, [](AsyncWebServerRequest *request){
mb.Ists(7, LOW);
request->redirect("/");
});
server.on("/ligar_vermelha", HTTP_POST, [](AsyncWebServerRequest *request){
mb.Ists(8, HIGH);
request->redirect("/");
});
server.on("/desligar_vermelha", HTTP_POST, [](AsyncWebServerRequest *request){
mb.Ists(8, LOW);
request->redirect("/");
});
server.begin();
}
bool DiscreteInputStates[sizeof(DiscreteInputPins)]; // Estado das entradas digitais
bool CoilStates[sizeof(CoilsAddresses)]; // Estado das saídas digitais
void loop() {
mb.connect(remote); // Conectar ao dispositivo Modbus remoto
// Ler o estado das entradas digitais, atualizar no Modbus e armazenar no array DiscreteInputStates
for (int i = 0; i < sizeof(DiscreteInputPins) / sizeof(DiscreteInputPins[0]); i++) {
DiscreteInputStates[i] = digitalRead(DiscreteInputPins[i]);
mb.writeCoil(remote, DiscreteInputAddresses[i], DiscreteInputStates[i]);
}
// Ler o estado das saídas digitais do Modbus e atualizar os pinos correspondentes
for (int i = 0; i < sizeof(CoilsAddresses) / sizeof(CoilsAddresses[0]); i++) {
mb.readCoil(remote, CoilsAddresses[i], &CoilStates[i]);
digitalWrite(CoilPins[i], CoilStates[i]);
}
mb.task(); // Realizar a tarefa Modbus
delay(100); // Aguardar um curto período de tempo antes de repetir o loop
}