Problema con sistema de automatizacion de luz (Arduino Mega)

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.");
  }
}

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @eliasbern11 .

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

Moderador:
Por favor, lee las Normas del foro
Edita tu título, usa uno que no tenga justamente lo que se considera un título inútil.
Ver en las normas punto 5.
5. Piensa un título y descriptivo
Trata de resumir tu problema con un título inteligente, útil e informativo.
Un título útil salta a la vista de las personas que podrían conocer la respuesta. Los títulos inútiles son los que deberías evitar.
Ejemplos de títulos inútiles que deberías evitar:
• ERROR EN CODIGO, AYUDA URGENTE
• Problema al programar
• Tengo un error
• Error
• Tendré problemas?
• Novato en apuros
• POR FAVOR NECESITO AYUDA RAPIDO!!!!

Tal vez te ayude separar el HTML en bloques:

String html;

html="bloque1";
html += "mas texto en bloque1"
Serial1.print(html);
html="bloque2";
html += "mas texto en bloque2"
Serial1.print(html);
...

Tal vez tengas que repetir el envío del número de caracteres para cada bloque, y al final enviar el comando de cierre (CIPCLOSE)

Puede ser muy buena idea, lo voy a intentar, muchas gracias!!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.