Telecontrol de Invernadero y de forma Local desde la misma Arduino

Espero si cometo una falta sepan entender soy nuevo en el foro.

Estoy trabajando en mi proyecto de Graduacion que trata de controla un invernadero de manera remota mediante una pagina web y de forma local desde la misma arduino(activando o desactivando interruptores).

El problema que me encuentro es que al momento de mezclar la parte remota con la local me da conflictos, si yo envio un paquete UDP teniendo las dos formas programadas no puedo hacer el cast a String del packetBuffer recibido por UDP, pero si yo quito la parte local no me da problemas. Yo quisiera saber si hay posibilidad de unir esas dos partes en el mismo codigo sin tener ese conflicto, y otra duda que tengo es que si yo recibo un paquete UDP puedo guardar lo que recibi y usarlo mas adelante en el caso que no reciba un paquete UDP con la finalidad de “simular” que he recibido uno.

Les pongo mi codigo debido a que no es suficiente los caracteres para ponerlo aqui esperando que alguien me pueda ayudar, gracias.

Nota: La parte que esta entre /* parte local */ es la parte que me esta dando conflictos.

CodigoSensores3.0.ino (45.3 KB)

Miré tu código por encima, y como es demasiado largo requiere tiempo para verlo (en mi caso, tal vez otro lo detecte inmediatamente).
Yo siempre que veo algo asi, pienso en falta de RAM.
Y luce mas que obvio que es un código extenso, usando Strings y paquetes de datos.
Entonces prueba con esto

Falta memoria RAM
Memoria disponible

Agrega esto y ve observando el consumo de RAM antes y después y verás que tu problema es mas grande del que pensabas.
Deberás hacer optimizaciones mas amplias.

Ejemplo Todo lo que es cartel, FIJO, usas F("Etiqueta") ejemplo

supongamos esta linea de tu propio código

Serial.println("Entro a modo Remoto");

cambia a

Serial.println(F("Entro a modo Remoto"));

Este cambio reduce la cantidad de RAM en uso serán pocos bytes pero en la extensión de tu código 100 bytes puede ser la diferencia.

Mira a ver que ocurre con la RAM.

Revisare lo de la memoria RAM y estare comentado a ver que sucede. Gracias por tu pronta respuesta.

Lo que si se me hace raro es que la parte local en el caso de tener ambas programadas si me funciona, el problema solo me lo da al hacer la conversion del packetBuffer que es un char a String para poder hacerle el substring y asi ver en que modo y que consulta le llega por UDP, con todo revisara lo que posteaste y estare comentando cuales fueron los resultados.

Gracias.

Asegurémosnos de que no es RAM el problema primero.
Si no es lo miramos con detenimiento si no lo esta haciendo alguien ya.

Vuelvo a subir mi codigo amigo, porque me olvide de mencionar que nada del Serial.print(); eso no va a ir en mi codigo solo puse para realizar pruebas, ahora con el codigo modificado me envia los paquetes pero a la 2da vez, por ejemplo cuando cargo el sketch y envio un paquete no me responde, pero a la 2da vez ahi si me responde y asi mismo le envia la 3era vez y nada, envio la 4ta y me responde, asi sucesivamente.

Pero ya me funciona la parte local con la remota, ahora quisiera saber si hay posibilidad de que me responda cada que le envio un paquete. Y si hay la posibilidad de “simular” que recibe un paquete UDP guardando lo anterior que le llego, gracias por su ayuda.

CodigoSensores3.0.ino (45.3 KB)

Cambie ahora solo la manera de declarar las variables para los pines y aquellas que no cambian con un #define, y ahora al momento de preguntar el valor de la temperatura y luminosidad me responde de la manera mencionada anteriormente, el resto me responde cada vez que le envio un paquete UDP, solo me da problemas en temperatura y luminosidad que me responde a la 2,4,6ta vez asi sucesivamente.
Y se me hace raro porque no cambie nada en la manera que me responde pero solo esas dos me fallan, si me puede ayudar muchas gracias ya que no veo algun error a simple vista.

//Digitales
#define Temperatura 2  //Pin para el sensor de Temperatura(pin2 Digital)
#define switchModo 3  // Modo Remoto(Automatico o Manual)(HIGH) o Modo Local(Automatico o Manual)(LOW)                            
#define switchOperacion 4  // Modo Operacion (Automatico(HIGH) o Manual(LOW)) de forma Local.
#define switchCalefaccion 5  //Switch para Activar Calefaccion(solo funciona en Modo de Operacion Manual Local).
#define switchVentilacion 6  //Switch para Activar Ventilacion(solo funciona en Modo de Operacion Manual Local).
#define switchValvula 7  //Switch para Activar Riego(solo funciona en Modo de Operacion Manual Local).
#define Calefaccion 8  //Salida cuando se activa la Calefaccion.
#define Ventilacion 9  //Salida cuando se activa la Ventilacion.

//Analogicas
#define Humedad A0  //Pin para el sensor de Humedad.
#define Luminosidad A1  //Pin Para el sensor de Luminosidad.
#define LuzArtificial A2  //Salida cuando se activa la Luz Artificial.
#define Riego A3  //Salida cuando se activa el Riego.

//Para Buffer de Paquetes UDP
#define PACKET_SIZE 13
#define MAX_SIZE 16