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)