Hola Buenas a todos, estoy creando un sistema donde por medio de un esp8266 que se conecta a la red, me da una ip que yo le asigno desde la SD, a la cual yo accedo y me abre una pagina web donde prendo y apago la luz manualmente y también puedo automatizarla para horarios específicos, el programa funciona perfecto, el problema que estoy teniendo es que quiero agregarle cosas a la pagina y me deja de cargar por que se hace pesada, estuve pensando en que desde la misma SD lea la pagina y me la cargue, intente de todas las formas posibles y nada, no me abre la pagina, ni de archivo txt ni el html, nose si me podrán dar una mano, les dejo el programa que funciona así ven que se puede editar para que la pagina abra desde la sd:
#include "RTClib.h"
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
RTC_DS1307 rtc;
const int buttonPin = 8;
const int ledPin = 9;
const int chipSelect = 53;
bool ledState = false;
bool automationEnabled = false;
int horaDesde = 0, minutoDesde = 0;
int horaHasta = 0, minutoHasta = 0;
int hora = 0;
int minutos = 0;
int segundos = 0;
String ssid, password, ip, mask, gateway, dns;
String line;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
Serial.begin(9600);
Serial1.begin(115200);
rtc.begin();
if(!rtc.begin()){
Serial.println("No se Encontro RTC");
while (1) delay(10);
}
if (!rtc.isrunning()) {
Serial.println("RTC no está funcionando, ajustando hora...");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
//rtc.adjust(DateTime(2025, 1, 10, 14, 40, 0));
} else {
Serial.println("RTC ya está funcionando, no se ajustará la hora.");
}
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
DateTime now = rtc.now();
Serial.println("Configurando la fecha y hora actual");
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(":");
Serial.println(now.second());
SD.begin();
if (!SD.begin(chipSelect)) {
Serial.println("No se pudo inicializar la tarjeta SD.");
while (true);
}
Serial.println("Tarjeta SD inicializada.");
if (!leerConfiguracionSD()) {
Serial.println("Error al leer el archivo de configuración.");
while (true);
}
resetESP();
connectToWiFi();
if (sendCommand("AT+CIPMUX=1", "OK", 2000)) {
Serial.println("CIPMUX configurado correctamente.");
} else {
Serial.println("Error configurando CIPMUX.");
}
if (sendCommand("AT+CIPSERVER=1,80", "OK", 2000)) {
Serial.println("Servidor web iniciado correctamente.");
Serial.println("Servidor web iniciado. Dirección IP:");
printIP();
} else {
Serial.println("Error iniciando el servidor web.");
}
}
void loop() {
DateTime now = rtc.now();
hora = now.hour();
minutos = now.minute();
segundos = now.second();
if (automationEnabled== true) {
if (hora == horaDesde && minutos == minutoDesde) {
digitalWrite(ledPin, HIGH);
}
if (hora == horaHasta && minutos == minutoHasta) {
digitalWrite(ledPin, LOW);
}
delay(1000);
}
if (digitalRead(buttonPin) == LOW) {
delay(50);
ledState = !ledState;
digitalWrite(ledPin, ledState);
delay(200);
}
if (Serial1.available()) {
String request = Serial1.readString();
Serial.println(request);
if (request.indexOf("/ON") != -1) {
ledState = true;
} else if (request.indexOf("/OFF") != -1) {
ledState = false;
}else if (request.indexOf("/AUTO") != -1) {
automationEnabled = true;
} else if (request.indexOf("/DAUTO") != -1) {
automationEnabled = false;
} else if (request.indexOf("/SET=HORA_DESDE") != -1) {
horaDesde = extractParameter(request, "hora");
minutoDesde = extractParameter(request, "minuto");
} else if (request.indexOf("/SET=HORA_HASTA") != -1) {
horaHasta = extractParameter(request, "hora");
minutoHasta = extractParameter(request, "minuto");
} else if (request.indexOf("/SET=HORA") != -1) {
int anio = extractParameter(request, "anio");
int mes = extractParameter(request, "mes");
int dia = extractParameter(request, "dia");
int hora = extractParameter(request, "hora");
int minuto = extractParameter(request, "minuto");
int segundo = extractParameter(request, "segundo");
ajustarHoraManual(anio, mes, dia, hora, minuto, segundo);
}
digitalWrite(ledPin, ledState);
sendWebPage(ledState);
}
}
void ajustarHoraManual(int anio, int mes, int dia, int hora, int minuto, int segundo) {
rtc.adjust(DateTime(anio, mes, dia, hora, minuto, segundo));
DateTime now = rtc.now();
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(":");
Serial.println(now.second());
Serial.println("Hora del RTC actualizada manualmente.");
}
bool leerConfiguracionSD() {
File configFile = SD.open("config.txt");
if (!configFile) {
Serial.println("No se pudo abrir el archivo de configuración.");
return false;
}
while (configFile.available()) {
line = configFile.readStringUntil('\n');
parseLine(line);
}
configFile.close();
return true;
}
void parseLine(String line) {
int separator = line.indexOf('=');
if (separator == -1) return;
String key = line.substring(0, separator);
String value = line.substring(separator + 1);
key.trim();
value.trim();
if (key == "SSID") ssid = value;
else if (key == "PASSWORD") password = value;
else if (key == "IP") ip = value;
else if (key == "MASK") mask = value;
else if (key == "GATEWAY") gateway = value;
else if (key == "DNS") dns = value;
}
void resetESP() {
sendCommand("AT+RST", "OK", 10000);
Serial.println("ESP8266 reiniciado.");
}
void connectToWiFi() {
sendCommand("AT+CWMODE=1", "OK", 5000);
Serial1.println("AT+CWJAP=\"" + ssid + "\",\"" + password + "\"");
if (waitForResponse("OK", 15000)) {
Serial.println("Conectado a la red WiFi.");
sendCommand("AT+CWJAP?", "OK", 5000);
} else {
Serial.println("Error conectando a la red WiFi.");
}
String command = "AT+CIPSTA=\"" + ip + "\",\"" + gateway + "\",\"" + mask + "\"";
if (sendCommand(command, "OK", 5000)) {
Serial.println("IP fija configurada correctamente.");
} else {
Serial.println("Error configurando la IP fija.");
}
}
void checkWiFiStatus() {
Serial1.println("AT+CWJAP?");
if (waitForResponse("OK", 5000)) {
Serial.println("El ESP8266 está conectado a la red WiFi.");
} else {
Serial.println("El ESP8266 no está conectado a la red WiFi.");
}
Serial1.println("AT+CIFSR");
if (waitForResponse("OK", 5000)) {
Serial.println("Dirección IP obtenida:");
} else {
Serial.println("No se obtuvo dirección IP.");
}
}
void printIP() {
Serial1.println("AT+CIFSR");
delay(2000);
while (Serial1.available()) {
Serial.write(Serial1.read());
}
}
int extractParameter(String request, String param) {
int paramIndex = request.indexOf(param + "=");
if (paramIndex != -1) {
int valueStart = paramIndex + param.length() + 1;
int valueEnd = request.indexOf('&', valueStart);
if (valueEnd == -1) valueEnd = request.length();
return request.substring(valueStart, valueEnd).toInt();
}
return 0;
}
bool sendCommand(String command, String expectedResponse, unsigned long timeout) {
Serial1.println(command);
return waitForResponse(expectedResponse, timeout);
}
bool waitForResponse(String expectedResponse, unsigned long timeout) {
String response = "";
unsigned long startTime = millis();
while (millis() - startTime < timeout) {
while (Serial1.available()) {
char c = Serial1.read();
response += c;
if (response.indexOf(expectedResponse) != -1) {
return true;
}
}
}
Serial.println("Timeout esperando respuesta: " + expectedResponse);
return false;
}
void sendWebPage(bool state) {
String ledStatus = state ? "Encendido" : "Apagado";
String autoStatus = automationEnabled ? "Habilitado" : "Deshabilitado";
String html = "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\nConnection: close\r\n\r\n";
html += "<!DOCTYPE html><html><head><title>Netkey Solutions</title><style>";
html += "body{text-align: center; background-color: rgb(25, 23, 160); color: aliceblue;}";
html +="p{font-size: 40px;}";
html += ".apagado, .prendido {font-size: 30px; display: block; margin: 20px auto;}";
html +="span {background: none; color: #ffffff;}";
html +="ion-icon {background-color: transparent; font-size: 40px;vertical-align: middle; margin-right: 10px; color: #ffffff;}";
html +=".deshabilitado, .habilitado {font-size: 30px; display: block; margin: 20px auto; }";
html +="input{color: #000000; background-color: #ffffff;}";
html += "</style></head><body>";
html += "<p>Estado de la Luz: " + ledStatus + "</p>";
html += "<p>Automatización: " + autoStatus + "</p>";
html += "<p>Hora Desde: " + String(horaDesde) + ":" + String(minutoDesde) + "</p>";
html += "<p>Hora Hasta: " + String(horaHasta) + ":" + String(minutoHasta) + "</p>";
html += "<a href=\"/ON\">";
html +=" <span class=\"iconon\"><ion-icon name=\"sunny-outline\"></ion-icon></span>";
html +="<span class=\"text\">Encender Manual</span></a>";
html += "<a href=\"/OFF\">";
html +=" <span class=\"iconoff\"><ion-icon name=\"moon-outline\"></ion-icon></span>";
html +="<span class=\"textoff\">Apagar Manual</span></a>";
html += "<a href='/AUTO' class=\"habilitado\">";
html +="<span><ion-icon name=\"checkmark-circle-outline\"></ion-icon></span>";
html +="<span>Habilitar Automatizacion</span></a>";
html += "<a href='/DAUTO' class=\"deshabilitado\">";
html +="<span><ion-icon name=\"remove-circle-outline\"></ion-icon></span>";
html +="<span>Deshabilitar Automatizacion</span></a>";
html += "<form action='/SET=HORA_DESDE' method='get'>";
html += "<label>Hora Desde: </label><input type='number' name='hora' min='0' max='23'>:";
html += "<input type='number' name='minuto' min='0' max='59'><input type='submit'></form>";
html += "<form action='/SET=HORA_HASTA' method='get'>";
html += "<label>Hora Hasta: </label><input type='number' name='hora' min='0' max='23'>:";
html += "<input type='number' name='minuto' min='0' max='59'><input type='submit'></form>";
html += "<script type=\"module\" src=\"https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.esm.js\"></script>";
html +="<script nomodule src=\"https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.js\"></script>";
html += "</body></html>";
Serial1.println("AT+CIPSEND=0," + String(html.length()));
if (waitForResponse(">", 500)) {
Serial1.print(html);
delay(500);
Serial1.println("AT+CIPCLOSE=0");
} else {
Serial.println("Error al enviar la página web.");
}
}