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

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

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
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 KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Control de temperatura, motor y bombillo con PIC16F887 ccs
« Respuesta #1 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.

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Re:Control de temperatura, motor y bombillo con PIC16F887 ccs
« Respuesta #2 en: 23 de Marzo de 2017, 23:35:22 »
Hola, qué tal. Agradezco su atención.

KILLERJC, he indagado más en el tema y he realizado algunas modificación en cuanto a la lectura de la variable y a su asignación de valor y ya obtengo salidas en mis pines b0 y b1.

Lo he puesto para que de 40 a 50 grados prenda el motor y de 1 a 20 me prenda el foco, pero estoy en el dilema siguiente:

Pero por ejemplo, inicio la simulación en 15º se prende el led del foco pero cuando pasa los 20º sigue prendido hasta que llega a los 40º se apaga y prende el led del motor y hago los mismo en forma descendente de grados y no se apaga el led del motor hasta que llega a los 20º y prende el led del foco. Pero no se apagan los dos en el intervalo de: 21 a 39 grados.

Adjunto el código que he modificado

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Re:Control de temperatura, motor y bombillo con PIC16F887 ccs
« Respuesta #3 en: 23 de Marzo de 2017, 23:39:13 »
Sí amigo, sí se visualiza en la LCD.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Control de temperatura, motor y bombillo con PIC16F887 ccs
« Respuesta #4 en: 24 de Marzo de 2017, 00:01:00 »
Lo podes resolver asi:

Código: C
  1. #INCLUDE <16F887.H>
  2. #DEVICE ADC=10
  3. #USE DELAY(CLOCK=4000000)
  4. #FUSES NOWDT                
  5. #FUSES INTRC_IO          
  6. #FUSES NOPUT                
  7. #FUSES NOPROTECT            
  8. #include <lcd.c>              
  9. #define fast_io(port_B)
  10. #define PORTB 0x06
  11. #bit Pata_motor = PORTB.0
  12. #bit Pata_foco = PORTB.1
  13.  
  14. VOID main(){
  15.         float resultado, temperatura;
  16.         float constante=0.49;
  17.  
  18.         lcd_init();                
  19.         lcd_gotoxy(1,1);              
  20.         lcd_putc("Temperatura:");  
  21.  
  22.         setup_adc_ports(sAN0|VSS_VDD);
  23.         setup_adc(adc_clock_internal);
  24.         set_adc_channel(0);
  25.  
  26.  
  27.         while(true){
  28.                 resultado=read_adc();
  29.                 temperatura=resultado*constante;
  30.  
  31.                 lcd_gotoxy(1,2);
  32.                 printf(lcd_putc,"%2.1f C",temperatura);
  33.  
  34.                 delay_ms(300);
  35.  
  36.                 if((temperatura>=40)&&(temperatura<=50))
  37.                 {
  38.                         output_high(pin_b0);
  39.                         output_low(pin_b1);
  40.                         lcd_gotoxy(8,2);
  41.                         printf(lcd_putc,"Motor");
  42.                 }
  43.                 else if((temperatura>=10)&&(temperatura<=20))
  44.                 {
  45.                         output_low(pin_b0);
  46.                         output_high(pin_b1);
  47.                         lcd_gotoxy(8,2);
  48.                         printf(lcd_putc,"Foco");
  49.                 }
  50.                 else
  51.                 {
  52.                         output_low(pin_b0);
  53.                         output_low(pin_b1);
  54.                         printf(lcd_putc,"\n");          // Borro LCD
  55.                 }
  56.         }
  57. }

usando else if. y finalmente el else cuando no se cumple ninguno de los anteriores. Quite el delay y lo junte con el de 100ms antes.

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Re:Control de temperatura, motor y bombillo con PIC16F887 ccs
« Respuesta #5 en: 24 de Marzo de 2017, 01:02:56 »
Ha funcionado correctamente. Mis más sinceras gracias amigo.


 

anything