collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

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