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: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();
}
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: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();
}
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:
O led não vai queimar aplicando 5V nele?
vai
tem que colocar um resistor ai senao o bicho queima faci facil (principalmente o vermelho, q usa uma tensao menor)
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
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 !
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.
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!!
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?
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
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
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?
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
olá Hemerson
O brigado por compartilhar essa nova alternativa.
Experimentem trocar o tipo da variável de INT para CHAR :-)
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!?
em vez de Serial.println(n, BYTE);
botei Serial.write (n);
e funcionou na versão 1.05
Postar um comentário