Go Down

Topic: Control de reles mediante temperaturas del LM35! (Read 3381 times) previous topic - next topic

IRRA

Hola, los molesto para que me ayuden a resolver un dilema que tengo. Trate de todo este fin de semana y nada.

Quiero hacer una especie de termometro digital de ambientes para mi trabajo con una pantalla LCD, un teclado matricial, 2 reles, buzzer, LEDS y el sensor LM35. En ese lugar se calentaria el ambiente y luego enfriaria, pudiendo funcionar inversamente tambien.

El funcionamiento dependeria de la forma de conectar los aparatos de calor y frio a los 2 reles que controlo mediante el Arduino a traves de 2 transistores NPN por supuesto funcionando como cortadores y saturadores. Hasta ahi la introduccion.

-Un rele me activaria y desactivaria la fuente de calor (cualquier cosa, no importa), el aparato se conecta de forma NC Y C al rele, de forma que siempre estaria funcionando con el rele desactivado y cuando se active y pase a NA y C ya no.
-La fuente de frio se conecta inversamente, o sea NA y C al otro rele, quedando el aparato apagado hasta que se active el transistor y por consiguiente el rele, pudiendo apagarse cuando el transistor se desactive pasando a los contactos NC y C.

Lo que busco hacer es que se mantengan activados y desactivados los transistores en este funcionamiento:
"SI SE PONE A CALENTAR EL AMBIENTE..."
-Mantener encendido el calor por el transistor desactivado y rele NC y C.
-Mantener apagado el frio a traves de su transistor tambien desactivado por su conexion al rele NA y C.

y "SI SE PONE A ENFRIAR EL AMBIENTE..."
-Mantener el calor apagado por su transistor activado a traves de su conexion al rele NC y C.
-Mantener el frio encendido el frio por su transistor activado y conexion al rele NA y C.

Temperatura Minima(_____________________)Temperatura Maxima

En ese rango se trabajaria manteniendo activados o desactivados lo transistores. Es eso lo que no me sale que funcione, coloque en el codigo de programa WHILEs, tambien DO WHILEs y tambien intente con varios IFS pero nada.

Cuando crei que ya lo habia solucionado colocando un DO WHILE para que se ejecute una vez y luego repita lo mismo mientras se cumplan las condiciones, ES AHI DONDE ESTA MI PROBLEMA.

ME PASO QUE EL PROGRAMA SE TRABO, ya no me mostraba los cambios de grados y decimales de la temperatura en el LCD, por mas que lo calentaba o enfriara al sensor LM35 para que active o desactive los transistores, NO REPONDIA. Se quedaba congelado y ahi quedaba.

PD: No hay problemas de conexion de ningun tipo, ya que antes de llegar a este punto del proyecto fui por pasos en donde hacia funcionar cada cosa por vez y todo anduvo bien, el problema es ahora con la union del LCD, Reles, LEDS y el LM35, siendo todo culpa del codigo de programa que no estoy haciendo bien. Por eso pido ayuda.

Les dejo una foto de la hoja donde estuve pensando y el codigo que hasta ahora hice, que no incluye todavia al teclado que sera mi proximo paso a resolver y que por lo tanto estare molestando de nuevo a ustedes.

Muchas gracias.


Code: [Select]
#include <LiquidCrystal.h>   //libreria para controlar el LCD


// Configuración para el LCD

// Puertos LCD -> RS  E   D4  D5  D6  D7
LiquidCrystal lcd(32, 33, 34, 35, 36, 37);

const int sensor = 0; // entrada del sensor LM35
const int backlight = 38;   // pin digital LED del LCD
const int ledAzul = 42;     // pin digital LED azul
const int ledVerde = 43;    // pin digital LED verde
const int ledRojo = 44;     // pin digital LED rojo
const int buzzer = 45;      // pin digital buzzer
const int transistor1 = 52; // pin digital transistor 1 para apagar y encender calor
const int transistor2 = 53; // pin digital transistor 2 para encender y apagar frio

float centigrados()          //se calcula como variable decimal
{
 int sensor;          //de acuerdo a la variable del sensor
 float celsius;              //se crea una variable resultado decimal
 sensor = analogRead(A0);      //se lee el estado de la entrada analogica A0 donde esta el sensor
 celsius = (500.0 * sensor) / 1023;    //se realiza el calculo
 return (celsius);                    //se devuelve el resultado a la variable decimal celsius
}

void setup() {                  //se definen como salidas las conexiones a pines digitales
 Serial.begin(9600);            //se inicia comunicacion serial
 pinMode(backlight, OUTPUT);
 pinMode(ledAzul, OUTPUT);
 pinMode(ledVerde, OUTPUT);
 pinMode(ledRojo, OUTPUT);
 pinMode(buzzer, OUTPUT);
 pinMode(transistor1, OUTPUT);
 pinMode(transistor2, OUTPUT);

 delay(500);                       //pausa antes del encendido
 digitalWrite(backlight, HIGH);    //encender backlight
 digitalWrite(ledVerde, HIGH);     //encender led verde
 delay(100);                       //pausa antes de primera pantalla para que se muestre prolijamente
 lcd.begin(20, 4);                 //inicio de uso de LCD de 20x4
 lcd.setCursor(3, 1);              //posicionar cursor en columna 3 y fila 1
 lcd.print("BIENVENIDO/A A");      //escribir texto en LCD
 lcd.setCursor(1, 2);              //posicionar cursor en columna 1 y fila 2
 lcd.print("TECMATEMP LCDMR 35");  //escibir texto en LCD
 digitalWrite(buzzer, HIGH);       //encender buzzer
 delay(1000);                      //pausa de 1 seg encendido
 digitalWrite(buzzer, LOW);        //apagar buzzer
 delay(9000);                      //esperar 9 seg antes del void loop
 lcd.clear();                      //limpiar pantalla
 delay(100);                        //pausa para pasar a otra pantalla prolijamente
}

void loop() {
 float temperatura = centigrados();
 lcd.setCursor(0, 0);              //posicionar cursor en columna 0 y fila 0
 lcd.print("En funcionamiento...");//escribir texto en LCD
 lcd.setCursor(0, 1);              //posicionar cursor en columna 0 y fila 1
 lcd.print("Temp.Min.20^C");       //escribir texto en LCD
 lcd.setCursor(0, 2);              //posicionar texto en columna 0 y fila 2
 lcd.print("Temp.Act.     ^C");       //escribir texto en LCD
 lcd.setCursor(9, 2);             //posicionar texto en columna 9 y fila 2
 lcd.print(temperatura);            //se escribe el resultado de temperatura en los espacios de la temperatura actual
 lcd.setCursor(0, 3);              //posicionar texto en columna 0 y fila 3
 lcd.print("Temp.Max.28^C");       //escribir texto en LCD
 Serial.print("Temperatura:    "); // escribir texto en ventana serial
 Serial.print(temperatura);         //mostrar valor de variable temperatura
 Serial.println("     grados");      //escribir texto en ventana serial
 delay(500);                         //pausas de muestreo para valores de variable temperatura

 if (temperatura >= 28) {            //si el valor de la variable de temperatura es >= a 28
   digitalWrite(ledAzul, LOW);
   digitalWrite(ledRojo, HIGH);

   do {                                 //hacer esto una vez y luego si se cumple la condicion de...
     digitalWrite(transistor1, HIGH);
     digitalWrite(transistor2, HIGH);
   } while (temperatura > 20);          //...mientras valor de la variable de temperatura sea > a 20
 }
 else {                                  //si no es asi hacer esto otro
   digitalWrite(ledRojo, LOW);
 }

 if (temperatura <= 20) {                //si el valor de la variable de temperatura es <= a 20
   digitalWrite(ledRojo, LOW);
   digitalWrite(ledAzul, HIGH);

   do {                                    //hacer esto una vez y luego si se cumple la condicion de...
     digitalWrite(transistor1, LOW);
     digitalWrite(transistor2, LOW);
   } while (temperatura < 28);            //...mientras valor de la variable de temperatura sea < a 20
 }
 else {                                  //si no es asi hacer esto otro
   digitalWrite(ledAzul, LOW);
 }
}
/code]

IRRA

Si tampoco es tan largo de leer, tanto puede costar ayudar?!

surbyte

Que explicación mas confusa.
Yo no quería responder porque no entendí nada.

A ver si esto hace lo que quieres

Code: [Select]
#include <LiquidCrystal.h>   //libreria para controlar el LCD

// Configuración para el LCD

// Puertos LCD -> RS  E   D4  D5  D6  D7
LiquidCrystal lcd(32, 33, 34, 35, 36, 37);

const byte sensor = 0; // entrada del sensor LM35
const byte backlight = 38;   // pin digital LED del LCD
const byte ledAzul = 42;     // pin digital LED azul
const byte ledVerde = 43;    // pin digital LED verde
const byte ledRojo = 44;     // pin digital LED rojo
const byte buzzer = 45;      // pin digital buzzer
const byte transistor1 = 52; // pin digital transistor 1 para apagar y encender calor
const byte transistor2 = 53; // pin digital transistor 2 para encender y apagar frio

float centigrados()          //se calcula como variable decimal
{
  int sensor;          //de acuerdo a la variable del sensor
  float celsius;              //se crea una variable resultado decimal
  sensor = analogRead(A0);      //se lee el estado de la entrada analogica A0 donde esta el sensor
  celsius = (500.0 * sensor) / 1023;    //se realiza el calculo
 
  return (celsius);                    //se devuelve el resultado a la variable decimal celsius
}

void setup() {                  //se definen como salidas las conexiones a pines digitales
 
  Serial.begin(9600);            //se inicia comunicacion serial
  pinMode(backlight, OUTPUT);
  pinMode(ledAzul, OUTPUT);
  pinMode(ledVerde, OUTPUT);
  pinMode(ledRojo, OUTPUT);
  pinMode(buzzer, OUTPUT);
pinMode(transistor1, OUTPUT);
pinMode(transistor2, OUTPUT);

  delay(500);                       //pausa antes del encendido
  digitalWrite(backlight, HIGH);    //encender backlight
  digitalWrite(ledVerde, HIGH);     //encender led verde
  delay(100);                       //pausa antes de primera pantalla para que se muestre prolijamente
  lcd.begin(20, 4);                 //inicio de uso de LCD de 20x4
  lcd.setCursor(3, 1);              //posicionar cursor en columna 3 y fila 1
  lcd.print("BIENVENIDO/A A");      //escribir texto en LCD
  lcd.setCursor(1, 2);              //posicionar cursor en columna 1 y fila 2
  lcd.print("TECMATEMP LCDMR 35");  //escibir texto en LCD
  digitalWrite(buzzer, HIGH);       //encender buzzer
  delay(1000);                      //pausa de 1 seg encendido
  digitalWrite(buzzer, LOW);        //apagar buzzer
  delay(9000);                      //esperar 9 seg antes del void loop
  lcd.clear();                      //limpiar pantalla
  delay(100);                        //pausa para pasar a otra pantalla prolijamente
}

void loop() {

float temperatura = centigrados();

lcd.setCursor(0, 0);              //posicionar cursor en columna 0 y fila 0
lcd.print("En funcionamiento..."); //escribir texto en LCD
lcd.setCursor(0, 1);              //posicionar cursor en columna 0 y fila 1
lcd.print("Temp.Min.20^C");        //escribir texto en LCD
lcd.setCursor(0, 2);              //posicionar texto en columna 0 y fila 2
lcd.print("Temp.Act.     ^C");      //escribir texto en LCD
lcd.setCursor(9, 2);              //posicionar texto en columna 9 y fila 2
lcd.print(temperatura);            //se escribe el resultado de temperatura en los espacios de la temperatura actual
lcd.setCursor(0, 3);              //posicionar texto en columna 0 y fila 3
lcd.print("Temp.Max.28^C");        //escribir texto en LCD
Serial.print("Temperatura:    "); // escribir texto en ventana serial
Serial.print(temperatura);          //mostrar valor de variable temperatura
Serial.println("     grados");      //escribir texto en ventana serial
delay(500);                         //pausas de muestreo para valores de variable temperatura

if (temperatura >= 28) {            //si el valor de la variable de temperatura es >= a 28
digitalWrite(ledAzul, LOW);
digitalWrite(ledRojo, HIGH);
}
else                       //si no es asi hacer esto otro
digitalWrite(ledRojo, LOW);


if (temperatura <= 20) {            // si el valor de la variable de temperatura es <= a 20
digitalWrite(ledAzul, HIGH);
digitalWrite(ledRojo, LOW);

} else                        // si no es asi hacer esto otro
digitalWrite(ledAzul, LOW);

if (temperatura > 20 && temperatura < 28) {    // hacer esto una vez y luego si se cumple la condicion de...
   digitalWrite(transistor1, HIGH);
   digitalWrite(transistor2, HIGH);
}         //...mientras valor de la variable de temperatura sea > a 20

if (temperatura > 20 && temperatura < 28) { // hacer esto una vez y luego si se cumple la condicion de...
    digitalWrite(transistor1, LOW);
    digitalWrite(transistor2, LOW);
}            //...mientras valor de la variable de temperatura sea < a 20

}

Go Up