Arduino mega Sketch se reinicia

Hola a todos,
Por favor a ver si me ayudan con este problema:
Mi modulo estoy empezando tiene dos sensores de T° (DS18B20), lee las T° de un equipo frigorífico de dos puertas uno para cada uno, lo muestra en una oled 0.96 y también graba en una micro SD, esto ultimo va a depender del valor del switch:

  • Si case vale 0 lee T° y lo muestra en la oled
  • Si case vale 1, lee T°, muestra en la oled y graba en la microSD (cada 10 seg).

El valor de switch se cambia con un pulsador que va entre 0 y 1.
Uso un arduino mega 2560, un RTC, 2 sensores de T°, una oled 0.96", un microSD.

El problema es:
Cuando case esta en 0 todo funciona bien.
Cuando case esta en 1, por alguna razón se reinicia va al setup me doy cuenta porque en el puerto serial aparece:
"Inicializando tarjeta ..."
"inicializacion correcta"

Y todo empieza de nuevo osea se va al case 0. Agregar que el cambio de case 0 a case 1 y viceversa se hace con el pulsador.

Espero me haya dejado entender. Pego el código:

#include <SPI.h>                // incluye libreria interfaz SPI (micro SD)
#include <SD.h>                 // incluye libreria para tarjetas SD
#include <OneWire.h>
#include <DallasTemperature.h>  // librerias para sensor DS18B20
#include <Wire.h>               // incluye libreria para interfaz I2C
#include <RTClib.h>             // libreria para manejo de modulo RTC

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>      // libreria para controlador SSD1306
#define ANCHO 128        // reemplaza ocurrencia de ANCHO por 128
#define ALTO 64          // reemplaza ocurrencia de ALTO por 64
#define OLED_RESET 4     // necesario por la libreria pero no usado
Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET);    // crea objeto oled*/

#define DATO 44       // pin 3 entrada de datos
#define SSpin 53      // Slave Select en pin digital 

float  Temp1, Temp2, TimeSTAR, TimeEND;   // variables globales
byte   pinDOS = 22, LED = 24, valor = 0;   // pin 2 entrada
RTC_DS3231 rtc;                           // crea objeto rtc tipo RTC_DS3231

File archivo;                             // objeto archivo del tipo Archivo
OneWire oneWire(DATO);
DallasTemperature sensors (&oneWire);     // declara variable/objeto para sensor
DeviceAddress Sensor1 = {0x28, 0x5A, 0xA9, 0x79, 0x97, 0x14, 0x03, 0x63};
DeviceAddress Sensor2 = {0x28, 0x97, 0x46, 0x95, 0xF0, 0x01, 0x3C, 0x6B};
 
void setup() {
    Serial.begin (9600);                  // inicializa monitor serie a 9600 bps
    Wire.begin();                         // inicializa bus I2C
    oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // inicializa pantalla con dirección 0x3C (bus I2C)
    pinMode(pinDOS, INPUT);                  // pin 22 entrada
    pinMode(LED, OUTPUT);
   
    Serial.println ("Inicializando tarjeta ...");   // texto en ventana de monitor
    if (! SD.begin (SSpin)) {                       // inicialización de la tarjeta SD
        Serial.println ("fallo en inicializacion!");  // si falla se muestra texto correspondiente y
      return;                                         // se sale del setup () para finalizar el programa
     }
    Serial.println ("inicializacion correcta");     // texto de inicializacion correcta*/
 
    sensors.setResolution(Sensor1, 11);   // sensor1 a resolución de 9 bits
    sensors.setResolution(Sensor2, 11);   // sensor2 a resolución de 9 bits 
 
 }

void loop () {  
    if (digitalRead(pinDOS) == LOW){         // entra al if si presiona pin 2
       delay(100);          
       TimeSTAR = millis();               
       while (digitalRead(pinDOS) == LOW){    // pregunta si continua resionado pin 2
          TimeEND = millis();                // 
          if ((TimeEND - TimeSTAR) >= 5000){ // pregunta si pasaron 5 seg..
             valor = 0;
             TimeEND = 0;
           }
          else {
             valor = 1;                      // se pone valor = 1 para pasar a case 1
          }
        }
      } 
        
    LecturaTemp();           // llama funcion para lectura de T°
    
    switch(valor){            // switch para elegir el modo de trabajo
      case 0:
          digitalWrite(LED, HIGH);
          EscrituraSerial();       // llama a la funcion para escribir en pantalla         
          EscribeTempOLED();       // llama funcion para lectura de T°
          TimeSTAR = millis();   
          digitalWrite(LED, LOW);
          delay (100);   
          break;
          
      case 1:          
          TimeEND = millis();
          digitalWrite(LED, HIGH);
          if (TimeEND - TimeSTAR >= 10000){         // entra al if si pasó 10 seg.
              digitalWrite(LED, LOW);
              archivo = SD.open ("datos1.txt", FILE_WRITE); // apertura para read/write de archivo datos.txt
              if (archivo) {            
                  DateTime fecha = rtc.now();      // fecha es tipo dateTime
                  archivo.print(fecha.year(), DEC);
                  archivo.print('/');
                  archivo.print(fecha.month(), DEC);
                  archivo.print('/');
                  archivo.print(fecha.day(), DEC);
                  archivo.print(" ");
                  archivo.print(fecha.hour(), DEC);
                  archivo.print(':');
                  archivo.print(fecha.minute(), DEC);
                  archivo.print(':');
                  archivo.print(fecha.second(), DEC);
                  archivo.print(" , "); 
                                                                                                      
                  archivo.print(Temp1, 1);         // escribe en tarjeta el valor de sensor 1
                  archivo.print(",");
                  archivo.println(Temp2, 1);     // escribe en tarjeta el valor de sensor 2
                  
                  archivo.close ();              // cierre de archivo*/ 
                  Serial.println ("escritura correcta"); // escritura correcta en SD           
                  EscribeTempOLED();       // llama funcion para lectura de T°          
                  EscrituraSerial();
               } 
              else {
                  Serial.println ("error en apertura de datos.txt"); // falla en apertura de archivo
             }              
             TimeSTAR = millis();
             TimeEND = 0;
          }
         break;
     }
      
 }

// Función para tomar lectura de T° 
void EscribeTempOLED(){
    oled.clearDisplay();
    oled.setTextColor(WHITE);
    oled.setCursor(0, 0);           // ubica cursor en inicio de coordenadas 0,0
    oled.setTextSize(1);            // establece tamaño de texto en 1
    oled.print("Temperaturas : ");  // escribe en pantalla el text   
    
    oled.setCursor(10, 17);         // 
    oled.setTextSize(2);
    oled.print("T1: ");
    oled.print(Temp1, 1);
 
    oled.setCursor(10, 40);
    oled.setTextSize(2);
    oled.print("T2: ");
    oled.print(Temp2, 1);
    oled.display();   
 
 }  

// Función para tomar lectura de T° 
void LecturaTemp(){
    sensors.requestTemperatures();        // envia comandos para tomar lectura 
    Temp1 = sensors.getTempC(Sensor1);    // toma lectura del sensor 1 
    Temp2 = sensors.getTempC(Sensor2);    // toma lectura del sensor 2
 }

// Función para esribir en el puerto serial 
void EscrituraSerial(){
    Serial.print(Temp1, 1);
    Serial.print(" , ");
    Serial.println(Temp2, 1);
 }    
    

Sin mirar nada del código. Si un Arduino tras una acción con un componente se reinicia o se desconecta del USB y al momento el S.O lo vuelve a detectar y comienza el setup() (obvio) tiene altísimas probabilidades de ser un fallo en las conexiones.
Básicamente estarías haciendo un "corto".

Hace poco alguien que usaba OLED tuvo un problema similar. Resultó que la librería OLED consumía gran cantidad de recursos y dejaba muy poca SRAM disponible.
Por favor recompila tu código y luego copia y pega el resultado de la compilación indicando % de RAM en uso y % de flash usada tmb. Seguramente el problema esta ahi.
Veamos si se repite el problema.

@Surbyte Si fuese problema de memoria mal asunto porque dice estar usando un Arduino Mega, así que o bien deriva a un DUE si fuera el caso o tiene que empezar a realizar cambios en todo lo que tiene, quitar librerías o replantear el sketch. Puede ahorrarse variables (manía que tienen de programar usando todas goblales) pero si se está llenando la memoria no creo que se resuelva cambiando 4 floats.

Estimados buenas tardes..

Pego aquí resultado de la compilación:
El Sketch usa 27698 bytes (10%) del espacio de almacenamiento de programa. El máximo es 253952 bytes.
Las variables Globales usan 1431 bytes (17%) de la memoria dinámica, dejando 6761 bytes para las variables locales. El máximo es 8192 bytes.

Debido a que el NANO ya casi estaba al 90% de la SRAM cambie a mega eso si me dolio lo que pague...
Puedo descartar las conexiones he sido minusioso con ello.

Pero hice otra prueba, puse como comentario una parte de código cuando case =1 (graba fecha y hora en la SD) desde:
/*archivo.print(fecha.year(), DEC);
...
...
archivo.print(" , "); // hasta aqui */

Corri el programa y funciona bien:
Cuando Case = 1, si graba, las lecturas de los 2 sensores, en la SD cada 10seg pero no graba la fecha y hora (esta como comentario). Cuando presiono el pulsador por 5 seg vuelve a case 0
Pero la fecha y hora de toma de lectura de cada sensor son indispensables las debo tener en la SD.

Quedo atento
Gracias

Con un Mega el problema no iba a ser de memoria ¿ Al comentar esa parte no se reinicia?

Hola cuantron,
No hay reinicio todo funciona bien; el programa graba en la SD las dos temperaturas y también envía en la oled, las dos cosas cada 10 seg.
Esto es lo que veo en el puerto serial:
escritura correcta
26.2 , 27.9
escritura correcta
26.2 , 27.7
..
..

Para volver al case 0 se presiona el pulsador por mínimo 5 seg.
Cuando retiro (claro esta apago el arduino) la SD si están las lecturas de los dos sensores. Pero yo necesito que también se grabe la fecha y hora.

Gracias

Hice otra prueba, al código original en el mismo case = 1, esta vez comente:
//EscribeTempOLED(); // llama función para escribir en la oled

Y sucede lo mismo se reinicia..
No sera que existe un conflicto en el bus I2C (oled, y rtc), quizá deba asignar dirección a cada uno de ellos, como se hace eso?

Hace unas semanas el problema fue la librería OLED usando un MEGA, por eso lo traje a colación.
Ahora que vemos que no hay consumo de SRAM ni Flash entonces enfoquémos en otras cosas.

He modificado levemente tu case 1. Agregué un par de variables buffer, sTemp1 y sTemp2 todos array de chars que almacenaran la fecha hora y las variables Temp1 y Temp2.

void loop () {  
  char buffer[30], sTemp1[7], sTemp2[7];
  
    if (digitalRead(pinDOS) == LOW){         // entra al if si presiona pin 2
       delay(100);          
       TimeSTAR = millis();               
       while (digitalRead(pinDOS) == LOW){    // pregunta si continua resionado pin 2
          TimeEND = millis();                // 
          if ((TimeEND - TimeSTAR) >= 5000){ // pregunta si pasaron 5 seg..
             valor = 0;
             TimeEND = 0;
           }
          else {
             valor = 1;                      // se pone valor = 1 para pasar a case 1
          }
        }
      } 
        
    LecturaTemp();           // llama funcion para lectura de T°
    
    switch(valor){            // switch para elegir el modo de trabajo
      case 0:
          digitalWrite(LED, HIGH);
          EscrituraSerial();       // llama a la funcion para escribir en pantalla         
          EscribeTempOLED();       // llama funcion para lectura de T°
          TimeSTAR = millis();   
          digitalWrite(LED, LOW);
          delay (100);   
          break;
          
      case 1:          
          TimeEND = millis();
          digitalWrite(LED, HIGH);
          if (TimeEND - TimeSTAR >= 10000){         // entra al if si pasó 10 seg.
              digitalWrite(LED, LOW);
              archivo = SD.open ("datos1.txt", FILE_WRITE); // apertura para read/write de archivo datos.txt
              if (archivo) {            
                  DateTime fecha = rtc.now();      // fecha es tipo dateTime
                  dtostrf(Temp1, 6,2, sTemp1);
                  dtostrf(Temp2, 6,2, sTemp2);
                  sprintf(buffer, "%02d/%02d/%02d %02d:%02d:%02d, %s, %s", fecha.year(), fecha.month(), fecha.day(), fecha.hour(), 
                                                                           fecha,minute(), fecha.second(), sTemp1, sTemp2);
                  archivo.print(buffer);
                  archivo.close ();              // cierre de archivo*/ 
                  Serial.println ("escritura correcta"); // escritura correcta en SD           
                  EscribeTempOLED();       // llama funcion para lectura de T°          
                  EscrituraSerial();
               } 
              else {
                  Serial.println ("error en apertura de datos.txt"); // falla en apertura de archivo
             }              
             TimeSTAR = millis();
             TimeEND = 0;
          }
         break;
     }
      
 }

Prueba a ver si se comporta mejor.

Hola a todo otra vez,
Ahora copie todo el programa en otro sketch pero esta vez borre todo lo que involucra a la oled (librerías, instrucciones en el setup, instrucciones en el loop). el programa hace lo mismo que el original pero ya no involucra a la oled (es decir no existe)..
Todo funciona bien es decir si escribe en la SD la fecha, hora y las lecturas de los sensores, con el púlsador puedo pasar de case 0 a case 1 y viceversa.
Esto es lo que aparece en el puerto serial(solo copie un fragmento):

2022/1/22 21:55:10 , 14.9,22.1
2022/1/22 21:55:20 , 15.9,21.6
2022/1/22 21:55:31 , 16.6,21.1
2022/1/22 21:55:41 , 17.4,20.6
2022/1/22 21:55:52 , 17.9,20.2

Y lo mismo que aparece en el puerto serial esta grabado en la SD, sera que hay conflicto en el bus I2C...

Hola Surbyte,
Hice lo que me indicaste, el resultado es el mismo se sigue reiniciando..
Hay alguna manera de asignar una dirección al rtc y al oled, quizá están en conflicto...

Saludos,

Mira, otra cosa que descubrimos con el forero del problema que mencioné inicialmente es que OLED tiene un alto consumo de tiempo. Eso puede dificultar la tarea I2C pero nada mas.
Lo mas adecuado es refrezcar la pantalla OLED a intervalos de digamos 1000 mseg y mientras hacer las demas cosas sin interferir uno con otro.

#include <SPI.h>                // incluye libreria interfaz SPI (micro SD)
#include <SD.h>                 // incluye libreria para tarjetas SD
#include <OneWire.h>
#include <DallasTemperature.h>  // librerias para sensor DS18B20
#include <Wire.h>               // incluye libreria para interfaz I2C
#include <RTClib.h>             // libreria para manejo de modulo RTC

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>      // libreria para controlador SSD1306
#define ANCHO 128        // reemplaza ocurrencia de ANCHO por 128
#define ALTO 64          // reemplaza ocurrencia de ALTO por 64
#define OLED_RESET 4     // necesario por la libreria pero no usado
Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET);    // crea objeto oled*/

#define DATO 44       // pin 3 entrada de datos
#define SSpin 53      // Slave Select en pin digital 

float  Temp1, Temp2, TimeSTAR, TimeEND;   // variables globales
byte   pinDOS = 22, LED = 24, valor = 0;   // pin 2 entrada
RTC_DS3231 rtc;                           // crea objeto rtc tipo RTC_DS3231

File archivo;                             // objeto archivo del tipo Archivo
OneWire oneWire(DATO);
DallasTemperature sensors (&oneWire);     // declara variable/objeto para sensor
DeviceAddress Sensor1 = {0x28, 0x5A, 0xA9, 0x79, 0x97, 0x14, 0x03, 0x63};
DeviceAddress Sensor2 = {0x28, 0x97, 0x46, 0x95, 0xF0, 0x01, 0x3C, 0x6B};

void setup() {
  Serial.begin (9600);                  // inicializa monitor serie a 9600 bps
  Wire.begin();                         // inicializa bus I2C
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // inicializa pantalla con dirección 0x3C (bus I2C)
  pinMode(pinDOS, INPUT);                  // pin 22 entrada
  pinMode(LED, OUTPUT);

  Serial.println ("Inicializando tarjeta ...");   // texto en ventana de monitor
  if (! SD.begin (SSpin)) {                       // inicialización de la tarjeta SD
    Serial.println ("fallo en inicializacion!");  // si falla se muestra texto correspondiente y
    return;                                         // se sale del setup () para finalizar el programa
  }
  Serial.println ("inicializacion correcta");     // texto de inicializacion correcta*/

  sensors.setResolution(Sensor1, 11);   // sensor1 a resolución de 9 bits
  sensors.setResolution(Sensor2, 11);   // sensor2 a resolución de 9 bits

}

void loop () {
  char buffer[30], sTemp1[7], sTemp2[7];

  if (digitalRead(pinDOS) == LOW) {        // entra al if si presiona pin 2
    delay(100);
    TimeSTAR = millis();
    while (digitalRead(pinDOS) == LOW) {   // pregunta si continua resionado pin 2
      TimeEND = millis();                //
      if ((TimeEND - TimeSTAR) >= 5000) { // pregunta si pasaron 5 seg..
        valor = 0;
        TimeEND = 0;
      }
      else {
        valor = 1;                      // se pone valor = 1 para pasar a case 1
      }
    }
  }

  LecturaTemp();           // llama funcion para lectura de T°

  switch (valor) {          // switch para elegir el modo de trabajo
    case 0:
      digitalWrite(LED, HIGH);
      EscrituraSerial();       // llama a la funcion para escribir en pantalla
      EscribeTempOLED();       // llama funcion para lectura de T°
      TimeSTAR = millis();
      digitalWrite(LED, LOW);
      break;

    case 1:
      TimeEND = millis();
      digitalWrite(LED, HIGH);
      if (TimeEND - TimeSTAR >= 10000) {        // entra al if si pasó 10 seg.
        digitalWrite(LED, LOW);
        archivo = SD.open ("datos1.txt", FILE_WRITE); // apertura para read/write de archivo datos.txt
        if (archivo) {
          DateTime fecha = rtc.now();      // fecha es tipo dateTime
          dtostrf(Temp1, 6, 2, sTemp1);
          dtostrf(Temp2, 6, 2, sTemp2);
          sprintf(buffer, "%02d/%02d/%02d %02d:%02d:%02d, %s, %s", fecha.year(), fecha.month(), fecha.day(), fecha.hour(),
                  fecha, minute(), fecha.second(), sTemp1, sTemp2);
          archivo.print(buffer);
          archivo.close ();              // cierre de archivo*/
          Serial.println ("escritura correcta"); // escritura correcta en SD
        }
        else {
          Serial.println ("error en apertura de datos.txt"); // falla en apertura de archivo
        }
        EscribeTempOLED();       // llama funcion para lectura de T°
        EscrituraSerial();
        TimeSTAR = millis();
      }
      break;
  }

}

// Función para tomar lectura de T°
void EscribeTempOLED() {
  oled.clearDisplay();
  oled.setTextColor(WHITE);
  oled.setCursor(0, 0);           // ubica cursor en inicio de coordenadas 0,0
  oled.setTextSize(1);            // establece tamaño de texto en 1
  oled.print("Temperaturas : ");  // escribe en pantalla el text

  oled.setCursor(10, 17);         //
  oled.setTextSize(2);
  oled.print("T1: ");
  oled.print(Temp1, 1);

  oled.setCursor(10, 40);
  oled.setTextSize(2);
  oled.print("T2: ");
  oled.print(Temp2, 1);
  oled.display();

}

// Función para tomar lectura de T°
void LecturaTemp() {
  sensors.requestTemperatures();        // envia comandos para tomar lectura
  Temp1 = sensors.getTempC(Sensor1);    // toma lectura del sensor 1
  Temp2 = sensors.getTempC(Sensor2);    // toma lectura del sensor 2
}

// Función para esribir en el puerto serial
void EscrituraSerial() {
  Serial.print(Temp1, 1);
  Serial.print(" , ");
  Serial.println(Temp2, 1);
}

Hola a todos,
comentarles que finalmente pude resolver este problema en realidad ya hace un par de semanas solo que andaba muy ocupado; el código sigue siendo el mismo en un 99% antes usaba un pulsador ahora es un selector.
Todo anda bien como quería.

Por otro lado recién hace unos días pude adquirir el shield ethernet (para arduino UNO, MEGA) tengo dos consultas:
Es necesario que este apilado sobre el UNO o MEGA, osea lo puedo usar con cables separado, por temas de espacio.
Como puedo acceder (escribir/leer) a la SD del shield ehternet, tengo entendido que no pueden funcionar al mismo tiempo el acceso a la SD y el acceso a internet yo quiero usar ambos, algún código de ejemplo.
Gracias.

No es necesario apilarla, la idea de las shield es apilarlas por un tema de simplicidad pero puedes cablearla sin problemas.

No tengo idea, tendría que investigarlo igual que vos, así que en eso ahora no te puedo ayudar.

Saludos

Yo no he usando aun ese tipo de shield, pero si dicen que no pueden funcionar al mismo el ethernet y la SD entiendo que es porque usan pines comunes para ambos propositos, pero creo que este tipo de shield se comunican con arduino por el bus SPI, en teoria solo habria que seleccionar en cada momento del programa con cual de los dos dispositvos te quieres comunicar, creo que el pin 10 se utiliza para seleccionar el Ethernet y el pin 4 para la tarjeta SD, habria que probarlo.

Para comenzar NADA funciona simultáneo en Arduino.
La interface SPI es la mas rápida de todas las que existen de modo que es de suponer que mas alla que compartan pines SPI, lo que diferencia cual está en uso es el CS Chip Select.
Seleccionas Ethernet y tendrás sus registros.
Seleccionas SD y tendras la comunicación con el otro dispositivo.
Puedes tener 2 y mas dispositivos SPI sin problemas.
Se suele usar pin 4 en la SD porque los shield Ethernet la suelen tener cableada asi.

Estimados
Gracias por sus comentarios..
Surbyte tiene razón, debí poner comillas a mi comentario.
Saludos..

Hola a todos,
Estoy probando el shield ethernet w5100, el código es sencillo:
Por cada ciclo del loop se incrementa la variable valor y se envía al puerto serial, también es enviada a la red LAN. Tiene un LED que solo parpadea cuando el selector se pone a LOW y se queda encendido cuando selector esta en HIGH.
Todo funciona bien pero cuando inserto la micro SD en el shield todo se congela, retiro la SD reseteo y se soluciona.
Que estaría pasando (uso el MEGA)...

Nota: no estaba seguro si crear un nuevo tema, por eso decidi escribir aqui.

#include <SPI.h>
#include <SD.h>    
#include <Ethernet.h>
#define  pin53 53

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,59);   // Esta direccion IP  

byte LED = 25, SELECTOR = 30;
int  valor = 0;
EthernetServer server(80);    // Puerto 80 por defecto para HTTP

 void setup() {
    Serial.begin(9600);
    pinMode(SELECTOR, INPUT);
    pinMode(LED, OUTPUT);
    pinMode(pin53, OUTPUT);
    Ethernet.begin(mac, ip);    //inicializa la conexiÛn Ethernet y el servidor
    server.begin();
}   

void loop() {
  digitalWrite(LED, HIGH);
  valor++;
  Serial.println(valor);
  delay(1000);
  
  EthernetClient cliente = server.available(); // Inicializa cliente como servidor ethernet
  if (cliente) {
    boolean currentLineIsBlank = true;
    while (cliente.connected()) {
      if (cliente.available()) {
        char c = cliente.read();
        if (c == '\n' && currentLineIsBlank) { 
          cliente.println("HTTP/1.1 200 OK");
          cliente.println("Content-Type: text/html");   // Envia el encabezado HTML estandar
          cliente.println("Connection: close"); 
          cliente.println("Refresh: 3");  // refresca la pag cada 3 segundos
          cliente.println();
          cliente.println("<!DOCTYPE HTML>"); 
          cliente.println("<html>");
          cliente.println("<HEAD>");
          cliente.println("<TITLE>Ethernet Monitor</TITLE>");
          cliente.println("</HEAD>");
          cliente.println("<BODY>");
          cliente.println("<hr />");
          cliente.println("<H1>Arduino Monitor</H1>");
          cliente.println("<br />");  
          cliente.println("<H2>Monitorea Valor</H2>");
          cliente.println("<br />");  
          cliente.println("Lectura Analoga Ethernet");  
          cliente.println("<br />");
          cliente.println("<br />");
          cliente.print("Valor: ");
          cliente.println(valor);
                 
          cliente.println("<br />"); 
          cliente.println("</html>");
          break;
        }
        if (c == '\n') {
           currentLineIsBlank = true;
        } 
        else if (c != '\r') {
           currentLineIsBlank = false;
        }
      }
    }
   delay(15);          // Da tiempo al Servidor para que reciba los datos 15ms
   cliente.stop();     // cierra la conexion
  }

/****************** Codigo para detectar selector  *******************/
   if (digitalRead(SELECTOR) == LOW ){
        digitalWrite(LED, LOW);
        delay(150);
    } 
 
 }