Demonstra o uso de uma saída analógica (PWM) para apagar um LED em fade.
Circuito
Um LED conectado ao pino 9 através de um resistor apropriado (aqui um de 270 Ω)
Código
int value = 0; // variavel para armazenar o valor atualizado int ledpin = 9; // LED conectado ao pino digital 9void setup() { // nao ha necessidade de setup} void loop() { for(value = 0 ; value <= 255; value+=5) // fade in (do minimo para o maximo) { analogWrite(ledpin, value); // ajuta o valor(escopo de 0 a 255) delay(30); // espera 30 milisegundos para que o efeito seja visível } for(value = 255; value >=0; value-=5) // fade out (do maximo para o minimo) { analogWrite(ledpin, value); delay(30); } }
Esse Mesmo Código pode ser modificado pra colocar na supermáquina na transição
Podemos chamar este exemplo de "Super Máquina" a famosa série de televisão dos anos 80 em que o famoso ator David Hasselhoff dirigia seu Pontiac com inteligência artificial. O carro foi turbinado com vários LEDs de vários tamanhos possíveis para reproduzir efeitos brilhantes.
Decidimos que seria interessante usar esta metáfora da "Super Máquina" com o objetivo de aprender mais sobre programação sequencial e boas técnicas de programação para as informações de E/S da placa.
Este exemplo usa 6 LEDs conectados entre os pinos 2 e 7 da placa usando resistores de 220 Ohm. O primeiro código do exemplo faz os LEDs piscarem em sequência, um a um usando somente digitalWrite(pinNum,HIGH/LOW) e delay (tempo). O segundo exemplo mostra como usar uma construção for(;;) para reproduzir a mesma coisa, mas em menos linhas de programação. O terceiro e último exemplo se concentra no efeito visual de ligar e desligar os LEDs de uma maneira mais suave.
Circuíto
Veja a aplicação implementada FINAL com 21 LED's;
Obs:Esse Video o cara usa 21 Led's e uma programação diferente do abaixo mas o resultado final não muda muito.
Mão a Obra:
Exemplo 1:
SImples e Objetivo, ...
________________________________________
reduzir o código...:
_________________________________________
/* Super Maquina 2
* -------------- * * Reduzindo a quantidade de código usando o for(;;) * * (cleft) 2005 K3, Malmo University * @author: David Cuartielles * @hardware: David Cuartielles, Aaron Hallborg */int pinArray[] = {2, 3, 4, 5, 6, 7};int count = 0;int timer = 100;void setup(){ // fazendo todas as declarações de uma vez for (count=0;count<6;count++) { pinMode(pinArray[count], OUTPUT); }}void loop() { for (count=0;count<6;count++) { digitalWrite(pinArray[count], HIGH); delay(timer); digitalWrite(pinArray[count], LOW); delay(timer); } for (count=5;count>=0;count--) { digitalWrite(pinArray[count], HIGH); delay(timer); digitalWrite(pinArray[count], LOW); delay(timer); }}
Exemplo 3:
Esse com um Efeito de transição...
_________________________________________/* Super Maquina 3 * -------------- * * Este exemplo é focado em fazer o efeito visual mais fluido * * * (cleft) 2005 K3, Malmo University * @author: David Cuartielles * @hardware: David Cuartielles, Aaron Hallborg */int pinArray[] = {2, 3, 4, 5, 6, 7};int count = 0;int timer = 30;void setup(){ for (count=0;count<6;count++) { pinMode(pinArray[count], OUTPUT); }}void loop() { for (count=0;count<5;count++) { digitalWrite(pinArray[count], HIGH); delay(timer); digitalWrite(pinArray[count + 1], HIGH); delay(timer); digitalWrite(pinArray[count], LOW); delay(timer*2); } for (count=5;count>0;count--) { digitalWrite(pinArray[count], HIGH); delay(timer); digitalWrite(pinArray[count - 1], HIGH); delay(timer); digitalWrite(pinArray[count], LOW); delay(timer*2); }}________________________________________
Esse foi um SIMPLES tutorial para demonstrar a importância de laços de repetição...ai vem carinhas me falar "por que eu vou comprar um arduino pra fazer um sequencial de led's se da pra fazer com CI's 555 e o 4017 você não sabe?" R: Sim eu sei e estará em breve na parte de ELETRÔNICA do blog, mas isso são tutoriais de arduino para aprendizado, denovo APRENDIZADO, você não vai sair vendendo sequencial de led's de 120,00 reais. São apenas para aprendizado, posteriormente os tutoriais vão começar a complicar e dai quero ver esses mesmos FODÕES aparecer ai pra falar! ________________________________________
Aqui um outro exemplo, esse com FADE, que irei explicar num próximo tutorial...
O conteúdo desta página é uma tradução para o português a partir do site original do Arduino.
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:
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.
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
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:
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.