Autor Tema: Control de temperatura, motor y bombillo con PIC16F887 ccs  (Leído 78 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 22
Control de temperatura, motor y bombillo con PIC16F887 ccs
« en: 17 de Marzo de 2017, 19:34:04 »
Hola, qué tal. Estoy realizando un proyecto con las especificaciones del tema. El detalle es el siguiente:

Si la temperatura es entre 40 y 50 grados: encender el motor
Si la temperatura está entre 1 y 20: encender bombillo

El problema es que no me está dando las salidas en los pines RB0 Y RB1 cuando llego a esos grados (Estoy usando el LM35).
Este es mi código:

#INCLUDE <16F887.h>
#DEVICE ADC=10
#DEVICE *=16
#USE DELAY(CLOCK=4000000)
#FUSES NOWDT                    //No Watch Dog Tim
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected
#FUSES XT
#include "lcd.c"                // libreria lcd


VOID main(){

int16 tempdigital;

FLOAT temperatura;


lcd_init();                   // Activa lcd
   
lcd_gotoxy(1,1);              // columna 1 renglon 1
   
lcd_putc("Temperatura:");    //
   
   
setup_adc_ports(sAN0|VSS_VDD);  // AN0 como entrada analogica
setup_adc(adc_clock_internal);
setup_counters(RTCC_internal,rtcc_div_1);
set_adc_channel(0); //Seleccionar Canal 0 para sensor de Temperatura


while(true){
tempdigital=read_adc(); //Leer ADC
temperatura=150*tempdigital/1024.0; //Escalizar señal de salida temperatura
lcd_gotoxy(1,2);  // cursor en columna 1 renglon 2
printf(lcd_putc,"%2f C",temperatura);
delay_ms(100); //Periodo de actualizacion lectura

if (temperatura>=40&&temperatura<=50)
{
output_high(pin_b0);
output_low(pin_b1);

lcd_gotoxy(5,2);
printf(lcd_putc,"Motor encendido");
delay_ms(200);
}
if(temperatura>=1&&temperatura<=20)

output_low(pin_b0);
output_high(pin_b1);

lcd_gotoxy(5,2);
printf(lcd_putc, "Foco encendido");
delay_ms(200);
}
}


Desconectado DiegoGlez1992

  • PIC12
  • **
  • Mensajes: 59
    • DeDiGo
Re:Control de temperatura, motor y bombillo con PIC16F887 ccs
« Respuesta #1 en: 20 de Marzo de 2017, 09:41:34 »
¿La temperatura en el lcd te la pone bien?
Nunca te acostarás, sin saber una cosa más
www.dedigo.wordpress.com

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5299
Re:Control de temperatura, motor y bombillo con PIC16F887 ccs
« Respuesta #2 en: 20 de Marzo de 2017, 16:54:39 »
Estoy seguro que otra persona ya trajo el mismo problema, porque la palabra "Escalizar" me llamo la antencion antes, y curiosamente utiliza los mismos pines.

Pero bueno prosigamos..
Segun tu formula estos serian los valores del ADC que deberia darte segun la temperatura que tengas:

1ºC = 7
20ºC = 137
40ºC = 273
50ºC = 341

Es correcto?
Ademas siempre es mas rapido y simple comparar enteros que floats, es decir:

Código: C
  1. while(true){
  2.  
  3.    tempdigital = read_adc(); //Leer ADC
  4.    temperatura = 150.0 * tempdigital / 1024.0; //Escalizar señal de salida temperatura
  5.    lcd_gotoxy(1,2);  // cursor en columna 1 renglon 2
  6.    printf(lcd_putc,"%2f C",temperatura);
  7.    delay_ms(100); //Periodo de actualizacion lectura
  8.  
  9.    if ((tempdigital >= 273) && (tempdigital <= 341 )){      // Comparo y debe estar en este rango: 40ºC <= t <= 50ºC
  10.        output_high(pin_b0);
  11.        output_low(pin_b1);
  12.  
  13.        lcd_gotoxy(5,2);
  14.        printf(lcd_putc,"Motor encendido");
  15.        delay_ms(200);
  16.    }
  17.  
  18.    if((tempdigital >= 7) && (tempdigital <= 137)) {   // Comparo y debe estar en el rango 1ºC < t < 20ºC
  19.  
  20.      output_low(pin_b0);
  21.      output_high(pin_b1);
  22.  
  23.      lcd_gotoxy(5,2);
  24.      printf(lcd_putc, "Foco encendido");
  25.      delay_ms(200);
  26.    }
  27. }

- A tu codigo le faltaba una llave
- Le falta identacion
- Al multiplicar lo hice por 150.0 le agregue el punto asi el resultado se pasa a float. Esto por que 150 * 1024 = 153600 y el maximo de un entero de 16bits es de 65535, no se si lo promocionara a uno de 32 bits, pero lo dudo. Por las dudas al hacer 150.0 * tempdigital, lo fuerzo a que tempdigital primero pase a float y luego se multiplique.


 

anything