LusoRobótica - Robótica em Português

Robótica => Iniciantes => Tópico iniciado por: OxyGen em 12 de Maio de 2010, 10:09

Título: Semáforo - Mais Um
Enviado por: OxyGen em 12 de Maio de 2010, 10:09
Boas a todos....

Como alguns de vocês já sabem sou um pouco novo nestas andanças na programação usando o arduino. De facto só ontem é que dei inicio ao meu primeiro projecto. Para não variar fiz um semáforo porque pensei que fosse coisa simples.

Por acaso até não foi nada complicado e consegui configurar um semáforo simples logo nas primeiras tentativas.

Depois de ter tudo a funcionar, resolvi então colocar o famoso botão Pressione para obter verde. Mas não queria fazer isto de uma forma qualquer, não o queria fazer da forma como está neste fórum em que a luz para os carros está sempre verde e só muda quando carregas no botão.

O meu objectivo é colocar o semáforo sempre no seu ciclo normal, isto é, alterna entre vermelho e verde para os carros e para os peões, e depois se for accionado o botão apenas e só quando está verde para os carros e vermelho para os peões é que o botão deverá fazer alguma coisa... Só assim é que faz sentido...

Eis o que tentei:

Colocar uma verificação do botão no espaço de tempo em que o semáforo estava vermelho (para os peões). Mas para o fazer teoricamente haveria 2 hipóteses: Colocar uma espécie while(delay(1000)) mas o compilador não aceita, ou colocar uma simples função val=digitalRead(botao). Neste último caso seria tecnicamente impossível ele detectar alguma coisa, (a não ser que mantivéssemos o botão carregado durante algum tempo) uma vez que num processador de 16MIPS (milhões de instruções por segundo ) se carregássemos no botão quase de certeza que a fase de verificação já tinha passado.

Pensei então noutra coisa: Ligar o botão à linha de interrupção 0 (Pino 2 Digital) e configurar uma rotina de serviço à interrupção. Qual não é o meu espanto quando vou ler a documentação relativa à função attachInterrupt(): Não aceita delays(). Tentei então fazer uma chamada a uma função normal com delays(), mas também não funcionou.

Já agora uma pergunta sobre interrupts: quando a rotina de serviço à interrupção termina o programa salta para onde estava antes de se dar a interrupção certo?

Se alguém me pudesse ajudar eu agradecia....
PS: O meu projecto mais simples está na parte dos projectos concluídos.