collapse

* Links de Robótica

* Posts Recentes

Preços e fabricantes de pcb por Sérgio_Sena
[Hoje às 10:20]


Palavras Cruzadas por Njay
[Hoje às 02:24]


Isaac Asimov - I, Robot por senso
[Ontem às 03:41]


Apresentação por TigPT
[17 de Setembro de 2017, 07:31]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]


Preparar bancada de testes por jm_araujo
[14 de Setembro de 2017, 10:24]


Mitos: mudança da ilumação tradicional p/ iluminação a LEDs? por LVirtual
[14 de Setembro de 2017, 07:46]


IPV4 IPV6 por Hugu
[13 de Setembro de 2017, 22:01]

Autor Tópico: Semáforo - Mais Um  (Lida 991 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline OxyGen

  • Mini Robot
  • *
  • Mensagens: 92
  • ET - UA
    • Curto.D ET Blog
Semáforo - Mais Um
« 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.
OxyGen #