Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
Entre para seguir isso  
cjsj

[Resolvido] Programação de PIC - Dúvida

Recommended Posts

Oi pessoal sou novo aqui e preciso da ajuda de vocês para resolver um problema. Bem estou trabalhando em um projeto da facu que envolve programação de PIC mais especificamente o 16f628a. Não tenho conhecimento na área mas consegui fazer esse codigo. Explicando: Esse programa serve para acender ou apagar as luzes d 1 sala se não houver pessoas nela.quando uma pessoa passa pela porta ela interrompe o sinal de dois leds ir e dependendo da orndem em que eles foram interrompidos podemos identifica se alguem entrou ou saiu.

#include<16f628a.h>
#include<stdio.h>
#use delay(clock=4000000)
#fuses INTRC_IO,NOWDT,PUT,BROWNOUT,NOMCLR,NOLVP

//ENTRADA
#define LEDIN PIN_B1
#define LEDOUT PIN_B2

// SAIDA
#define LED1 PIN_A0
#define LED2 PIN_A1
#define RELE PIN_A2


main(){

int pessoas=0;
int ledUm;
int ledDois;

while(true){
output_high(LED1);
output_high(LED2);
ledDois=input(LEDOUT);
ledUm=input(LEDIN);

if(ledUm==1){
while(ledDois==0){
ledDois=input(LEDOUT);
}
if(ledUm==true && ledDois==1){
pessoas++;
}
ledUm=0;
ledDois=0;
}else if(ledDois==1 && pessoas>0){
while(ledUm!=1){
ledUm=input(LEDIN);
}
if(ledUm==1 && ledDois==1){
pessoas--;
}
ledUm=0;
ledDois=0;
}else if(ledDois==1 && pessoas==0){
while(ledUm!=1){
ledUm=input(LEDIN);
}
ledUm=0;
ledDois=0;
}
if(pessoas>0){
output_high(RELE);
}
else if(pessoas==0){
output_low(RELE);
}
delay_ms(100);

}

}

Por favor não sei o q pode estar errado nisso:wacko::confused:

Editado por Bcpetronzio
Inserir Tags CODE

Compartilhar este post


Link para o post
Compartilhar em outros sites

Imaginando que os sensores estão muito próximos e o segundo será interrompido enquanto o primeiro ainda estiver interrompido.

Acredito que estejas utilizando algum tipo de sensor óptico. Então utilizei a lógica que imaginei que você estava utilizando (1-ativo(alguem se encontra no caminho) ).

Acredito que esta lógica funcionaria para o que quer, desde que o clock esteja de acordo.

Imaginando também que ao iniciar o programa, não haverá ninguem na sala.

Podes colocar um sensor de presença que enquanto estiver ativo não desligará a luz.

Não utilizo o CCS, então não garanto os comandos. Os define's são mais para dar uma noção. O programa como está não rodará.

#define sensor_1 input(PIN_xx)

#define sensor_2 input(PIN_x2)

#define rele_luz PIN_A2

int pessoas=0;

main()

{

while()

{

if(pessoas>0)

{

output_high(rele_luz);

}

if(pessoas==0)

{

output_low(rele_luz);

}

if (sensor_1==1 & sensor_2==0)

{

for(; ;)

{

if (sensor_2==1)

{

pessoas++;

break;

}

if (sensor_1==0)

{

break;

}

}

}

if (sensor_1==0 & sensor_2==1)

{

for(; ;)

{

if (sensor_1==1)

{

pessoas--;

break;

}

if (sensor_2==0)

{

break;

}

}

}

}

}

A parte em azul apenas liga ou desliga as luzes dependendo da variavel pessoas.

Caso o sensor 1 seja ativado e o 2 não, o laço for espera por uma mudança nos sensores: sensor 2 =1, a pessoa entrou, sensor 1 = 0, a pessoa voltou atrás(apenas uma proteção caso ative o primeiro e não chegue a ativar o segundo)

No segundo if "principal", funciona o mesmo, mas o inverso...ao sair.

Espero ajudar

Abraço

Editado por rafael_kl
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Imaginando que os sensores estão muito próximos e o segundo será interrompido enquanto o primeiro ainda estiver interrompido.

    Acredito que estejas utilizando algum tipo de sensor óptico. Então utilizei a lógica que imaginei que você estava utilizando (1-ativo(alguem se encontra no caminho) ).

    Acredito que esta lógica funcionaria para o que quer, desde que o clock esteja de acordo.

    Imaginando também que ao iniciar o programa, não haverá ninguem na sala.

    Podes colocar um sensor de presença que enquanto estiver ativo não desligará a luz.

    Não utilizo o CCS, então não garanto os comandos. Os define's são mais para dar uma noção. O programa como está não rodará.

    #define sensor_1 input(PIN_xx)

    #define sensor_2 input(PIN_x2)

    #define rele_luz PIN_A2

    int pessoas=0;

    main()

    {

    while()

    {

    if(pessoas>0)

    {

    output_high(rele_luz);

    }

    if(pessoas==0)

    {

    output_low(rele_luz);

    }

    if (sensor_1==1 & sensor_2==0)

    {

    for(; ;)

    {

    if (sensor_2==1)

    {

    pessoas++;

    break;

    }

    if (sensor_1==0)

    {

    break;

    }

    }

    }

    if (sensor_1==0 & sensor_2==1)

    {

    for(; ;)

    {

    if (sensor_1==1)

    {

    pessoas--;

    break;

    }

    if (sensor_2==0)

    {

    break;

    }

    }

    }

    }

    }

    A parte em azul apenas liga ou desliga as luzes dependendo da variavel pessoas.

    Caso o sensor 1 seja ativado e o 2 não, o laço for espera por uma mudança nos sensores: sensor 2 =1, a pessoa entrou, sensor 1 = 0, a pessoa voltou atrás(apenas uma proteção caso ative o primeiro e não chegue a ativar o segundo)

    No segundo if "principal", funciona o mesmo, mas o inverso...ao sair.

    Espero ajudar

    Abraço

    valeu cara! fiz algumas adaptações e ta funcionando legal! Muito obrigado pela ajuda!:D

    Abraços

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Acredito que seria interessante colocares um sensor de presença, e o seguinte no código:

    if (sensor_3==1)

    {}

    else{output_low(rele_luz);}

    e também, sem relação ao sensor de presença, as seguintes linhas:

    if(pessoas<0)

    {

    pessoas=0;

    }

    Pois imagine, se existem pesoas na sala ao ativar o circuito, pelo código antigo quando sairem todas, a luz apagaria, mas apenas ligaria quando entrar o numero de pessoas que saiu +1. Assim, quando sairem todas, na primeira que entrar ja liga. (Não corrige todos erros que ocorrem ao ligar o circuito com pessoas na sala, mas no momento que a sala esvaziar, o circuito passa a funcionar como deveria).

    Abraço

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Hum verdade, gostei da ideia!:aplausos: novamente valeu pela força!

    abraço

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Visitante
    Este tópico está impedido de receber novos posts.
    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×