Ir ao conteúdo
  • Cadastre-se

PIC16F628A - Automatização por celular


GustavoS.

Posts recomendados

Fala pessoal ! tudo bem ?

Galera .. Estou tendo dificuldade pra criar um código ..

É o seguinte, estou usando aquele famoso MT8870 ( para quem não conhece): [ame=

]
[/ame] Até aí tudo bem, mas eu quero colocar um pic conectado no MT e fazer com que cada botão que eu apertar do celular faça alguma coisa diferente, e para controlar o que farão essas variáveis quero que * determine que vai ligar e # determine que vai desligar ..

Basicamente assim :

- Com o botão *1 ligo um sistema de iluminação, com #1, desligo;

- Com o botão *2 ligo uma sirene, com #2 desligo;

- Com o botão *3 ligo uma ventoinha, com #3 desligo ..

- etc ..

E colocar o botão especial 0 ..

- Digitando *0 liga tudo ..

- Digitando #0 desliga tudo ..

Dessa parte de eletrônica de controlar os circuitos é de boa .. O problema é o micro .. Tenho pouca experiência em programação:/ Enfim, preciso cada botão que apertar tenha uma saída independente, assim, todos os botões de 0 a 9 fariam alguma coisa diferente .. Para isso, preciso interpretar cada linha da tabela verdade do MT8870 como um código diferente, certo ? Mas preciso de uma guia pra fazer isso ..

Então vamos lá : eis aqui a tabela de verdade do MT8870 :

d99f.jpg

___________________

Como posso fazer 0 0 0 1 ser interpretado como botão 1 ?

0 0 1 0 como botão 2, etc .. E setar uma saída diferente para botão "1", botão "2", bem como a função "*" liga e "#" desliga ..

Sei que pra quem entende é uma coisa simples ( eu acho huasdhudasuh ), mas eu já tentei de todas as maneiras fazer isso e não consigo :wacko: ..

Aqui o print rs do circuito que estou usando pra simular isso no Proteus ..

stfb.jpg

Pinos A0 até A3 como entrada, e o restante serão saídas ..

__________

Tenho a parte do código em que tentei fazer aquilo de 0001 ser interpretado como 1 e setar ( no esquema um led ) como output_high o pino A4 ( minha primeira saída ) mas foi fail total .-. acho que to bem fora do caminho, por isso não vou nem postar :/

Dá uma guia aí pessoal ! ><

Estou programando em C utilizando o CCS .. valeu !

Enfim, é isso ! Obrigado se você leu até aqui .-. porque eu acho que ficou enorme esse post .. D;

Me ajudem a fazer esse código pessoal, estou ficando doido já tentando fazer isso :/ ' Mas me ajudem a cortar as tábuas só que eu faço a canoa ^^

Obrigado !! ;)

**estou usando o mesmo circuito que o do vídeo, mas no lugar dos LEDs está o PIC**

Link para o comentário
Compartilhar em outros sites

Não sei amigo .. Mas deve funcionar sim !

Eu já testei outros celulares de uns amigos e funcionaram também, o único que não funcionou foi o SamsungChat mesmo .. Provavelmente o Iphone funciona sim.

Mas de todo modo não custa tentar, comprei todos esses componentes do circuito que está no vídeo e gastei menos de 15 reais.

Link para o comentário
Compartilhar em outros sites

Só digitar e o CI decodifica e manda as saídas correspondentes na tabela verdade .. Não precisa estar em chamada, a menos que você queira controlar de outro celular, aí você liga para o celular que tá lá no circuito e digita o nº que dá na mesma também ^^

______________

Eaí pessoal ninguém pra me dar uma luz ? dsuhadhas

Link para o comentário
Compartilhar em outros sites

Toma ai, um código já pronto e funcionando, fiz para bloquear minha moto a distância.

#include <12F675.h>

//#device adc=8

#FUSES WDT //Watch Dog Timer

#FUSES INTRC_IO //Internal RC Osc, no CLKOUT

#FUSES NOCPD //No EE protection

#FUSES NOPROTECT //Code not protected from reading

#FUSES NOMCLR //Master Clear pin used for I/O

#FUSES PUT //Power Up Timer

#FUSES BROWNOUT //Reset when brownout detected

#FUSES BANDGAP_HIGH

#use delay(clock=4000000)

#define rele PIN_A0 //Travar o Carro

#define beep PIN_A1 //Apita para avisar o estado

int n1=0, n2=0, n3=0, n4=0;

short Q1;

short Q2;

short Q3;

short Q4;

short teste=0;

void liga() // Liga o alarme quando precionar 15

{

if ((Q1==1) && (Q2==0) && (Q3==0) && (Q4==0)) //TECLA 1

{

n1=1;

}

if ((Q1==1) && (Q2==0) && (Q3==1) && (Q4==0)) //TECLA 5

{

n2=5;

}

if ((n1==1) && (n2==5)) // Se for igual a 15

{

output_high(rele);

delay_ms(500);

if (teste==0)

{

output_high(beep);

delay_ms(500);

restart_wdt();

delay_ms(500);

output_low(beep);

teste=1;

n3=0;

n4=0;

}

}

return;

}

void desliga() // Desliga o alarme quando precionar 27

{

if ((Q1==0) && (Q2==1) && (Q3==0) && (Q4==0)) //TECLA 2

{

n3=2;

}

if ((Q1==1) && (Q2==1) && (Q3==1) && (Q4==0)) //TECLA 7

{

n4=7;

}

if ((n3==2) && (n4==7)) // Se for igual a 27

{

output_low(rele);

delay_ms(500);

if (teste==1)

{

output_high(beep);

delay_ms(200);

output_low(beep);

delay_ms(200);

output_high(beep);

delay_ms(200);

restart_wdt();

output_low(beep);

delay_ms(200);

output_high(beep);

delay_ms(200);

output_low(beep);

delay_ms(200);

teste=0;

n1=0;

n2=0;

}

}

return;

}

void main()

{

port_a_pullups(TRUE);

setup_adc_ports(NO_ANALOGS|VSS_VDD);

setup_adc(ADC_OFF);

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_wdt(WDT_2304MS);

setup_timer_1(T1_DISABLED);

setup_comparator(NC_NC);

setup_vref(FALSE);

output_low(rele);

output_high(beep);

delay_ms(500);

output_low(beep);

while(true)

{

restart_wdt();

Q1=input(pin_A2);

Q2=input(pin_A3);

Q3=input(pin_A4);

Q4=input(pin_A5);

liga();

restart_wdt();

desliga();

restart_wdt();

/*output_high(beep);

output_high(rele);

delay_ms(500);

restart_wdt();

output_low(beep);

output_low(rele);

delay_ms(490);

*/

}

}

Link para o comentário
Compartilhar em outros sites

valeu chacal .. Vou tentar simular aqui no proteus .. mas me fala uma coisa, tem como eu transferir esse código pro PIC16F628A ? Ou ao menos a ideia é parecida nele .. ?

Vi que no seu código tem a função ADC .. O pic que pretendo usar não tem ADC :/ ' Seria parecido o código mesmo assim ?

_____________

se alguém tiver alguma sugestão .. rs .. qualquer dúvida posto aqui !! valeu

Link para o comentário
Compartilhar em outros sites

Galera .. Peguei uma apostila de PIC aqui e estou tentando fazer algo com base no código do chacal ..

Não está dando erro nenhum no CCS quando mando compilar, mas na simulação no proteus não está funcionando .. tem alguma coisa errada .-. :wacko:

#include <16F628A - DTFM.h>

void main() {

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

setup_timer_1(T1_DISABLED);setup_timer_2(T2_DISABLED,0,1);

setup_comparator(NC_NC_NC_NC);

setup_vref(FALSE);

//Setup_Oscillator parameter not selected

// Todo: USER CODE!!

//(A0 - Q1) (A1 - Q2) (A2 - Q3) (A3 - Q4)

int Q1=0;

int Q2=0;

int Q3=0;

int Q4=0;

While(true){

Q1=input(pin_A0);

Q2=input(pin_A1);

Q3=input(pin_A2);

Q4=input(pin_A3);

/*TECLA 1 - se apertar 1 a saida gera 0001 na ordem

que segue ... (A0 - Q1) (A1 - Q2) (A2 - Q3) (A3 - Q4)*/

if( (Q1==0) && (Q2==0) && (Q3==0) && (Q4==1) ){

Output_high(pin_A4);

}

}

}

Qual o erro do meu programa pessoal ? O código está certo, mas acho que elaborei mal ): O led não acende .-. '

Link para o comentário
Compartilhar em outros sites

Gustavo,

voce tem de configurar 5 entradas no PIC, sendo que uma delas vai ligada ao pino 15 do MT8870, e também as saídas tantas quantas forem as teclas que voce quiser detectar. Monitorar esse pino 15 é a maneira que se obtém a melhor imunidade a ruídos.

Quando existir um sinal válido, esse pino vai mudar de nivel baixo para nivel alto, e nesse instante voce lê o estado dos outros 4 pinos de entrada, e verifica se é um * ou um # , e seta um flag indicando se é para ligar ou desligar.

Depois disso você espera um tempinho, por exemplo 0,2 segundos, e volta a esperar a mudança do pino 15 de baixo para alto, e lê o outro dígito, e com isto voce faz a ação desejada na saída indicada pelo segundo dígito.

Claro que não pode ficar esperando isto para sempre, tem de ter algum tipo de temporizador para poder começar tudo de novo se demorar demais. No programa postado pelo Chacalgbi, isto é feito pelo watchdog, fica bem simples !

Por ultimo, tome cuidado com o nível do sinal de áudio aplicado no 8870, se for muito alto ele pode detectar errado !

Como curiosidade.... Se você fizer seu programa em um Arduíno ( ou um chip Atmega328 ) voce nem precisa do 8870.... Tem uma biblioteca prontinha para decodificar DTMF usando apenas o conversor Adc.... :

http://whatcomradio.wordpress.com/2013/05/28/dtmf-decoding-with-arduino/

O resto é com você !

Paulo

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!