Controlando Leds pelo Teclado Arduino - Tutorial

|


Nesta aula será possível entender como os dados são lidos pelo arduino e como controlar LEDs apenas enviando dados pela tecla do seu computador.
 Vamos iniciar com um programa que exemplifica o funcionamento da leitura de dados pela porta serial "Serial.read(); "
Veja como proceder.


Não será preciso nesse momento inicial usar a matriz de contatos.

A1-Inicialmente execute este códio abaixo.

/*

Controlando Leds pelo Teclado Arduino - Tutorial
Programa desenvolvido por Gamesh_
Com base no site arduino.cc
http://brasilrobotics.blogspot.com/
17/01/2011
*/


int n = 0; // Para entrada de dados seriais (for incoming serial data)

void setup() {

Serial.begin(9600); // Ativa a porta serial (opens serial port, sets data rate to 9600 bps)

Serial.flush();

}
void loop() {

// Testa se a prta serial esta recebendo dados (send data only when you receive data:)

if (Serial.available() >0) {

// leitura dos dados (read the incoming byte:)

n = Serial.read();

// mostra na tela (say what you got:)
Serial.print("Valor digitado: ");
Serial.println(n, BYTE);
Serial.print("Valor lido: ");
Serial.println(n);


}

Serial.flush();

}
Após executar ative a Serial Monitor e digite valores:



Ao ativar e digitar valores e clicar em (Send) teremos na tela:




Neste momento os números: 1,2,3,4,5 e o número: 8 foram diditados.
Como é possível notar valor digitado "1" é lido como "49" e o valor "2" como "50". Perceba que há uma progressão. É importante notar essa relação pois esses valores serão trabalhados no programa seguinte.


Vamos aprofundar mais um pouco?
Agora será preciso montar o circuito abaixo na sua matriz de contatos:

Clicar na imagem para ampliar




A2-Execute o código abaixo:

/*

Controlando Leds pelo Teclado Arduino - Tutorial
Programa desenvolvido por Gamesh_
http://brasilrobotics.blogspot.com/
17/01/2011
*/

int n;
int pin7 = 7;
int pin8 = 8;

void setup() {

Serial.begin(9600);
Serial.flush();
pinMode(pin7, OUTPUT);
pinMode(pin8, OUTPUT);
Serial.println("Digite:\n 2-Vermelho \n 3-Verde \n 4-Vermelho e Verde \n 5-Apagar Todos");
Serial.println("---------------// www.BrasilRobotics.blogspot.com");

}

void loop() {

// testa se esta recebendo dado do teclado

if (Serial.available() >0) {

// faz leitura do numero digitado

n = Serial.read();

Serial.print("Voce digitou: ");

Serial.println(n, BYTE); // Imprime na tela o valor do telhado em BYTE


//testes condicionais

if( n==50 ){ // 2-vermelho (red)

digitalWrite(pin7,HIGH);

digitalWrite(pin8,LOW);


}

if(n==51){ // 3-Verde (green)
digitalWrite(pin8,HIGH);
digitalWrite(pin7,LOW);

}



if(n==52){ // 4-Verde (green)


digitalWrite(pin8,HIGH);

digitalWrite(pin7,HIGH);

}

if(n==53){ // 5-desliga LEDs (turns off)


digitalWrite(pin8,LOW);
digitalWrite(pin7,LOW);

}

}

Serial.flush();

}
Após executar ative a Serial Monitor:


Será mostrado na tela inicialmente:




Estes dados são mostrados uma única vez e foram apresentados no "void setup()". Caso estivessem no "void loop" seriam constantemente mostrados. Mas a idéia aqui é criar um cabeçalho para orientar o usuário.
Logo em seguida digite valores: como 1, 2, 3 , 4, 5 e observe o que acontece com os LEDs.



Será possivel notar cinco(5) comportamentos:

1°- Quando digitamos: "2" temos o LED vermelho ligado

2°- Quando digitamos: "3" temos o LED verde ligado

3°- Quando digitamos: "4" temos vermelho e verde ligados

4°- Quando digitamos: "5" temos todos apagados.



5°- Quando digitamos: 1, 5, 6 e outros valores nada acontece.


Também pode ser conferido no vídeo:




Bem... e como tudo acontece no código?
Temos a leitura do valor "n" que é gerado pelo teclado como vimos no código anterior esse valor relaciona um dígito a outros. 
Como o objetivo é comparar valores lidos pelo teclado precisamos utilizar o valor real do "n" e compara-lo em uma condição: (n==50) "n é igual a 50?", como 50 representa do digito "2", caso você tenha pressionado o número "2" a condição torna-se verdade e uma tarefa é executada.  
É possível usar outros valores e também acionar outros dispositivos como motores usando essa mesma lógica, basta adicionar mais condições.
Uma boa alternativa é trabalhar apenas com os números digitado. O truque é usar: n = Serial.read() -'0';  Mas esse é um tema para uma outra aula. Façam testes.

Documentação:


 


Gostou do tutorial? Incentive mais tutoriais visitando:


15 comentários:

Maicon disse...

O led não vai queimar aplicando 5V nele?

embat disse...

vai
tem que colocar um resistor ai senao o bicho queima faci facil (principalmente o vermelho, q usa uma tensao menor)

Carla disse...

Gamesh vou fazer este projeto na final do meu curso, porem quando chego nesta tela :
Ao ativar e digitar valores e clicar em (Send) teremos na tela:

Eu digito os valor exemplo 1 e aperto send não aparece nada :(

você pode me ajudar por favor :D

Thiago disse...

Olá, e tenho uma dúvida a respeito do teclado. Eu já até tinha feito um projeto parecido com o de vocês aqui, e é bem simples mesmo, mas outro dia surgiu a ideia de usar as setas do teclado, e sem ter que apertar enter a cada valor digitado... Tem como ?

Obrigado! E parabéns pelo site que está muito bacana !

Brasil Robotics disse...

Respostas:

Para Maicon
O led não vai queimar aplicando 5V nele?
-Sim, normalmente é o que acontece. É muito importante usar um resistor em série com o led.
Não usar o resistor pode causar a queima do microcontrolador se as proteções deste não operarem corretamente.
Imagina uma torneira que controla a saida de água do cano. Sem ela a água jorra sem parra e com ele você controla a demanda de água.
O resistor é a torneira e o LEd a demanda.

Para Carla:
-veja se baud rate está setada em 9600. É o número que fica no canto esquerdo da serial monitor.
isso deve resolver.
Caso não volte a entrar em contato.

Para Thiago:
-É preciso fazer um código que faça a leitura direta do teclado e envie os dados automaticamente para o arduino.
Você pode usar ainda o processing e criar uma interação com o mouse ou outra ferramenta.

Carla disse...

Oi Gamesh eu de novo

Eu consegui fazer, o problema é que eu não estava apertando play e upload I/o no programa do Arduino
agora é fazer isso na parte escrita descrevendo isso que é o pior risos
isso pra mim é um "comando simples" com uso de microntolador onde as boteiras sao os teclados do pc.

Muito obrigada!!

Hugo Ricardo disse...

quando eu vo copiar o codigo para usar
the 'BYTE' keyword is no longer supported.

As of Arduino 1.0, the 'BYTE' keyword is no longer supported.
Please use Serial.write() instead.

e agora oq eu faço?

Brasilrobotics disse...

Mude BYTE para BIN ou HEX .
É possível usar a versão da IDE anterior a que está usando que tudo funciona bem.
Houve uma atualização e mudou isso provavelmente.
Mas a lógica continua a mesma.
Teste e informe se deu certo. SE contnuar me informe

Hugo Ricardo disse...

funciona + ou -
quando uso BIN
e digito um numero por exemplo 1
ele mostra

Valor digitado: 110001
Valor lido: 49

quando digito 9

Valor digitado: 111001
Valor lido: 57

ele ta mostrando o valo digitado em binario depois o valor lido que deve ser em ASCII eu axo

quando uso HEX

a coisa fica um pouco Pior

quando digito por exemplo 1

Valor digitado: 31
Valor lido: 49

quando digito 6

Valor digitado: 36
Valor lido: 54

digito 9

Valor digitado: 39
Valor lido: 57

eu queria que aparecesse o valor digitado corretamente

Brasilrobotics disse...

olá

A IDE do arduino 0223 fez umas modificações em bibliotecas e está afetando diversos códigos já existentes não só esse como de outros que tem comentado na internet.

Para resolver o problema de uma vez vá ao site do Arduino.cc depois em Downloads e baixe a versão 022 é anterior a essa que está usando.
Execute o codigo que tudo dará certo.
Futuramente faço uma opção de código para a versão 0223.
ok?

Hemerson disse...

Em relação ao usar o (BYTE) no Arduino UNO (IDE Arduiono 1.0), podemos usar a função da seguinte forma que Roda redondinho.

Serial.println(n-(48),HEX);

Um forte abraço

Brasilrobotics disse...

olá Hemerson

O brigado por compartilhar essa nova alternativa.

gtz disse...

Experimentem trocar o tipo da variável de INT para CHAR :-)

Unknown disse...

Essa tutorial deixou muita coisas claras! Mas estou com uma dúvida! Como seria se, usando a ideia do tutorial de acender os leds, cada tecla ativa-se um conjunto de funções para os leds!? Agora não seria mais um controle direto dos leds e sim um controle de vários outros pinos a um toque do teclado.
Por exemplo ao digitar 1 ativa a função de acender vários leds em uma ordem específica e com intensidade diferentes(podendo ter até um efeito sonoro específico), sendo condicionada a, caso seja digitado o 2(ao invés do 1)outro conjunto de funções seria ativado.
E é claro caso seja digitado o 2(enquanto as funções do 1 estejam sendo executadas) as funções do 1 iriam cessar imediatamente e começar as do 2. Você saberia como solucionar esse questão!?

Unknown disse...

em vez de Serial.println(n, BYTE);
botei Serial.write (n);
e funcionou na versão 1.05

 

©2010 Brasilrobotics | by Gamesh_