Go Down

Topic: Control de temperatura con LM 35 +LCD+2 Relay Module (Read 110 times) previous topic - next topic

fgomezd

Aug 14, 2019, 12:04 am Last Edit: Aug 14, 2019, 05:05 am by surbyte Reason: Agregado de etiqueta para Errores y/o códigos
He emprendido el aprendizaje del fascinante mundo arduino, mis conocimientos son limitados, sin embargo ya he logrado avances, tengo algunos problemas con el código que he escrito que agradecería a ustedes una manito.

Mi hijo estudia microbiologia industrial y quiere emprender el cultivo de microrganismos para jardinería, me ha pedido que le fabrique un sistema electro-mecánico con el cual pueda controlar la temperatura dentro de una caja, subiendo su temperatura con un bombillo incandecente y ventilando su interior para uniformizar la temperatura, tengo un arduino MEGA, un sensor de temperatura LM 35, un módulo de relay de 2 salidas, una LCD 16X2, y un I2C.

Mi objetivo es poder cambiar con 3 pulsadores los umbrales de temperatura , con un switch escojo el umbajo o el umbalto y con los otros 2 swiches subo o bajo el valor.


Escribo la temperatura de los umbrales los umbrales bajo y alto y leo la entrada analógica A8 (temperatura leida con el LM35 y lOS  escribo en el LCD.

Los comandos "if" con el "and" me han sacado canas, pues no logro que:  cuando la temperatura esté por debajo de umbajo cierre ambos reles y encienda el bombillo y el ventilador, cuando la temperatura esté entre los umbajo y umbalto, permanesca prendido el ventilador y apague el bombillo y cuando la temperatura esté por encima del umbalto, permanesca prendido el ventilador y el bombillo apagado.

Se me presenta que no logro controlar los diferentes umbrales, solicitu su ayuda.

Code: [Select]
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f, 16, 2);
float sensor;
float temp;
int Relevent=2; // Asigno el pin digital 2 a la variable Rele Ventilador
int Relecale=3; // Asigno el pin digital 3 a la variable Rele Calefactor
int umbajo = 27; // Temperatura por debajo de la cual debo activar los relevos que prenden el Ventilado y el Calefactor
int umbalto = 32; // Temperatura por encima de la cual debo desactivar los relevos para apagar el Calefactor y mantener prendido el Ventilador

// Deseo poder variar esto límites manualmente con dos pulsadores, y uno tercero para escoger cual de los umbrales bajo o subo
void setup()
{
  temp == A8;
  lcd.init();  //inicialición de la pantalla
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();
  pinMode (Relevent, OUTPUT);
  pinMode (Relecale, OUTPUT);
  Serial.begin(9600);
}
void loop()
{
  sensor = analogRead(A8);
  temp = ((sensor * 500) / 1023);
  lcd.setCursor(1, 0);
  lcd.print(umbajo    ); // Imprime en LCD el valor del umbral bajo
  lcd.setCursor(4, 0);
  lcd.print(umbalto    ); // Imprime en LCD el valor del umbral alto
  lcd.setCursor(1, 1);
  lcd.println(temp   );
  lcd.write(1);
  lcd.setCursor(6, 1);
  lcd.println(" C        ");
  if (temp <= umbajo);
  {digitalWrite(Relevent, LOW); digitalWrite(Relecale, LOW); delay (200);}
  if (temp > umbalto);
  {digitalWrite(Relevent, LOW); digitalWrite(Relecale, LOW);delay (200);}// Quiero utilizar el comando (if con and) para poder decidir que hacer cuando la temperatura esta entre los umbrales, sin embargo siempre me da un error.
  if (temp > umbalto);
  {digitalWrite(Relevent, LOW); digitalWrite(Relecale, HIGH);delay (200);}
  Serial.println (umbajo);
  Serial.println (umbalto);
  Serial.println (Relevent);// Siempre escribe un 2 y no la condicion de los if
  Serial.println (Relecale);// Siempre escribe un 3 y no la condicion de los if
  delay(200);
}


Gracias

Francisco J. Gomez
Cel 57 310 8076846
Bogota Colombia

Kike_GL

En los if (condicion) no va ; el formato es asi:

Code: [Select]

if (temp <= umbajo){
   digitalWrite(Relevent, LOW);
   digitalWrite(Relecale, LOW);
   delay (200);
}


Para usar conficiones multiples usa el AND (&&) asi:
Code: [Select]

if (temp>umbajo && temp<umbalt){
   digitalWrite(Relevent, HIGH);
   digitalWrite(Relecale, HIGH;
}


Para saber mas consulta arduwiki.
Saludos, Kike_GL

fgomezd

Kike:

Gracias por su pronta respuesta, pero pregunto el if evalúa la condición (temp <= umbajo) si es verdad escribe sobre el {digitalWrite(Relevent, LOW); digitalWrite(Relecale, LOW);} para luego pasar al siguente if?

Creería que a pesar del formato que puse en el post, es igual al enviado por usted pues al hacer sobre mi programación "autoformato" la ordena así como posteo.




surbyte

Quote
cuando la temperatura esté por debajo de umbajo cierre ambos reles y encienda el bombillo y el ventilador, cuando la temperatura esté entre los umbajo y umbalto, permanesca prendido el ventilador y apague el bombillo y cuando la temperatura esté por encima del umbalto, permanesca prendido el ventilador y el bombillo apagado.
Tu solo te creas la confusión, pero es normal cuando se empieza a programar.

Veamos:
1. cuando la temperatura esté por debajo de umbajo cierre ambos reles y encienda el bombillo y el ventilador,
2. cuando la temperatura esté entre los umbajo y umbalto, permanesca prendido el ventilador y apague el bombillo
3. cuando la temperatura esté por encima del umbalto, permanesca prendido el ventilador y el bombillo apagado.

y tu que programaste, primero como te dijo Kike, el ; anula todo asi que lo retiro. Segundo el bombillo donde esta representado?
Code: [Select]
const byte Relebombillo = 4;

Veamos 1.
Code: [Select]
if (temp <= umbajo){
            digitalWrite(Relevent, LOW);
            digitalWrite(Relecale, LOW);
            digitalWrite(Relebombillo, HIGH); 
            // delay (200); ningún delay, ODIO los delay
}


2. cuando la temperatura esté entre los umbajo y umbalto, permanezca prendido el ventilador y apague el bombillo

Code: [Select]
if (temp>umbajo && temp<umbalt){
   digitalWrite(Relevent, HIGH);              // Ventilador ON
   digitalWrite(Relecale, HIGH);              // Y el calentador que se hace pq no lo expresas en tu comentario?
   digitalWrite(Relebombillo, LOW);         // Bombillo OFF
}


3. cuando la temperatura esté por encima del umbalto, permanezca prendido el ventilador y el bombillo apagado.

Code: [Select]
if (temp > umalto){
            digitalWrite(Relevent, HIGH);    // Ventilador ON
            digitalWrite(Relecale, LOW);      // Calefactor OFF
            digitalWrite(Relebombillo, LOW);// Bombillo OFF
}



Y si evalua y solo lo ejecuta si es TRUE la condición entre paréntesis sino pasa a la siguiente y si es TRUE la ejecuta y sino pasa.
Como verás termina haciendo solo 1 de 3

Kike_GL

Quote from: fgomezd
Creería que a pesar del formato que puse en el post, es igual al enviado por usted pues al hacer sobre mi programación "autoformato" la ordena así como posteo.
Fijate bien en tu codigo. Tu pones asi:

Code: [Select]

if (temp <= umbajo);    //Quita el ; de aqui
  {digitalWrite(Relevent, LOW); digitalWrite(Relecale, LOW); delay (200);}


Saludos, Kike_GL

Go Up