Programação arduino para iniciantes: o controlador de semáforo
O semáforo é um projeto pouco de diversão, que pode ser concluído em menos de uma hora. Aprenda a construir seu próprio - usando um Arduino - e como modificar o circuito para um modelo avançado.
Conteúdo
Não se preocupe se você nunca usou um Arduino antes, temos um Guia do iniciante.Começando com o Arduino: Guia de um novatoComeçando com o Arduino: Guia de um novatoArduino é uma plataforma electrónica de prototipagem de código aberto baseado em flexível e fácil de usar hardware e software. É destinado a artistas, designers, entusiastas e qualquer pessoa interessada em criar objetos ou ambientes interativos.consulte Mais informação
Nota: Este é o último de uma série de tutoriais de nível iniciante para Arduino, a plataforma aberta prototipagem eletrônica de origem. Aqui está uma lista dos artigos anteriores da série:
- O que é Arduino & O que você pode fazer com ele
- O que é um kit Arduino Iniciado & O que ele contém?
- Componentes mais legal para comprar junto com seus Starter Kit
- Primeiros passos com o Arduino Starter Kit - Instalação de drivers & Configurando O Conselho & Porta
- Um olhar mais atento a estrutura de um Arduino App & O Programa Exemplo Pisca
O que você precisa
Além do Arduino básico, você vai precisar de:
- LEDs vermelhos, amarelos e verdes.
- A placa de ensaio.
- 6 x 220? resistores.
- Fios de ligação.
- 1 x interruptor de botão de pressão.
- 1 x 10k? resistência
Quase todo o Arduino será adequado, desde que tem bastante dos pinos. Certifique-se de ler a nossa guia de compra se você não tem certeza o modelo que você precisa. Você provavelmente tem essas peças em seu kit iniciante já.Guia Arduino compra: Qual conselho você deve começar?Guia Arduino compra: Qual conselho você deve começar?Há tantos tipos diferentes de placas Arduino lá fora, você seria perdoado por ter sido confundido. Que você deve comprar para o seu projeto? Vamos ajudar, com este guia de compra do Arduino!consulte Mais informação
Um exemplo simples
Vamos começar pequeno. A, única luz básica de tráfego é um bom lugar para começar. Aqui está o circuito:
Ligue o ânodo (long leg) de cada LED para pinos digitais oito, nove e dez (através de um 220? Resistor). Ligue os cátodos (perna curta) ao Arduino chão.
I utilizado Fritzing desenhar estes diagramas. Não só é fácil de usar, é grátis!
O código
Comece por definir variáveis para que possamos abordar as luzes por nome em vez de um número. Inicie um novo projeto Arduino, e começar com estas linhas:
int vermelho = 10-int amarelo = 9-int verde = 8-
Em seguida, vamos adicionar a função de configuração, where`ll que configurar os LEDs vermelhos, amarelos e verdes para ser saídas. Desde que você criou variáveis para representar os números de pinos, agora você pode se referir aos pinos pelo nome em vez disso.
vazio configuração(){pinMode(vermelho, SAÍDA)-pinMode(amarelo, SAÍDA)-pinMode(verde, SAÍDA)-}
Essa foi fácil. Agora, a parte difícil - a lógica real de um semáforo. Criar uma função separada para mudar as luzes (você verá porque mais tarde).
Quando você começar a programação, o código em si é muito rudimentar - é descobrir os detalhes minuciosos de lógica que apresenta o maior problema. A chave para ser um bom programador é ser capaz de olhar para qualquer processo, e dividi-la em seus passos fundamentais. Aqui está o resto do código:
vazio laço(){changeLights()-demora(15000)-}vazio changeLights(){// off verde, amarelo por 3 segundosdigitalWrite(verde, BAIXO)-digitalWrite(amarelo, ALTO)-demora(3000)-// desligue amarelo, em seguida, vire vermelho por 5 segundosdigitalWrite(amarelo, BAIXO)-digitalWrite(vermelho, ALTO)-demora(5000)-// vermelho e amarelo por 2 segundos (vermelho já está no embora)digitalWrite(amarelo, ALTO)-demora(2000)-// desligue vermelho e amarelo, em seguida, ligue verdedigitalWrite(amarelo, BAIXO)-digitalWrite(vermelho, BAIXO)-digitalWrite(verde, ALTO)-demora(3000)-}
Feito! Agora, carregar e executar (certifique-se de selecionar a bordo e porta correta do Ferramentas gt; Porta e Ferramentas gt; Borda menus). Você deve ter um semáforo de trabalho que muda a cada 15 segundos, como este (acelerado):
Uma passagem para pedestres
Agora que você sabe o básico, vamos melhorá-lo. Adicionar em um botão para pedestres para mudar a luz sempre que quiserem:
Observe como o semáforo é exatamente o mesmo que o exemplo anterior. Ligue o botão para pino digital 12. Você notará que o switch tem um 10k de alta impedância? resistor ligado a ele, e você pode estar se perguntando o porquê. Isto é chamado um resistor pull-down. É um conceito difícil de entender no início, mas paciência comigo.
Um interruptor quer permite o fluxo de corrente, ou não. Isso parece bastante simples, mas em um circuito lógico, a corrente deve ser sempre fluindo em qualquer uma alta ou baixa estado (lembre-se - 1 ou 0, alta ou baixa). Você pode supor que um interruptor de botão de pressão que não está realmente sendo empurrado seria definido como estando em um estado de baixo, mas na verdade ele é dito ser ‘flutuante`, porque nenhuma corrente está sendo desenhado em tudo.
Neste estado flutuante, é possível que uma leitura falsa irá ocorrer como ele flutua com interferência elétrica. Em outras palavras, um interruptor flutuante está dando nem uma alta confiança, nem baixo a leitura do estado. Um pull down resistor mantém uma pequena quantidade de corrente que flui quando o interruptor está fechado, garantindo assim uma leitura precisa baixo Estado. Em outros circuitos lógicos, você pode encontrar um resistor pull-up em vez - isso funciona com o mesmo princípio, mas em sentido inverso, certificando-se que determinada porta lógica padrão é alta.
Agora, na parte de loop do código, em vez de mudar as luzes a cada 15 segundos, vamos ler o estado do interruptor de tecla em vez disso, e só mudar as luzes quando ele é ativado.
O código
Comece por adicionar uma nova variável para o início do programa:
botão int = 12- // switch é no pino 12
Agora, na função de configuração, adicionar uma nova linha para declarar o interruptor como uma entrada. Eu também acrescentou uma única linha para iniciar os semáforos na fase verde. Sem este ajuste inicial, que iriam ser desligado, até que a primeira vez que um changeLights () foi iniciada utilizando uma função.
pinMode(botão, ENTRADA)-digitalWrite(verde, ALTO)-
Mudar toda a função loop para o seguinte em vez disso:
vazio laço() {E se (digitalRead(botão) == ALTO){demora(15)- // debounce softwareE se (digitalRead(botão) == ALTO) {// se o interruptor é alta, ou seja. empurrado para baixo - mudar as luzes!changeLights()-demora(15000)- // aguarde 15 segundos}}}
Isso deve resolver. Você pode estar se perguntando por que o botão é verificada duas vezes (digitalRead (botão)), Separados por um pequeno atraso. Isso é chamado debouncing. Muito parecido com o resistor puxar para baixo era necessário para o botão, este simples verificação pára o código de detecção de interferência menor como pressionar um botão. Você não tem que fazer isso (e provavelmente iria funcionar muito bem sem ele), mas é uma boa prática.
Video: Projeto Arduino sinal de trânsito
Ao esperar no interior do E se declaração por 15 segundos, os semáforos não pode mudar, pelo menos, que a duração. Uma vez que 15 segundos é acima, o circuito é reiniciado. Cada reinício do loop, ler o estado do botão de novo, mas se não for pressionado, o E se declaração nunca mais ativa, as luzes nunca mudam, e ele simplesmente reinicia novamente.
Veja como isso parece (acelerado):
A junção
Vamos tentar um modelo mais avançado. Em vez de uma passagem para pedestres, modificar o circuito ter dois semáforos:
Ligue o segundo semáforo para pinos digitais 11, 12 e 13.
Video: Projeto10 - Arduino Básico - Semáforo interativo
O código
Em primeiro lugar, atribuir os novos pinos semáforo para variáveis, e configurá-los como saídas, assim como no primeiro exemplo:
Video: Arduino Básico - 50 projetos
// uma luzint red1 = 10-int Amarela1 = 9-int green1 = 8-// luz doisint red2 = 13-int yellow2 = 12-int green2 = 11-vazio configuração(){// uma luzpinMode(red1, SAÍDA)-pinMode(Amarela1, SAÍDA)-pinMode(green1, SAÍDA)-// luz doispinMode(vermelho 2, SAÍDA)-pinMode(yellow2, SAÍDA)-pinMode(green2, SAÍDA)-}
Agora, atualizar seu loop para usar o código do primeiro exemplo (em vez da faixa de pedestres):
vazio laço(){changeLights()-demora(15000)-}
Mais uma vez, todo o trabalho está sendo realizado no changeLights () função. Ao invés de ir vermelho gt; vermelho & amarelo gt; verde, este código irá alternar os semáforos. Quando se está em verde, o outro será no vermelho. Aqui está o código:
vazio changeLights(){// transformar ambos os amarelos emdigitalWrite(green1, BAIXO)-digitalWrite(Amarela1, ALTO)-digitalWrite(yellow2, ALTO)-demora(5000)-// transformar ambos os amarelos off, e verde oposto e vermelhodigitalWrite(Amarela1, BAIXO)-digitalWrite(red1, ALTO)-digitalWrite(yellow2, BAIXO)-digitalWrite(vermelho 2, BAIXO)-digitalWrite(green2, ALTO)-demora(5000)-// ambos os amarelos em novamentedigitalWrite(Amarela1, ALTO)-digitalWrite(yellow2, ALTO)-digitalWrite(green2, BAIXO)-demora(3000)-// transformar ambos os amarelos off, e verde oposto e vermelhodigitalWrite(green1, ALTO)-digitalWrite(Amarela1, BAIXO)-digitalWrite(red1, BAIXO)-digitalWrite(yellow2, BAIXO)-digitalWrite(vermelho 2, ALTO)-demora(5000)-}
Aqui está o que parece (acelerado):
Isso é tudo para este tempo, então eu espero que você aprendeu lotes e tinha escrito o divertimento do risco. Você tem as mãos sujas com alguns LEDs e resistores, bem como a adição de um interruptor com um resistor pull down - espero que você entendeu por que precisamos de um. Brincar com o código, ajustá-lo e, mais importante se divertir. Se você fizer quaisquer aditamentos ou alterações, por que não deixe-nos saber sobre isso nos comentários?