collapse

* Links de Robótica

* Posts Recentes

Printer 3D barata por almamater
[Hoje às 08:31]


Fonte de corrente regulavel por jm_araujo
[Ontem às 23:57]


Circuito para temporizado por beirao
[Ontem às 22:42]


Empresas para fabricar e assemblar PCB por inot09
[Ontem às 21:08]


Cores de cabos por artur36
[18 de Janeiro de 2017, 19:32]


Hackathon IOT Edp por metRo_
[17 de Janeiro de 2017, 22:54]


diodo ti964? por Hugu
[17 de Janeiro de 2017, 02:23]


Problema com collet (pinça) de uma fresadora/tupia (muito justo) por senso
[16 de Janeiro de 2017, 16:02]


robô com arduino por Robotarium
[16 de Janeiro de 2017, 13:48]


Novos conectores para pcb por Hugu
[15 de Janeiro de 2017, 16:45]

Autor Tópico: Semáforo - Mais Um  (Lida 832 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 #