Arduino Mega + EthernetShield = Mucha Temperatura y Bloqueo.

Buenas chicos, a ver si me podéis echar una mano:

Estoy realizando un proyecto para medir la humedad del suelo y subir los datos a una base de datos, el tema es que tengo conectado un Arduino Mega y una Ethernet Shield, y las estoy alimentando con una fuente externa de 9V y 850mA , cuando lleva un rato funcionando se calienta y se bloquea.

He estado mirando que el tema puede estar en que el regulador se calienta y como consecuencia calienta la placa y se bloquea.

Esto de arriba era un error, el arduino no se bloquea por el calor, es algo del código, porque con un arduino nuevo alimentado por la entrada de 5v se bloquea igualmente, 4 post mas abajo pongo el código, por si veis algo raro....

La instalación consta de :

He probado con las siguientes fuentes de alimentación:

  • 12v 1.5 A -> Se calienta una barbaridad.
  • 9V 1A -> Se calienta bastante al cabo de las horas se bloquea ( Ahora mismo es verano y hay unos 26º de temperatura ambiente )

**** Actualización he probado con un Arduino Mega nuevo y tb se calienta con la fuente de 9v 850MA , por lo que entiendo que el problema no esta en el arduino... He conectado el arduino y la ethernet shield, sin sensor ni nada conectado únicamente hago que se conecte a la red y el regulador se calienta a tope, asi que el tema tiene que estar con el ethernet shield. ***

  • También he probado a alimentar el arduino por el pin Vinn con un cargador de móvil que da 5V 1A , pero las lecturas que me daba el SoilWatch no eran correctas, y creo que era porque le faltaba algo de voltaje...

Esta tarde me llega una fuente de alimentación externa de 5V 10A ...

¿ Pensáis que es mejor que coja la alimentación del SoilWatch y del sensor de Temperatura de la fuente directamente, sin pasar por la placa?

*** Actualización: Por otro lado, si conecto el arduino por el jack externo con una fuente de 5v, si mido la salida de 5v del arduino... no da 5v, se baja a 4.4 o así aproximadamente ***

Hola. No sé si aplica a tu caso, pero hace tiempo por aquí leí algo similar y el problema estaba en que la placa trabajaba a 3,3v y no a los 5v que le daba Arduino. Mira a ver a qué tensión trabaja tu placa de red. :wink:

Hi,
Mi sugerencia seria de alimentar el mega directamente del power supply de 5 voltos y incluyendo los sensores. Asi no usas el regulador del maga para los sensores.

Esfinterman:
Hola. No sé si aplica a tu caso, pero hace tiempo por aquí leí algo similar y el problema estaba en que la placa trabajaba a 3,3v y no a los 5v que le daba Arduino. Mira a ver a qué tensión trabaja tu placa de red. :wink:

Gracias por responder la shield ethernet que estoy usando es esta... Ks0156 keyestudio W5100 Ethernet Shield - Keyestudio Wiki

Pero no veo a cuanto trabaja la placa.

El tema es la que placa que se calienta es el Arduino no la ethernet shield..

Acabo de ver esto:

Puede que la placa trabaje a 3.3 y este sobrecargando el regulador, como tu bien dices..?
De ser asi? Que debería desconectar los pines de alimientación de la shield y alimentarla por el vinn con 3.3v ?

tauro0221:
Hi,
Mi sugerencia seria de alimentar el mega directamente del power supply de 5 voltos y incluyendo los sensores. Asi no usas el regulador del maga para los sensores.

Esta tarde me llega una fuente de 5V que he pedido, voy a intentar alimentar el mega por el pin Vinn ( a esto te refieres no? )

Y los sensores, meter los positivios directamente a la fuente de alimentación y los negativos conectarlos conjuntamente todos y al Mega.

Pues me auto respondo por si alguien le interesa en un futuro:

Después de realizar varias pruebas, veo que el calentamiento de la placa y del regulador viene por la EthernetShield, cuando conecto la fuente de 9v 1a al jack de alimentación externo la placa de arduino se calienta una barbaridad, y yo achacaba que se quedad colgado por el calor , pero me he dado cuenta de que no se queda colgado por el calor sino que se cuelga el programa por alguna otra razón.

Para el calor he econtrado otra solución que es alimentar el arduino con 5v directamente por la clavija de 5v, saltandome el regulador, dentro de unos días probaré con una fuente de 7v a ver si se calienta menos por el jack.

Pero ahora me encuentro que el programa se cuelga, por alguna razón que desconozco, os pongo el código por si alguien puede encontrar algún motivo.

/*
 * 
 * PROGRAMA PARA LA LECTURA DE SONDA DE HUMEDAD DE SUELO PINO-TECH Y SUBIDA A BASE DE DATOS.
 *  -> Leemos la sonda de humedad por la entrada analógica A0, y luego subimos la lectura a una base de datos mysql para su
 *  posterior tratamiento.
 *  -> Para subir la información utilizamos una web y pasandole los datos mediante una función get y php subimos la información.
 *  
 *  La sonda de humedad de pino-tech  SoilWatch 10 tiene la siguientes característica:
 *  - Cable blanco: Salida del sensor, se conecta a la entrada analógica A0.
 *  - Cable Verde : GND , se conecta a GND DE ARDUINO.
 *  - Cable Marron: Entrada de alimentación del sensor ( 3.3v o 5v ), segun la documentación es mas estable a 3.3v.
 *  Antes de instalar la sonda hay que calibrarla, para ello, se realiza una lectura de la misma fuera de la tierra y se lee la salida
 *  y luego se hace otra lectura dentro del agua y estos valores se guardan en la variable minADC y maxADC respectivamente.
 */

 #include <avr/wdt.h>
 #include <Ethernet.h>
 #include <OneWire.h>
 #include <DallasTemperature.h>


/* DECLARACIÓN DE CONSTANTES USADAS DURANTE EL PROGRAMA */

 const int analogInPin = A0; // Pin de entrada analógica sensor SoilWatch 10.
 const int minADC = 0;       // Lectura del sensor al aire.
 const int maxADC = 600;     // Lectura del sensor sumergido en agua.
 const int pinSensorTemp = 7;// Pin digital de la sonda de temperatura DS18B20

 byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //Establecemos la mac de la Shield Ethernet.
 char serverName[] = "host.host.es";     // Servidor donde está alojada la web.
 int serverPort = 80;                                //Puerto que usa el servidor web
 byte ip[] = {192,168,0,89};                         //IP de arduino dentro de la red local
 EthernetClient client;                             // Incializamos el cliente web

 /* Declaración de variables usadas durante el programa */
 int moistureValue, valorHumedad;
 //Estas variables se les asignará un valor fijo temporalmente solo para las pruebas.
 float temperaturaSuelo,temperaturaInterior,humedadInterior;

void setup() {
  Serial.begin(9600);     //Inicializamos la comunicación Serial a 9600 bps
  Ethernet.begin(mac,ip); //Inicializamos la ethernet shield
  //DS18B20.begin();      //Inicializamos el sensor de temperatura exterior ** Actualmente desconectado. **
  delay(1000);            //Realizamos un delay de un segundo para que todo se inicie sin problemas.

}

void loop() {
  
  leerHumedad();
  
  leerTemperaturaSuelo();

  sendGet(temperaturaInterior,humedadInterior,temperaturaSuelo,0.0,valorHumedad);
}

/*Fucion leerHumdada()
   * Valores entrada: Ninguno
   * Valores salida: Ninguno
   * Descripción: Esta función leerá la sonda Soilwatch y el valor de voltaje lo traduciremos a %. Este valor se almacenará
   * en la variable valorHumedad
  */
void leerHumedad(){
  Serial.println("Comenzamos con la lectura del sensor de Humedad SW");
  //leemos la entrada analogica A0
  moistureValue = analogRead(analogInPin);
  //cambiamos la lectura a %
  valorHumedad = map(moistureValue,minADC,maxADC,0,100);
  //mostramos la lectura y su mapeo por el puerto serial
  Serial.print("Moisture=");
  Serial.print(moistureValue);
  Serial.print(" Humedad(%)=");
  Serial.println(valorHumedad);
  }

   /*
   * Funcion leerTemperaturaSuelo()
   * Valores entrada: Ninguno
   * Valores salida: Ninguno
   * Descripción: Lee la temperatura y la humedad de la sonda de temperatura DHT21, Y la temperatura de la sonda DS18B20 y guarda
   * los valores en las variables temperaturaSuelo, temperaturaInterior, humedadInterior
   * **** ESTA FUNCIONA AHORA MISMO NO HACE NADA NO ESTA IMPLEMENTADA AUN ***
  */
  void leerTemperaturaSuelo(){

    temperaturaSuelo = 25.0;
    temperaturaInterior = 30.0;
    humedadInterior = 56.0;
    }

  /*
   * Funcion sendGet()
   * Valores entrada: temperaturaInterior,humedadInterior,temperaturaSuelo,0.0,valorHumedad
   *  - temperaturaInterior (float) : actualmente no se controla, se le da un valor fijo
   *  - humedadInterior (float ): actualmente no se controla, se le da un valor fijo
   *  - temperaturaSuerlo (float) : actualmente no se conttrola, se le da un valor fijo
   *  - 0.0 
   *  - valorHumedad: Lectura de la sonda SoilWatch
   *  Descripción: Se realiza un paso por parametros Get a una web php que introduce los valores en la base de datos.
  */

  void sendGet ( float ti, float hi, float tis, float hs, float hsw){
    
    if(client.connect(serverName,serverPort) == 1){
      Serial.println("Conectado al servidor");

      client.print("GET /datos/indexinterior.php?tmp="); client.print(ti);
      client.print("&hmd="); client.print(hi);
      client.print("&tmpis=");client.print(tis);
      client.print("$hums=");client.print(hs);
      client.print("&humsw");client.print(hsw);
      client.println(" HTTP:/1.0");
      client.println("Host: host.host.es");
      client.println();
      }else{
        Serial.println(" La conexión ha fallado");
        Serial.println();
        }

      while(client.connected() && !client.available()) delay (1); //esperamos los datos
      while(client.connected() || client.available()){
        char c = client.read(); //obtenemos el buffer ethernet
        Serial.print(c); // Mostramos el buffer por el monitor serial.
        }

        client.stop(); //paramos el cliente.
        Serial.println("Cliente desconectado");
    }

La fuente de 5V que estas usando podría no tener un buen filtrado.
En este punto te aconsejo que midas con un multímetro en AC la tensión de rizado o ripple presente. Por supuesto comienza con una escala de 2V max y luego baja hasta leer algun valor estable.
Si el valor fuera del orden de los 100mV o mas entonces : Aplica el método @tauro que ya lo tengo como un fanático de los capacitores (broma aparte, porque tiene razón).
Busca o compra un capacitor de 470uF x 6.3V como mínimo si es de mas tensión también (digamos 16V pero la tensión solo debes ser mayor a 6.3).
También coloca un capacitor cerámico de 0.1uF en paralelo con el anterior.

Veamos si luego de eso siguen los problemas. Asi que vuelve a medir con el multímetro la tensión en AC.
La tensión de ripple debería bajar. Pero ya nos dirás si eso ocurre.

Me auto soluciono el problema.... Al parecer he dado con el origen del bloqueo y se trata de un bloqueo software... por algún motivo este fragmento de código:

while(client.connected() && !client.available()) delay (1); //esperamos los datos
      while(client.connected() || client.available()){
        char c = client.read(); //obtenemos el buffer ethernet
        Serial.print(c); // Mostramos el buffer por el monitor serial.
        }

Al mostrar el buffer por la salida Serial, en alguna ocasión desembocaba en un bloqueo del arduino, simplemente eliminando esa fragmento , se soluciona el problema... este while simplemente estaba para controlar lo que devolvía la página web... pero no es necesario para la aplicación en si.

Yo he visto esta linea de otro modo

while(client.connected() && !client.available()) delay (1); //esperamos los datos
      while(client.connected() || client.available()){
        char c = client.read(); //obtenemos el buffer ethernet
        Serial.print(c); // Mostramos el buffer por el monitor serial.
     }
}

Esto no lo entiendo.

while(client.connected() && !client.available()) delay (1);

Cliente conectado Y no hay cliente disponible ?? QUE? me parece un contrasentido.

lo siguiente esta bien.

surbyte:
Yo he visto esta linea de otro modo

while(client.connected() && !client.available()) delay (1); //esperamos los datos

while(client.connected() || client.available()){
        char c = client.read(); //obtenemos el buffer ethernet
        Serial.print(c); // Mostramos el buffer por el monitor serial.
    }
}

Esto no lo entiendo.

while(client.connected() && !client.available()) delay (1);

Cliente conectado Y no hay cliente disponible ?? QUE? me parece un contrasentido lo siguiente esta bien.

Como bien dices, puede que sea esta la que me está bloqueando... lo analizaré con más detenimiento.
Un saludo.