Go Down

Topic: Control automático de temperatura con alarma.  (Read 144 times) previous topic - next topic

KarlaAdilene

Nov 13, 2017, 10:58 pm Last Edit: Nov 14, 2017, 12:08 am by KarlaAdilene
Buen día, soy completamente nueva en el mundo de arduino y este foro me ha ayudado mucho a aprender un poco, no me habia animado a escribir porque la verdad, la mayoría de las dudas que tenia sobre mi proyecto me las resolvieron aquí mismo.

Estoy a punto de terminar un proyecto de la escuela y consiste en un control automatico de temperatura con alarma, lo que deseo lograr con esto es que la temperatura dentro de un sitio no sea mayor a  25°C y menor a 16°C. En caso de que estas condiciones no se cumplan, monitorear la temperatura durante una hora (1 lectura cada 10 minutos) y sacar un promedio, en caso de que el promedio sea diferente a los valores ideales mandar una señal desde un LED infrarrojo con el codigo para subir o bajar la temperatura. Posteriormente a esto, sensar de nuevo la temperatura durante 1 hora y si las condiciones no cambian enviar una alarma.

Los materiales que utilicé para el proyecto son:

  • Arduino UNO
  • 2 Sensores de temperatura LM35
  • LCD 2x16
  • Potenciometro
  • LED infrarrojo emisor

[li]Módulo de relevadores de cuatro canales.

Debo mencionar que decodifiqué varios mandos a distancia, de aire acondicionado asi como de televisiones, con el receptor infrarrojo integrado AX1838HS y el ejemplo que trae la libreria IRremote, me funcionó bien, de hecho hice practicas de envío de señales con una TV pero al momento de querer intentarlo con el aire acondicionado y ya todo junto no funcionó. Dejo el código que tengo para que me regañen o hagan lo necesario para poder entender por qué no funcionó. Repito que soy nueva en estos asuntos.


[/li][/list]
Code: [Select]
// Esta es la libreria IRremote al momento de incluirla se agregan las 4, la descargué de https://github.com/z3t0/Arduino-IRremote
#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>
#include <LiquidCrystal.h>

int promedio= 0;
int lectura1= 0;
int lectura2= 0;
int lectura3= 0;
int lectura4= 0;
int lectura5= 0;
int lectura6= 0;
int analog = A0;
int analog1 = A1;
LiquidCrystal lcd(12, 11, 5, 4, 6, 2);
int Temp = 0;
int Temp2 = 0;
#define rele 10
int tiempo= 1000;
IRsend irsend;

//---------------------------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
lcd.begin(16,2);
Serial.begin(9600);
pinMode(rele, OUTPUT);
digitalWrite(rele,HIGH);
}

//---------------------------------------------------------------------------------------------
void loop() {
Temp = analogRead(analog);
Temp = (500.0*Temp)/1023.0;
Temp2 = analogRead(analog1);
Temp2 = (500.0*Temp2)/1023.0;
Serial.print("Interior: ");
Serial.print(Temp);
Serial.print("°C");
Serial.print("\t");
Serial.print("Exterior: ");
Serial.print(Temp2);
Serial.print("°C");
Serial.print("\n");

lcd.setCursor(0,0);
lcd.print("Interior: ");
lcd.setCursor(10,0);
lcd.print(Temp);
lcd.setCursor(12,0);
lcd.print(" C");

lcd.setCursor(0,2);
lcd.print("Exterior: ");
lcd.setCursor(10,1);
lcd.print(Temp2);
lcd.setCursor(13,1);
lcd.print("C");

//--------------------------------------------------------------------------------------------
if(Temp>25);
{
delay(tiempo);
Temp = analogRead(analog);
Temp = (500.0*Temp)/1023.0;
lectura1=Temp;
delay(tiempo);
Temp = analogRead(analog);
Temp = (500.0*Temp)/1023.0;
lectura2=Temp;
delay(tiempo);
Temp = analogRead(analog);
Temp = (500.0*Temp)/1023.0;
lectura3=Temp;
delay(tiempo);
Temp = analogRead(analog);
Temp = (500.0*Temp)/1023.0;
lectura4=Temp;
delay(tiempo);
Temp = analogRead(analog);
Temp = (500.0*Temp)/1023.0;
lectura5=Temp;
delay(tiempo);
Temp = analogRead(analog);
Temp = (500.0*Temp)/1023.0;
lectura6=Temp;
promedio=(lectura1+lectura2+lectura3+lectura4+lectura5+lectura6)/6;
if(promedio>21)
{
irsend.sendNEC(0x8C60003A, 32); //Codigo de encendido a 23°C
Serial.println("Enviando código de encendido");
Serial.print("Promedio: ");
Serial.print(promedio);
Serial.print("\n");
}

//------------------------------------------------------------------------------------------------
else if(promedio<16)
{
irsend.sendNEC(0x8080003A, 32); //Codigo de apagado a 16°C
Serial.println("Enviando código de apagado");
Serial.println("Promedio= ");
Serial.print(promedio);
}

}//Se enciende la alarma
Temp = analogRead(analog);
Temp = (500.0*Temp)/1023.0;
lectura1=Temp;
delay(tiempo);
Temp = analogRead(analog);
Temp = (500.0*Temp)/1023.0;
lectura2=Temp;
delay(tiempo);
Temp = analogRead(analog);
Temp = (500.0*Temp)/1023.0;
lectura3=Temp;
delay(tiempo);
Temp = analogRead(analog);
Temp = (500.0*Temp)/1023.0;
lectura4=Temp;
delay(tiempo);
Temp = analogRead(analog);
Temp = (500.0*Temp)/1023.0;
lectura5=Temp;
delay(tiempo);
Temp = analogRead(analog);
Temp = (500.0*Temp)/1023.0;
lectura6=Temp;
promedio=(lectura1+lectura2+lectura3+lectura4+lectura5+lectura6)/6;
if(promedio>25){
digitalWrite(rele, LOW);}
else {digitalWrite(rele, HIGH);}

}



surbyte

Para poder aconsejarte te pido que coloques los enlaces de tus librerías.

Lo mas aconsejable es que lo hagas en el propio código de este modo

Code: [Select]
#include <boarddefs.h>            // http:www.dondeseaqueeste.com
#include <IRremote.h>
#include <IRremoteInt.h>                  // esta tambien
#include <ir_Lego_PF_BitStreamEncoder.h>     // esta tambien es importante



Errores que voy encontrando
1. Cuando presentes un código en un foro por favor usa la identación. Eso de poner todo pegado dificulta el seguir el código y solo nos trae trabajo a quienes queremos ayudarte para poder justamente separar las cosas.

2.
Code: [Select]
if(Temp>25);   // <=== ERROR
  {


Aca has puesto un ; con lo cual la linea no se ejecuta cuando Temp > 25 quita ese ;

3. Esta es una versión un poco mas limpia no demasiado de tu código. Podríamos incluso hacer que muestre las temperaturas de manera mas continua pero que siga tomando los controles indicados cada 10 min y promedio de 1 hora. Digo para saber donde estas parada. Porque las cosas pueden cambiar y no presetarás atención a esos cambios.

Code: [Select]
#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>
#include <LiquidCrystal.h>

float promedio = 0.0;
int analog = A0;
int analog1 = A1;
LiquidCrystal lcd(12, 11, 5, 4, 6, 2);
int Temp  = 0;
int Temp2 = 0;
#define rele 10
int tiempo = 1000;
IRsend irsend;

//---------------------------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
lcd.begin(16,2);
Serial.begin(9600);
pinMode(rele, OUTPUT);
digitalWrite(rele,HIGH);
}

//---------------------------------------------------------------------------------------------
void loop() {

  Temp  = analogRead(analog);
  Temp  = (500.0*Temp)/1023.0;
  Temp2 = analogRead(analog1);
  Temp2 = (500.0*Temp2)/1023.0;
 
  Serial.print("Interior: ");
  Serial.print(Temp);
  Serial.print("°C");
  Serial.print("\t");
  Serial.print("Exterior: ");
  Serial.print(Temp2);
  Serial.print("°C");
  Serial.print("\n");

  lcd.setCursor(0,0);
  lcd.print("Interior: ");
  lcd.setCursor(10,0);
  lcd.print(Temp);
  lcd.setCursor(12,0);
  lcd.print(" C");

  lcd.setCursor(0,2);
  lcd.print("Exterior: ");
  lcd.setCursor(10,1);
  lcd.print(Temp2);
  lcd.setCursor(13,1);
  lcd.print("C");

  //--------------------------------------------------------------------------------------------
 
  if (Temp>25) {
      Calculo_promedio();
      if (promedio >21.0) {
          irsend.sendNEC(0x8C60003A, 32); //Codigo de encendido a 23°C
          Serial.println("Enviando código de encendido");
          Serial.print("Promedio: ");
          Serial.print(promedio);
          Serial.print("\n");
      }
      //------------------------------------------------------------------------------------------------
      else
      if (promedio <16.0) {
          irsend.sendNEC(0x8080003A, 32); //Codigo de apagado a 16°C
          Serial.println("Enviando código de apagado");
          Serial.println("Promedio= ");
          Serial.print(promedio);
      }

  }//Se enciende la alarma
  Calculo_promedio();
  if (promedio > 25.0){
      digitalWrite(rele, LOW);
  }
  else {
      digitalWrite(rele, HIGH);
  }

}


void Calculo_promedio() {
    unsigned long lectura = 0;

    for (int i=0; i<6; i++) {
        delay(tiempo);
        Temp = analogRead(analog);
        Temp = (500.0*Temp)/1023.0;
        lectura++ = Temp; 
    }
   
    promedio = lectura/6;
}

KarlaAdilene

Muchas gracias Surbyte, ya modifiqué y puse el link de donde saque la librería y especifique que al momento de incluirla al programa se agregan las demás, la verdad desconozco por qué :(.

surbyte

jajaj pero se supone que lo hagas en tu primer post para que nosotros veamos o podamos compilar tu código.


KarlaAdilene

He estado intentando mandarle la señal al aire acondicionado pero definitivamente no funciona, lo intenté también con dos televisiones y con ellas si funciona, ¿sabrá usted si esa librería funciona para poder controlar cualquier equipo?. Estuve leyendo como funciona la librería IRremote y dice que puede controlar dispositivos como televisiones y estéreos, ahí tengo la duda si en realidad funcionará para poder controlar un aire acondicionado.

Que tenga buen día.

KarlaAdilene

Vi un post aquí mismo en el foro de una persona con dos aires acondicionados LG y al parecer está utilizando una librería para esa marca, los aires acondicionados que yo quiero controlar son de la marca McQuay, Trane y York, los tres trabajan con el protocolo NEC y la librería IRremote la incluye, esta libreria tiene dos funciones, transmitir y recibir, entonces no se porqué estos aparatos no reciben la señal  :(.

Go Up