Á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
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 /
********************************************************/
/ 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)
#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 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 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 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]
};
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,};
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,};
//******
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 ()
{
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;
}
}
}
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;
}
}
}
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;
}
}
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(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(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>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);
}
}
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>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);
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_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:
output_d(255);
output_c(255);
output_a(1);
basla:
if(a==1){
goster();
a=0;
i=0;
}
goto basla;
}
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.
Agora é só pegar a arvores e decora-la, ai sua média em casa vai subir bastante.
sou iniciante em eletronica, tem como me encinar a programar?
ResponderExcluir