Autor Tema: Problema con proyecto de control domotico  (Leído 2022 veces)

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

Desconectado riaddon

  • PIC10
  • *
  • Mensajes: 4
Problema con proyecto de control domotico
« en: 12 de Marzo de 2010, 06:01:29 »
Necesito ayuda, estoy haciendo el control domotico de una casa con un pic 16f876 y la visualizacion con una lcd de 16x2. No consigo hacer que me muestre la hora y la temperatura a la vez que la otra funcion de control, este es el codigo asta aora, esta con CCS:

#include <16f876.h>
#byte PA=5 //registro del puerto A
#byte PB=6 //registro del puerto B
#byte PC=7 //registro del puerto C
#fuses NOPROTECT,NOWDT,HS,NOPUT
#device adc=10
#use delay (clock=20000000) //frecuencia del oscilador
#include <lcd.c>

int horas,minutos,segundos;

void func_temp(void)
 { 
   do
   {
      int16 valor;
      float v,resultado;
      valor = Read_ADC();
      v = 5.0 * valor / 1024.0;
      resultado = 12.0*v-10;
      lcd_gotoxy(12,2);
      printf(lcd_putc,"\n%04.1fC",resultado);
      }  while(TRUE);
     
 }
 
void func_hora(void)
 {
   while(1)
      {
         lcd_gotoxy(1,2);
         printf(lcd_putc,"%02d:%02d:%02d",horas,minutos,segundos);
         delay_ms(1000);
         while(input(PIN_C4))
         {
            minutos++;
            if(minutos==60)
             {
               minutos=0;
               horas++;
             }
             if(horas==24)horas=0;
         }
         segundos++;
         if(segundos==60)
            {
            segundos=0;
            minutos++;
           
            if(minutos==60)
               {
               minutos=0;
               horas++;
               if(horas==24)horas=0;
               }
            }
      }
 }


 main(void)
 {
   char variable;
   char num_menu = 4; //numero de menus
   int16 temp;
   
   set_tris_a(0x01);
   set_tris_b(0x00);
   set_tris_c(0b00010000);
   
   lcd_init();
   
   setup_adc_ports(AN0_VREF_VREF);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);
   delay_us(10);
   
   while(1)
   {
      if (input(PIN_A1))//detecta si se a pulsado menu
      {
         delay_ms(500);
         variable++;          //aumenta la variable
         
         lcd_putc('\f');      //limpia la LCD
      }
     
      if (variable > num_menu)
      {
      (variable=0);//si nos pasamos al pulsar...
      }            //menu, vuelve a la opcion A.
      switch (variable)
      {
         case 0:
               lcd_gotoxy(1,1);
               printf(lcd_putc, "Luz salon");
               if((output_bit(pin_C0,0))&&( !input(pin_A2)))
               {
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"OFF");
               }
               if((output_bit(pin_C0,0))&&(input(pin_A2)))
               {
                  output_toggle(pin_C0);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"ON");
               }
               if((output_bit(pin_C0,1))&&(!input(pin_A2)))
               {
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"ON");
               }
               if((output_bit(pin_C0,1))&&(input(pin_A2)))
               {
                  output_toggle(pin_C0);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"OFF");
               }
               func_temp();
               func_hora();
               //if(input(pin_A2)) output_toggle(pin_C0);// func_actuador(variable);
               break;
         case 1:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"Calefaccion");
               if((output_bit(pin_C1,0))&&(!input(pin_A2)))
               {
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"OFF");
               }
               if((output_bit(pin_C1,0))&&(input(pin_A2)))
               {
                  output_toggle(pin_C1);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"ON");
               }
               if((output_bit(pin_C1,1))&&(!input(pin_A2)))
               {
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"ON");
               }
               if((output_bit(pin_C1,1))&&(input(pin_A2)))
               {
                  output_toggle(pin_C1);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"OFF");
               }
               func_temp();
               func_hora();
               //if(input(pin_A2)) func_actuador(variable);
               break;
         case 2:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"Luz terraza");
               if((output_bit(pin_C2,0))&&(!input(pin_A2)))
               {
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"OFF");
               }
               if((output_bit(pin_C2,0))&&(input(pin_A2)))
               {
                  output_toggle(pin_C2);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"ON");
               }
               if((output_bit(pin_C2,1))&&(!input(pin_A2)))
               {
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"ON");
               }
               if((output_bit(pin_C2,1))&&(input(pin_A2)))
               {
                  output_toggle(pin_C2);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"OFF");
               }
               func_temp();
               func_hora();
               //if(input(pin_A2)) output_toggle(pin_C2);// func_actuador(variable);
               break;
         case 3:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"Cocina");
               if((output_bit(pin_C3,0))&&(!input(pin_A2)))
               {
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"OFF");
               }
               if((output_bit(pin_C3,0))&&(input(pin_A2)))
               {
                  output_toggle(pin_C3);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"ON");
               }
               if((output_bit(pin_C3,1))&&(!input(pin_A2)))
               {
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"ON");
               }
               if((output_bit(pin_C3,1))&&(input(pin_A2)))
               {
                  output_toggle(pin_C3);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"OFF");
               }
               func_temp();
               func_hora();
               //if(input(pin_A2)) output_toggle(pin_C3); //func_actuador(variable);
               break;
               
      }
     
     
     
   }
               
 
 }                       

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: Problema con proyecto de control domotico
« Respuesta #1 en: 12 de Marzo de 2010, 06:09:10 »
Creo que para ayudarte mejor, si pone el circuito o un plan como tiene el Hardware montados puede ser ahi un probelma, aunque tu codigo tenga problema de configuracion.
a ver si puede dar mas detalle
Saludos

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Problema con proyecto de control domotico
« Respuesta #2 en: 12 de Marzo de 2010, 09:47:51 »
Mirando el código rápidamente descubrí una cosa.
Las funciones func_temp y func_hora, tienen un ciclo infinito del que nunca sales.

Debes separar los problemas para poder encontrar el error, software y hardware.
Para verificar si tu hardware está bien, realiza un código más sencillo donde muestras por ejemplo "hola" en el lcd. Si esto funciona luego puedes leer la temperatura y la muestras en el lcd, luego la hora, y así una vez que sabes que funciona, el hard, le agregas las funciones y todos los detalles que te apetezcan.
Pero si colocas todo el código con menúes y todos los chiches, te va a ser más difícil encontrara el error


Desconectado riaddon

  • PIC10
  • *
  • Mensajes: 4
Re: Problema con proyecto de control domotico
« Respuesta #3 en: 18 de Marzo de 2010, 07:35:16 »
rompiendome la cabeza, e mejorado el c, pero aun asi no consigo k funcione, cambie los cases poniendo solo output_toggle, pero aun asi nada. la primera frase la muestra, pero no activa o desactiva la salida. adjunto proteus

#include <16f876.h>
#byte PA=5 //registro del puerto A
#byte PB=6 //registro del puerto B
#byte PC=7 //registro del puerto C
#fuses NOPROTECT,NOWDT,HS,NOPUT
#device adc=10
#use delay (clock=20000000) //frecuencia del oscilador
#include <lcd.c>

int horas,minutos,segundos;
float valor=0;
float v,resultado=0;


void func_hora(void)
 {
         do
         {
         valor = Read_ADC();
         delay_us(10);
         v = 5.0 * valor / 1024.0;
         resultado = 12.0*v-10;
         lcd_gotoxy(1,2);
         printf(lcd_putc,"%02d:%02d:%02d   %04.1fC",horas,minutos,segundos,resultado);
         delay_ms(1000);
         
         while(input(PIN_C4))//puesta en hora
         {
            minutos++;
            if(minutos==60)
             {
               minutos=0;
               horas++;
             }
             if(horas==24)horas=0;
         }
         segundos++;
         if(segundos==60)
            {
            segundos=0;
            minutos++;
           
            if(minutos==60)
               {
               minutos=0;
               horas++;
               if(horas==24)horas=0;
               }
            }
         }while(!input(pin_A1));
         break;
      }
     



 main(void)
 {
   char variable;
   char num_menu = 4; //numero de menus
   int16 temp,contador;
   
   set_tris_a(0x01);
   set_tris_b(0x00);
   set_tris_c(0b00010000);
   contador=0;
   
   lcd_init();
   
   setup_adc_ports(AN0_VREF_VREF);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);

   
   while(1)
   {
      if(input(pin_A3))
      {
         delay_ms(20);
         output_toggle(pin_C0);
      }
     
      if(input(pin_A4))
      {
         delay_ms(20);
         output_toggle(pin_C1);
      }
     
      if(input(pin_A5))
      { 
         delay_ms(20);
         output_toggle(pin_C2);
      }
      func_hora();
      if (input(PIN_A1))//detecta si se a pulsado menu
      {
         delay_ms(500);
         variable++;          //aumenta la variable
         
         lcd_putc('\f');      //limpia la LCD
      }
     
      if (variable > num_menu)
      {
      (variable=0);//si nos pasamos al pulsar...
      }            //menu, vuelve a la opcion A.
      switch (variable)
      {
         case 0:
               lcd_gotoxy(1,1);
               printf(lcd_putc, "Luz salon");
               if((contador==0)||(contador==1))
               {
                  output_low(pin_C0);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"OFF");
               }
               if(contador==2)
               {
                  output_high(pin_C0);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"ON");
               }
             
               
               //if(input(pin_A2)) output_toggle(pin_C0);// func_actuador(variable);
               break;
         case 1:
               
               lcd_gotoxy(1,1);
               printf(lcd_putc, "Calefaccion");
               if((contador==0)||(contador==1))
               {
                  output_low(pin_C1);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"OFF");
               }
               if(contador==2)
               {
                  output_high(pin_C1);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"ON");
               }
               
               //if(input(pin_A2)) func_actuador(variable);
               break;
         case 2:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"Luz terraza");
               
               if((contador==0)||(contador==1))
               {
                  output_low(pin_C2);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"OFF");
               }
               if(contador==2)
               {
                  output_high(pin_C2);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"ON");
               }
               
               //if(input(pin_A2)) output_toggle(pin_C2);// func_actuador(variable);
               break;
         case 3:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"Cocina");
               
               if((contador==0)||(contador==1))
               {
                  output_low(pin_C3);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"OFF");
               }
               if(contador==2)
               {
                  output_high(pin_C3);
                  lcd_gotoxy(12,1);
                  printf(lcd_putc,"ON");
               }
             
               //if(input(pin_A2)) output_toggle(pin_C3); //func_actuador(variable);
               break;
       }
       if(input(pin_A2))//boton seleccion
       {
         delay_ms(20);
         contador++;
         if(contador==3) contador=0;
       }
       }
     
     
     
   }


 

anything