Pesquisar este blog

sábado, 29 de junho de 2013

Árvore de Natal com LED RGB e PIC 16f877a


Árvore de Natal com LED RGB e PIC 16f877a

 
 
Muitos já tiveram a ideia de construir uma árvore de natal "inteligente"? Bom, o que eu irei propor é a ideia de utilizar um microcontrolador programável PIC 16f877a para se fazer o controle da iluminação de sua arvore, utilizando LED's RGB.(figura 1) de anodo comum.
 
 
Figura 1
Figura 1
 
 
 
O circuito possui um botão, que que por sua vez controla os LED's, sua tonalidade, etc.
Também poderá ser substituído por um interruptor por um reed switch colocando-o próximo ao chão e fazendo a arvore girar em seu pedestal com um mini redutor (igual aqueles utilizados em globinhos de espelhos em boates, figura 2 ) fazendo com que sua árvore gire, e com um imã passando próximo ao interruptor altere a sequiência toda vez que ela passar pelo ponto do interruptor.
 
Figura 2
 
Segue o código do programa em c:
 
 
/*******************************************************
/              Powered by Daniel Wagner                 /
/www.microcontroladoresprogramaveispic.blogspot.com.br  /
********************************************************/
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(a)
 
int1 a=1;
unsigned int i=0;
unsigned int16 k=1;
unsigned int j=0;
unsigned int w=0;
unsigned int s=0;
unsigned int z=255;
unsigned int r1=(0b00111001);
unsigned int g1=(0b11100001);
unsigned int b1=(0b10001101);
unsigned int r2=0;
unsigned int g2=0;
unsigned int b2=0;
//_______________________
unsigned int32 kesme=0;
unsigned int b=45;
unsigned int c=39;
unsigned int d=33;
unsigned int r_1[8]={0x00,0x00,0xff,0xff,0xff,0x00,0x00,0xff,};
unsigned int r_2[8]={0xff,0x00,0x00,0xff,0xff,0xff,0x00,0x00,};
unsigned int g_1[8]={0xff,0x00,0x00,0x00,0xff,0xff,0x00,0xff,};
unsigned int g_2[8]={0xff,0xff,0x00,0x00,0x00,0xff,0xff,0x00,};
unsigned int b_1[8]={0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,};
unsigned int b_2[8]={0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,};
//------------------------------
unsigned int ayyildiz[21]={195,          129,          24,           60,           126,
                           189,          219,          255,          255,          119,
                           55,           131,          129,          192,          129,
                           131,          55,           119,          255,          255,         
                           255,};
 
unsigned int korhan[36]={ 0,    231,    219,    60,     126,    255,   //K [0]-[5]
                          129,  126,    126,    126,    129,    255,   //O [6]-[11] 
                          0,    230,    214,    185,    127,    255,   //R [12]-[17]
                          0,    239,    239,    239,    0,      255,   //H [18]-[23]
                          3,    237,    238,    237,    3,      255,   //A [24]-[29]
                          0,    249,    231,    159,    0,      255,   //N [30]-[35]
};
unsigned int uslu[24]={  128,          127,          127,          127,          128,          255, //U [0]-[5]
                         185,          118,          118,          110,          157,          255, //S [6]-[11]
                         0,            127,          127,          127,          127,          255, //L [12]-[17]
                         128,          127,          127,          127,          128,          255, //U [18]-[23]
};
unsigned int kou[18]={ 0,    231,    219,    60,     126,    255,   //K [0]-[5]
                       129,  126,    126,    126,    129,    255,   //O [6]-[11]
                       131,  126,    127,    126,    131,    255,   //Ü [12]-[17]
};
unsigned int mekatronik[58]={0,            249,          231,          249,          0,            255,
                             0,            110,          110,          110,          110,          255,
                             0,            231,          219,          60,           126,          255,
                             3,            237,          238,          237,          3,            255,
                             254,          254,          0,            254,          254,          255,
                             0,            230,          214,          185,          127,          255,
                             129,          126,          126,          126,          129,          255,
                             0,            249,          231,          159,          0,            255,
                             123,          2,            123,          255,                            
                             0,            231,          219,          60,           126,          255,
};
unsigned int mekatronik1[58]={255,255,255,255,255,255,
                              255,255,255,255,255,255,
                              255,255,255,255,255,255,
                              255,255,255,255,255,255,
                              255,255,255,255,255,255,
                              255,255,255,255,255,255,
                              255,255,255,255,255,255,
                              255,255,255,255,255,255,
                              255,255,255,255,
                              255,255,255,255,255,255,};
unsigned int dalgakirmizi[15]={231,          219,          189,          126,          189,         
                               219,          231,          231,          219,          189,         
                               126,          126,          189,          219,          231,};                             
unsigned int dalgamor[15]={239,          223,          191,          127,          191,
                           223,          239,          247,          251,          253,         
                           254,          254,          253,          251,          247,}; 
                        
                     
//******
#int_ext             
void  ext_kesmesi ()
{   
kesme=kesme+1;
   a=1;
   i=1;
   if (kesme>680){  
      kesme=0;
      b=45;
      c=39;
      d=33;
      k=0;
      w=0;
      z=7;
      s=0;
      for(w=0;w<58;w++)
      {
      mekatronik1[w]=255;
      }
   }
  
}

/*********PROGRAMA********/
void goster(){
  
   while(kesme<5){//pwm
      output_a(0x01);
      output_b(0xff);
      output_d(0xff);
      output_c(0xff);
      for(w=0;w<8;w++){
      for (k=1;k<1000;k++){
         for(j=1;j<3;j++){
            output_a(r_1[w]);
            output_b(r_1[w]);
            output_d(g_1[w]);
            output_c(b_1[w]);
            delay_us(k);
            output_a(r_2[w]);
            output_b(r_2[w]);
            output_d(g_2[w]);
            output_c(b_2[w]);
            delay_us(1000-k);
            if(kesme>5){
            break;
            }
         }
      if(kesme>5){
      break;
      }
      }
      if(kesme>5){
         break;
         }
      k=1;
      }
     
   }

while((kesme<120)&&(kesme>5)){
   output_b(dalgakirmizi[w]);
   output_a(dalgakirmizi[w]);
   output_d(255);
   output_c(dalgamor[w]);
   delay_ms(1);
   w=w+1;
   if ((w>15)||(a==1)){
   a=0;
   w=0;
   }
  
}

//-------------------------------------\\
if(kesme>120){
if(kesme<160){
   w=w+1;
   if(w>4){
   w=0;
   output_b(r1);
   output_a(r1);
   output_d(g1);
   output_c(b1);
   r2=r1<<1;
   g2=g1<<1;
   b2=b1<<1;
   if(bit_test(r1,7)){
      r2=r2+1;
   }
   if(bit_test(g1,7)){
      g2=g2+1;
   }
   if(bit_test(b1,7)){
      b2=b2+1;
   }
   r1=r2;
   g1=g2;
   b1=b2;
   }
}
}
//---------------------------
if(kesme>160){
if(kesme<280){
   w=0;
   delay_ms(b);
   for (w=0;w<6;w++){
      output_b(kou[w]);
      output_a(kou[w]);
      output_d(255);
      output_c(255);
      delay_ms(1);
   }
   if(b<4){
      w=5;
      delay_ms(c);
      for (w=5;w<12;w++){
         output_b(255);
         output_a(255);
         output_d(kou[w]);
         output_c(255);
         delay_ms(1);
      }
         if(c<3){
            delay_ms(d);
            w=11;
            for (w=11;w<18;w++){
               output_b(255);
               output_a(1);
               output_d(255);
               output_c(kou[w]);
               delay_ms(1);
            }
            if(d<3){
            d=3;
            }
            c=3;
            d=d-1;
         }     
      c=c-1;
      b=3;
   }
   b=b-1;
}
}
//-------------------
if((kesme>280)&&(kesme<320)){
   w=0;
   for (w=0;w<18;w++){
      output_b(kou[w]);
      output_a(kou[w]);
      output_d(255);
      output_c(255);
      delay_ms(1);
   }
}
//------------------
if((kesme>320)&&(kesme<360)){
   w=0;
   for (w=0;w<18;w++){
      output_b(255);
      output_a(255);
      output_d(kou[w]);
      output_c(255);
      delay_ms(1);
   }
}
if((kesme>360)&&(kesme<440)){
   s=s+1;
   if (kesme<362){
   j=0;
   z=7;
   }
  
   if (kesme>362){       
   if (j<8){     
   if (s>9)
   s=0;
   for (w=0;w<58;w++){
      mekatronik1[w]=mekatronik1[w]<<1;
      if((bit_test(mekatronik[w],z))==0){
      bit_clear(mekatronik1[w],0);  
      }                         
      else
      {
      bit_set(mekatronik1[w],0);
      }
     
   }
   j=j+1;
   z=z-1;
   }
   }
      for (w=0;w<58;w++){
         output_b(255);
         output_a(255);
         output_d(mekatronik1[w]);
         output_c(255);
         delay_ms(1);
      }
}
//--------------
if((kesme>440)&&(kesme<480)){
  
   w=0;
   for (w=0;w<58;w++){
      output_b(255);
      output_a(255);
      output_d(255);
      output_c(mekatronik[w]);
      delay_ms(1);
   }
}
//-------------------------
if((kesme>480)&&(kesme<520)){
   w=0;
   for (w=0;w<58;w++){
      output_b(mekatronik[w]);
      output_a(mekatronik[w]);
      output_d(255);
      output_c(255);
      delay_ms(1);
   }

//-------------------------
if((kesme>520)&&(kesme<560)){
   w=0;
   for (w=0;w<58;w++){
      output_b(0);
      output_a(0);
      output_d(mekatronik[w]);
      output_c(mekatronik[w]);
      delay_ms(1);
   }
}

//----------------
if((kesme>560)&&(kesme<620)){
   w=0;
   for (w=0;w<21;w++){
      output_b(0);
      output_a(0);
      output_d(ayyildiz[w]);
      output_c(ayyildiz[w]);
      delay_ms(1);
   }

}
//----------------
if((kesme>620)&&(kesme<680)){
   w=0;
   for (w=0;w<36;w++){
      output_b(korhan[w]);
      output_a(korhan[w]);
      output_d(255);
      output_c(255);
      delay_ms(1);
   }
   w=0;
   for (w=0;w<24;w++){
      output_b(uslu[w]);
      output_a(uslu[w]);
      output_d(uslu[w]);
      output_c(255);
      delay_ms(1);
   }
}
//------------------

}
void main ( )
{
 
   setup_psp(PSP_DISABLED);       
   setup_spi(SPI_SS_DISABLED);    
   setup_timer_1(T1_DISABLED);    
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);   
   setup_adc(ADC_OFF);            
   setup_CCP1(CCP_OFF);           
   setup_CCP2(CCP_OFF);           

   set_tris_b(0x01);   
   set_tris_c(0x00);  
   set_tris_d(0x00);  
   set_tris_a(0x00);  
   output_b(0x00);    
 
   ext_int_edge(H_TO_L);  
   enable_interrupts(INT_EXT); 
   enable_interrupts(GLOBAL);  
   b=45;
   c=39;
   d=33;
   r1=(0b00111001);
   g1=(0b11100001);
   b1=(0b10001101);

   output_b(254);
   output_d(255);
   output_c(255);
   output_a(1);
  
   basla:
   if(a==1){
      goster();
      a=0;
      i=0;
   }
 
   goto basla;
 }
 
 
 Também estou disponibilizando os arquivos para download para testes no Proteus, (figura 3) poderão ser feitas adaptações se seu LED for de catodo comum, atribuindo a saída transistores, até mesmo para aumentar a possibilidade de atribuir mais LED's as portas do Microcontrolador PIC 16f877a.
 

Figura 4
 
 
Agora é só pegar a arvores e decora-la, ai sua média em casa vai subir bastante. 
 
 


Um comentário: