Controla la temperatura de tu Raspberry Pi con Arduino


Raspberry Pi es un gran mini-ordenador y tiene muchas opciones, quizá demasiadas, pero si algo es cierto, es que cuando utilizamos nuestra Raspberry Pi se calienta demasiado, y esto puede llevar a problemas con la CPU.

El rango recomendado de uso de temperaturas de Raspberry Pi es 20-75ºC, pero demasiadas veces la temperatura es superior.

Para mejorar esto, tenemos varias opciones, utilizar disipadores de calor o disipadores de calor y ventiladores. Como cualquier aparato electrónico con alta temperatura, forzar la entrada y salida de aire hará que la temperatura baje.

Es recomendable utilizar una fuente externa a Raspberry Pi para alimentar los ventiladores y así evitar problemas mayores. Si utilizamos Arduino podremos bajar la temperatura de Raspberry Pi sin poner en peligro ninguno de los componentes. Los materiales que necesitamos son:

  • Arduino.
  • Ventilador x2.
  • Led rojo, amarillo y azul.
  • Potenciómetro.
  • Fuente externa de alimentación para los ventiladores.
  • Transistor NPN o PNP. Yo he utilizado un NPN BC 377.
  • Resistencias: 1KΩ y 330 Ω x3

Arduino podremos conectarlo a un puerto usb de Raspberry Pi, ya que no tiene demasiado consumo, o incluso a los pines 5V y GND de Raspberry Pi. El transistor lo vamos a utilizar como interruptor para activar o desactivar los ventiladores y evitar subir el consumo de Arduino.

El esquema de conexión para seguir este tutorial es el siguiente:

 

Raspberry Pi
Ampliar imagen: Click Derecho / Abrir imagen en una pestaña nueva

VCC1 y GND1 corresponden a la alimentación de 5V y tierra de Arduino, y VCC2 y GND2 a la alimentación externa.

Y, como siempre, el video explicativo del tutorial:

A continuación, tenéis el código disponible para descargar y utilizar:

 

/*
  written by Luis Diaz (mail: luis@drmaker.es)
  Raspberry Pi Fan control with Arduino
  www.drmaker.es
  Aug-04-2014

*/

int pinTemp = A8, pinFan = 2, pinRojo = 4, pinAmar = 5, pinVerde = 6, pinPot = A7;
float temp, baseTemp = 15;

int estado;
int basePot = 341, lecPot;

float temperatura() {

  float Vout;
  float res = 0.010; // en V/ºC
  float muestras = 100, suma, media;

  for (int i = 0; i < muestras; i++) {
    Vout = analogRead(pinTemp) * 0.00488758553275; // step * V/step = V
    temp = (Vout / res ) - 2.5; // V/(V/ºC) = ºC
    suma += temp; //suma = suma + temp;
    delay(10);
  }
  temp = suma / muestras;

  return temp;

}

void ledTest() {
  int pin = 4, pinMax = 6;
  for (pin; pin < pinMax + 1; pin++) {
    digitalWrite(pin, HIGH);
    delay(750);
    digitalWrite(pin, LOW);
  }

}

void setup() {

  Serial.begin(115200);

  pinMode(pinTemp, INPUT);
  pinMode(pinPot, INPUT);

  pinMode(pinFan, OUTPUT);
  pinMode(pinRojo, OUTPUT);
  pinMode(pinAmar, OUTPUT);
  pinMode(pinVerde, OUTPUT);


  ledTest();

}

void fan (int estado) {

  Serial.println("funcion fan");

  int base = 85;
  long nextTime, intervalo = 5000;

  nextTime = millis() + intervalo;
  if (estado != 0) {
    do {
      switch (estado) {
        case 1:
          analogWrite(pinFan, base);
          break;
        case 2:
          analogWrite(pinFan, base * 2);
          break;
        case 3:
          analogWrite(pinFan, base * 3);
          break;
      }

    } while (millis() < nextTime);
    analogWrite(pinFan, 0);
    delay(3000);
  }
}

void led (int estado) {

  switch (estado) {
    case 0:
      digitalWrite(pinRojo, LOW);
      digitalWrite(pinAmar, LOW);
      digitalWrite(pinVerde, LOW);
      break;

    case 1:
      digitalWrite(pinRojo, HIGH);
      digitalWrite(pinAmar, LOW);
      digitalWrite(pinVerde, LOW);
      break;

    case 2:

      digitalWrite(pinRojo, LOW);
      digitalWrite(pinAmar, HIGH);
      digitalWrite(pinVerde, LOW);
      break;

    case 3:

      digitalWrite(pinRojo, LOW);
      digitalWrite(pinAmar, LOW);
      digitalWrite(pinVerde, HIGH);
      break;

  }
}

void loop() {
  lecPot = analogRead(pinPot);
  
  if (lecPot == 0) {
    estado = 0;
  } else {
    if (lecPot < basePot) {
      estado = 1;
    } else {
      if (lecPot < basePot * 2) {
        estado = 2;
      } else {
        estado = 3;
      }
    }
  }

  led(estado);

  temp = temperatura();
  Serial.println(temp);
  if (temp > baseTemp) {
    fan(estado);
  }
}

Puedes descargar el archivo desde aquí:

arduino archivo
Click derecho /descargar archivo enlazado como..

 

 

 

Si tenéis cualquier duda, problema o sugerencias sobre tutoriales, recordad que podéis contactar en los comentarios de la web y youtube, también en nuestras redes sociales.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *