Control de reles mediante temperaturas del LM35!

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.

#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]

SENSOR_LCD_POTENCIA_Y_TESTIGOS.ino (4.62 KB)

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

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

A ver si esto hace lo que quieres

#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

}