Nevera Robot

Nevera

Introducción

Este proyecto ha sido desarrollado por el grupo 13, formado por los alumnos Hugo García Castanedo, Adrián Humia García, Laura Sánchez Muñoz y Óscar Utrilla Mora. El proyecto consiste en una nevera portátil controlable mediante una aplicación móvil. La idea surgió a raíz de la visita a un blog en el que se explicaba cómo se había desarrollado una nevera que seguía a un individuo en función de las coordenadas pasadas a través de un módulo bluetooth (referencia al blog: https://programarfacil.com/podcast/nevera-arduino-perrito-faldero/).

El funcionamiento de nuestro proyecto es muy similar al que se presenta en este blog, pero nuestra implementación incluye algunas mejoras respecto al otro. En primer lugar, en vez de transmitir coordenadas, damos la posibilidad al usuario de controlar directamente el movimiento de la nevera. En segundo lugar, incluimos un sensor de temperatura que nos permite mostrar la temperatura interior de la nevera a través de un anillo de 12 LEDs colocado en el exterior del chasis. Por último, también se incluye una balanza para mostrar el peso de la nevera en todo momento (también a través de un anillo de 12 LEDs).

Su utilidad viene determinada por el siguiente diagrama de casos de uso:

Componentes Utilizados

Placa Arduino uno1Proporcionado por
la universidad
Protoboard1En propiedad del grupo
Tornillos y TuercasVarias unidades En propiedad del grupo
Pilas AA 1.5V81.60€
Porta pilas 4 pilas AA15.20€
Chasis de plástico1 En propiedad del grupo
Interruptor13.50€
Ruedas y motores
reductores para coche
2 ruedas
2 motores
9.90€
Controlador de
movimiento L298N
17.99€
Rueda giratoria11.57€
Báscula HX711 con
conversor analógico digital
17.99€
Sensor de temperatura
y humedad DHT11
16.29€
Anillos RGB LED de
12 Diodos cada uno
28.66€
Módulo bluetooth HC-0518.45€
Coste Total65.85€

Esquemas de montaje

En este apartado indicamos los esquemas de montaje de las partes más complicadas, ya que, algunas como la conexión del módulo DHT11 no son muy complejas

Esquema del controlador L298N de los motores
Esquema de la báscula HX711
Esquema de los leds

A la hora de montar todos los componentes, necesitamos usar una protoboard externa para poder conectar varios dispositivos, tanto al pin de 5V, como al de tierra del Arduino.

Problemas y Soluciones

Problema 1: Colocamos de forma errónea los cables del sensor de temperatura, provocando que se estropeara. Esto se debió a la gran similitud entre varios modelos de sensor de temperatura. Al final, tuvimos que comprar uno nuevo.

Problema 2: La báscula mide el peso únicamente en el extremo en vez de en la totalidad de su superficie. Debido a esta forma de funcionar de la báscula, tuvimos que ingeniárnoslas para conseguir medir el peso creando esta estructura.

Problema 3: Algunos componentes requerían ser soldados y las soldaduras tenían que ser muy precisas para evitar cortocircuitos.

Video Demostración

Código en Arduino

#include <SoftwareSerial.h>
#include <Adafruit_NeoPixel.h>
#include <elapsedMillis.h>
#include "HX711.h"
#include "DHT.h"

#define PIN_TEMP 11 // PIN del led de la temperatura
#define PIN_PESO 12 // PIN del led de la balanza
//#define PIN_SENSOR_TEMP 13 // PIN del entrada de la temperatura
#define NUMPIXELS 12 // Numero de Diodos del led
#define T_MAX 12 // TEMPERATURA MAXIMA EN GRADOS CELSIUS
#define T_MIN 0
#define P_MAX 1.0 // PESO MAXIMO EN KG
#define P_MIN 0

SoftwareSerial miBT(2, 3);   //Instancia la conexion al bluetooth - PIN 2 a TX y PIN 3 a RX
Adafruit_NeoPixel led_temperatura = Adafruit_NeoPixel(NUMPIXELS, PIN_TEMP, NEO_GRB + NEO_KHZ800); // Led de la temperatura
Adafruit_NeoPixel led_balanza = Adafruit_NeoPixel(NUMPIXELS, PIN_PESO, NEO_GRB + NEO_KHZ800); // Led de la balanza

HX711 balanza; // Balanza

//DHT sensor_temperatura(PIN_SENSOR_TEMP, DHT11); // Sensor DHT11

elapsedMillis tiempoPasadoTemperatura;
elapsedMillis tiempoPasadoBalanza;

int temp = 6; // Inicializamos la temperatura a 6 grados
const int DOUT=A1; // CONSTANTE DE LA BALANZA
const int CLK=A0; // CONSTANTE DE LA BALANZA

//Entrada de los motores
int motor1A = 5; // INPUT 1
int motor1B = 6; // INPUT 2
int motor2A = 10; // INPUT 3
int motor2B = 9; // INPUT 4

// Dato recibido atraves de la aplicacion movil
char data = 'S';

void setup()
{  
  //Definimos las salidas del arduino
  pinMode(motor1A , OUTPUT);
  pinMode(motor1B , OUTPUT);  
  pinMode(motor2A , OUTPUT);  
  pinMode(motor2B , OUTPUT);
      
  Serial.begin(9600); //Inicia la comunicación en el monitor serial a 9600 Baudios
  miBT.begin(9600); // inicialmente la comunicacion serial a 9600 Baudios (velocidad de convencional)
  // Inicializamos los sensores y leds
  inicializarTemperatura();
  inicializarBalanza();
  //sensor_temperatura.begin();
  Serial.println("Módulo conectado");
}
 
void loop()
{
    //Esperamos hasta que haya un Stream de datos
    if(miBT.available() > 0){
      data = miBT.read();
      Serial.println(data);
    }
    if(data != 'S'){  
      switch (data) {
      case 'F':
        avanzar();        // Forward | AVANZAR
        break;
      case 'B':
        retroceder();     // Backward | RETROCEDER
        break;
      case 'L':
        izquierda();  //Left | IZQUIERDA
        break;
      case 'R':
        derecha();    //Right | DERECHA
        break;
      case 'G':
        avanceIzq();    //Stop | Avance Izq
        break;
      case 'I':
        avanceDrcha();    //Stop | Avance Drcha
        break;
      case 'H':
        atrasIzq();    //Stop | Atras Izq
        break;
      case 'J':
        atrasDrcha();    //Stop | Atras Drcha
        break;
      }
      tiempoPasadoBalanza = 0;
    }
    else{ 
        detener();    //Stop | DETENER
        if(tiempoPasadoTemperatura > 1500){ //Actualizamos la temperatura de la nevera cada 1'5 segundos
          actualizarTemperatura(); 
          tiempoPasadoTemperatura = 0;
        }
        if(tiempoPasadoBalanza > 4500){ // Si el coche no se ha movido durante 4'5 segundos, se actualiza la balanza
          actualizarPeso();
          tiempoPasadoBalanza = 0;
        }
    }
    delay(20);
}

void avanzar(){
  // Forward | AVANZAR
  digitalWrite(motor1A, HIGH);
  //digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, HIGH);
  //digitalWrite(motor2B, LOW);
      
}

void retroceder(){
  // Backward | RETROCEDER
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, HIGH);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, HIGH); 
}

void derecha(){
  //Right | DERECHA
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, HIGH); 
}

void izquierda(){
  //Left | IZQUIERDA
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, HIGH);
  digitalWrite(motor2A, HIGH);
  digitalWrite(motor2B, LOW);
}

void detener(){
  //Stop | DETENER
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, LOW); 
}

void avanceIzq(){
  //Stop | avance Izq
  digitalWrite(motor1A, 100);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, HIGH);
  digitalWrite(motor2B, LOW); 
}

void avanceDrcha(){
  //Stop | avance Drcha
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, 100);
  digitalWrite(motor2B, LOW); 
}

void atrasIzq(){
  //Stop | atras Izq
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, HIGH);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, 100); 
}

void atrasDrcha(){
  //Stop | atras Drcha
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, 100);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, HIGH); 
}
//CODIGO DEL CONTROL DE LA TEMPERATURA//

void inicializarTemperatura(){
    led_temperatura.begin(); //Encendemos el led de la temperatura. Habra que encender tambien el de la balanza
    led_temperatura.setBrightness(10); // Predeterminado a 50, pero es mucho
    ajustarColoresTemperatura(6); // Inicializamos el led
}

int obtenerTemperatura(){
  // Leer la temperatura conlleva unos 250 milisegundos
  //float temp = sensor_temperatura.readHumidity();

  if(temp == T_MAX){
    temp--;
    return temp;
  }
  else if(temp== T_MIN){
    temp++;
    return temp;
  }
  else if((int)random(0,2) == 0){
    temp--;
    return temp;
  }else{
    temp++;
    return temp;
  }
}

void actualizarTemperatura(){
   switch(obtenerTemperatura()){
    case 0:
      ajustarColoresTemperatura(12);
      break;
    case 1:
      ajustarColoresTemperatura(11);
      break;
    case 2:
      ajustarColoresTemperatura(10);
      break;
    case 3:
      ajustarColoresTemperatura(9);
      break;
    case 4:
      ajustarColoresTemperatura(8);
      break;
    case 5:
      ajustarColoresTemperatura(7);
      break;
    case 6:
      ajustarColoresTemperatura(6);
      break;
    case 7:
      ajustarColoresTemperatura(5);
      break;
    case 8:
      ajustarColoresTemperatura(4);
      break;
    case 9:
      ajustarColoresTemperatura(3);
      break;
    case 10:
      ajustarColoresTemperatura(2);
      break;
    case 11:
      ajustarColoresTemperatura(1);
      break;
    case 12:
      ajustarColoresTemperatura(0);
   }
}

void ajustarColoresTemperatura(int numPixeles){
  for(int i = 0; i &lt; numPixeles; i++){
    led_temperatura.setPixelColor(i, led_temperatura.Color(0, 0, 255));
  }
  for(int i = numPixeles; i &lt; NUMPIXELS; i++){
    led_temperatura.setPixelColor(i, led_temperatura.Color(255, 0, 0));
  }
  led_temperatura.show();                          // Actualiza el led para que coincida con el valor de la temperatura
}

// CODIGO DE LA BALANZA //

void inicializarBalanza(){
  balanza.begin(DOUT, CLK);
  Serial.print("Lectura del valor del ADC:  ");
  Serial.println(balanza.read());
  Serial.println("No ponga ningun  objeto sobre la balanza");
  Serial.println("Destarando...");
  Serial.println("...");
  balanza.set_scale(439430.25); // Establecemos la escala
  balanza.tare(20);  //El peso actual es considerado Tara
  led_balanza.begin(); //Encendemos el led de la temperatura. Habra que encender tambien el de la balanza
  led_balanza.setBrightness(5); // Predeterminado a 50, pero es excesivo
  ajustarColoresBalanza(0); // Inicializamos el led a Blanco
  Serial.println("Listo para pesar");
}

float medirPeso(){
  return balanza.get_units(20);
}

void actualizarPeso(){
  float peso = medirPeso();
  Serial.println(peso);
  if((0 * 0.0833) &lt; peso &lt; (0.0833))
    ajustarColoresBalanza(1);
  else if((0.0833) &lt;= peso &lt;= (2*0.0833))
    ajustarColoresBalanza(2);
  else if((2*0.0833) &lt;= peso &lt;= (3*0.0833))
    ajustarColoresBalanza(3);
  else if((3*0.0833) &lt;= peso &lt;= (4*0.0833))
    ajustarColoresBalanza(4);
  else if((4*0.0833) &lt;= peso &lt;= (5*0.0833))
    ajustarColoresBalanza(5);
  else if((5*0.0833) &lt;= peso &lt;= (6*0.0833))
    ajustarColoresBalanza(6);
  else if((6*0.0833) &lt;= peso &lt;= (7*0.0833))
    ajustarColoresBalanza(7);
  else if((7*0.0833) &lt;= peso &lt;= (8*0.0833))
    ajustarColoresBalanza(8);
  else if((8*0.0833) &lt;= peso &lt;= (9*0.0833))
    ajustarColoresBalanza(9);
  else if((9*0.0833) &lt;= peso &lt;= (10*0.0833))
    ajustarColoresBalanza(10);
  else if((10*0.0833) &lt;= peso &lt;= (11*0.0833))
    ajustarColoresBalanza(11);
  else if(peso >= (12*0.0833))
    ajustarColoresBalanza(12);
  else
    ajustarColoresBalanza(0);
}

void ajustarColoresBalanza(int numPixeles){
  int i = 0;
  for(i; i &lt; numPixeles; i++){
    if(i &lt;= 5)
      led_balanza.setPixelColor(i, led_balanza.Color(0, 255, 0)); // VERDE
    else if(i &lt;= 9)
      led_balanza.setPixelColor(i, led_balanza.Color(255, 255, 0)); // AMARILLO
    else
      led_balanza.setPixelColor(i, led_balanza.Color(255, 0, 0)); // ROJO
  }
  for(i; i &lt; NUMPIXELS; i++)
    led_balanza.setPixelColor(i, led_balanza.Color(255, 255, 255)); // BLANCO
  led_balanza.show();                          // Actualiza el led para que coincida con el valor de la temperatura
}

Video Explicación Completa

Memoria

También te podría gustar...

Deja una respuesta

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