Social Icons

4.5) Ligando LED's Pelo Teclado do PC



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(); "




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

A1-Inicialmente execute este códio abaixo.



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)
}

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);

}
}

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:

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


void setup() {
Serial.begin(9600);
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);
}

}

}


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.

4.4) Botões/Buzzer + LM35...





Olá todos. Para quem já conferiu os últimos tutoriais aqui vai mais uma brincadeirinha.
Vamos interligar um sensor de temperatura que mostra em Celsius, Fahrenheit e Kelvin? E que tal usar um piezo ou Buzzer para indicar com sinal sonoro quando a temperatura é mostrada?
Esse tutorial será dividido em 3(três) partes para facilitar a compreensão:
1° Como usar o buzze e acionar por botão
2° Como usar o LM35(sensor de temperatura)
3°Como interligar o Buzzer, o botão e o LM35

1°-passo:
Munido de sua matriz de contatos e um buzzer monte o circuito abaixo:
Atenção: O piezo é um componente polarizado(+-) .

Clicar na imagem para ampliar




A1-Execute o programa:


int piezoPin = 9;

void setup() {
pinMode(piezoPin, OUTPUT);
}

void loop() {

digitalWrite(piezoPin, HIGH);
delayMicroseconds(600);
digitalWrite(piezoPin, LOW);
delayMicroseconds(600);
}

Comentando o código:
Temos o buzzer ligado ao pino 9 que hora esta ligado e hora desligado. O valor 600 é a alternância nesse comportamento.
Experimente mudar esses valores para criar sons mais agudos ou graves. O 600 foi um som que achei bem irritante. Espero que goste!

Agora com sua matriz de contatos monte o circuito abaixo adicionando um Botão:

Clicar na imagem para ampliar





A2-Execute o programa:



int piezoPin = 9, botao=7, val=0;

void setup() {
pinMode(piezoPin, OUTPUT);
pinMode(botao,INPUT);
}

void loop() {

val=digitalRead(botao);
if(val==1){
digitalWrite(piezoPin, HIGH);
delayMicroseconds(600);
digitalWrite(piezoPin, LOW);
delayMicroseconds(600);
}

}

Comentando o código:

Como tudo funciona? O botão é lido e quando ele tem "valor 1" que é o mesmo que HIGH ou 5V ele executa uma tarefa: a de emitir um som.

Veja o vídeo:




2°-passo:
Agora que sabemos como gerar um som de alerta e usar o botão vamos para o segundo passo:


Munido mais uma vez de sua matriz de contatos e um LM35 monte o circuito abaixo:
Datasheet do LM35


Clicar na imagem para ampliar




B1-Execute o código:




int pin = 0;
int tempc= 0, tempf=0,tempk=0;
int samples[8];
int i;
void setup(){

Serial.begin(9600);
}

void loop()
{

for(i = 0; i<=7 ;i++){
samples[i] = ( 5.0 * analogRead(pin) * 100.0) / 1024.0;
tempc = tempc + samples[i]; // somando os 8 valores lidos
delay(1000);
}

tempc = tempc/8.0; // tirando a media dos 8 valores
tempf = (tempc * 9)/ 5 + 32; // converte para fahrenheit
tempk= tempc+273; // converte para Kelvin
delay(100);

//Mostra as temperaturas em C F e K

Serial.print("TemperaturaC:");
Serial.print(tempc);
Serial.print("\t");
Serial.print("TemperaturaF:");
Serial.print(tempf);
Serial.print("\t");
Serial.print("TemperaturaK:");
Serial.print(tempk);
Serial.print("\n");

}
 

Comentando o código:

Temos a leitura do sensor no pino 0(uma entrada analógica) que gera valores entre 0 e 1023. E como relacionar a temperatura com esses valores?
Uma equação cria uma relação entre o valor de referência que é 5V com esses valores analogicos(de 0 a 1023). Estabelecendo 0,01V para cada 1C°.
Podemos resumir em:

Temperatura em Celsius = ( 5.0 * analogRead(pin) * 100.0) / 1024.0


É possível ainda usar o 3.3V  do Arduino como refência externa mas vamos deixar esse tema para outra oportunidade.
Por fim o programa mostra os valores na tela( Serial Monitor ).



3-passo:
Vamos integrar todos os outros circuitos já montados? Monte na matriz de contatos o circito:

Clicar na imagem para ampliar




B2-Execute o código:


int pin = 0;
int tempc= 0, tempf=0,tempk=0;
int samples[8];
int i;

int piezoPin = 9, botao=7, val=0;

void setup(){

Serial.begin(9600);

pinMode(piezoPin, OUTPUT);
pinMode(botao,INPUT);
}

void loop()
{

for(i = 0; i<=7 ;i++){
samples[i] = ( 5.0 * analogRead(pin) * 100.0) / 1024.0;
tempc = tempc + samples[i];
delay(15);
}
tempc = tempc/8.0;
tempf = (tempc * 9)/ 5 + 32;
tempk= tempc+273;
delay(10);

// testando o botão
val=digitalRead(botao);
if(val==1){

//Mostrando na tela:
Serial.print("TemperaturaC:");
Serial.print(tempc);
Serial.print("\t");
Serial.print("TemperaturaF:");
Serial.print(tempf);
Serial.print("\t");
Serial.print("TemperaturaK:");
Serial.print(tempk);
Serial.print("\n");


// Som:
digitalWrite(piezoPin, HIGH);
delayMicroseconds(600);
digitalWrite(piezoPin, LOW);
delayMicroseconds(600);
}

}

 
Comentando o código:
Basicamente este código engloba todos os outros. 
Ele gera som quando o botão é pressionado e simultaneamente mostra na tela os valores das temperaturas nas diferentes escalas.

Valores gerados na tela:

Veja no vídeo um sinal sonoro para cada click no botão:



4.3) Lendo Botões



Ao fazer a leitura de um botão com uma das portas do Arduino é importante estabelecer como a porta deve ler o valor. Por exemplo:
1° Caso: Porta do Arduino inicialmente em nivel lógico baixo(0V) e ao pressionar um botão ter uma entrada em nivel lógico alto(5V).
2° Caso: Porta do Arduino inicialmente em nível logico alto(5V) e pressinoarmos um botão e ter uma entrada de nivel lógico baixo(0V).
Bem... O que fazer e em que condições isso acontece? Como programar para interpretar cada situção?

Passo à Passo:

Monte o circuito na sua matriz de contato:
 Clicar na imagem para ampliar




A1-Execute o programa abaixo:



int BotaoPino = 7; // pino a ser lido
int val= 0;
int i=0; //Variavel para incremento


void setup() {

pinMode(BotaoPino, INPUT);
Serial.begin(9600);
}


void loop()
{
val= digitalRead(BotaoPino);
delay(100);

  if(val!=0){
   Serial.print(i++);
   Serial.print("-Valor:");
   Serial.println(val);
   }
}



Agora clicar no icone: Serial Monitor:


Você verá essa tela:


Ao pressionar o botão acontecerá isso:



Comentário sobre o Programa e o Circuito:
O programa faz a leitura constantemente do botão e somente em nível lógico alto(5V) mostra na tela que detectou algo. 
Temos então um caso de Resistor em Pull-Down pois mantém em nível baixo a porta quando o botão não é pressionado.


-Vamos fazer algumas modificações?

Monte o circuito na sua matriz de contato:
-Atenção: Os fios amarelo e verde estão em posições contrárias ao circuito anterior.


 Clicar na imagem para ampliar




A2-Execute o programa abaixo:



int BotaoPino = 7; // pino a ser lido
int val= 0;
int i=0; //Variavel para incremento


void setup() {

pinMode(BotaoPino, INPUT);
Serial.begin(9600);
}


void loop()
{
val= digitalRead(BotaoPino);
delay(100);

if(val!=1){
Serial.print(i++);
Serial.print("-Valor:");
Serial.println(val);
}
}



Agora clicar no icone: Serial Monitor:


Você verá essa tela:



Ao pressionar o botão acontecerá isso:




Comentário sobre o Programa e o Circuito:
O programa faz a leitura constantemente do botão e somente em nível lógico baixo(0V) mostra na tela que detectou algo. 
Temos então um caso de Resistor em Pull-up pois mantém em nível alto a porta quando o botão não é pressionado.