Objetivo: Controlar a intensidade do brilho do LED externo, usando porta em modo analógico.
Como base, vamos usar o capítulo 5 do SainSmart Uno Starter Kits Manual:
Download do site SainSmart.com
Em caso de problemas para acessar o documento, tente:
download Tutorial
Além do exemplo do manual, vamos:
- Simular uma porta analógica, ligando e desligando rapidamente uma porta digital
- Fazer uma nova versão do painel da Supermáquina
Vídeo com a montagem do projeto e as alterações:
Código da Simulação de Porta Analógica:
https://docs.google.com/file/d/0B2SYabtePBegQzV2M3g2bjJaNmc/edit
/*
Simulando PWM
simulando PWM com digitalWrite
autor: @vintesegundos
*/
int led1=9; // LED 1 = pino 9
int intensidadeMinima=20; // Faixa da Intensidade de 20 a 200
int intensidadeMaxima=200;
int passo = 1;// Qtde. de Brilho que muda a cada passo
int ciclo = 20; // fator de ajuste para que a piscar do LED nao seja percebido
int intensidade = intensidadeMinima; // Intensidade inicial LEDs = Intensidade Minima
// a rotina de setup() roda uma vez, ao se apertar o botão de RESET
void setup() {
pinMode(led1, OUTPUT); // Pino 9 = Saida
}
// a rotina loop roda repetida e eternamente
void loop() {
// Liga o led por uma parte do periodo
digitalWrite(led1, HIGH);
delay (intensidade/ciclo);
// Desliga o led pelo resto do periodo
digitalWrite(led1, LOW);
delay ((intensidadeMaxima-intensidade)/ciclo);
// aumenta (ou diminui) a intensidade para o proximo ciclo
intensidade = intensidade + passo;
// se chegou no limite inferior ou superior, altera a direcao
if (intensidade == intensidadeMaxima || intensidade == intensidadeMinima) {
passo = -passo;
}
}
/* fim do codigo */
Código da Comparação do PWM em portas em modo digital e modo analógico:
https://docs.google.com/file/d/0B2SYabtePBegT1RnQXd2QmlIWGc/edit
/*
Simulando PWM
simulando PWM com digitalWrite e comparando com analogWrite
autor: @vintesegundos
*/
int led1=9; // LED 1 = pino 9
int intensidadeMinima=20; // Faixa da Intensidade de 20 a 200
int intensidadeMaxima=200; // Fim da faixa
int passo = 1; // Qtde. de Brilho que muda a cada passo
int ciclo = 20; // fator de ajuste para que a piscar do LED nao seja percebido
int intensidade = intensidadeMinima; // Intensidade inicial LEDs = Intensidade Minima
// a rotina de setup() roda uma vez, ao se apertar o botão de RESET
void setup() {
pinMode(led1, OUTPUT); // Pino 9 = Saida
}
// a rotina loop roda repetida e eternamente
void loop() {
// Liga o led por uma parte do periodo
digitalWrite(led1, HIGH);
delay (intensidade/ciclo);
// Desliga o led pelo resto do periodo
digitalWrite(led1, LOW);
delay ((intensidadeMaxima-intensidade)/ciclo);
// aumenta (ou diminui) a intensidade para o proximo ciclo
intensidade = intensidade + passo;
// se chegou no limite inferior ou superior, altera a direcao
if (intensidade == intensidadeMaxima || intensidade == intensidadeMinima) {
passo = -passo;
}
}
/* fim do codigo */
Código da Supermáquina (Versão 3):
https://docs.google.com/file/d/0B2SYabtePBegZjItNEdyQm5NX0U/edit
/*
Supermáquina 3
Versão 3 do painel imitando a supermáquina
autor: @vintesegundos
*/
int led1=9; // 4 portas analógicas 9,10,11 e 3
int led2=10;
int led3=11;
int led4=3;
int intensidadeMinima=0; // Faixa de Brilho: de 0 a 200
int intensidadeMaxima=200;
int intensidadeMaximaPonta=250;
int passo = 10; // Qtde. de Brilho que muda a cada passo
int ledApagando = led1; // Estado inicial
int ledAcendendo = led2;
int intensidadeApagando = intensidadeMaxima;
int intensidadeAcendendo = intensidadeMinima;
int sentido = 0;
// a rotina de setup() roda uma vez, ao se apertar o botão de RESET
void setup() {
pinMode(led1, OUTPUT); // Pino 9 = Saida
pinMode(led2, OUTPUT); // Pino 10 = Saida
pinMode(led3, OUTPUT); // Pino 11 = Saida
pinMode(led4, OUTPUT); // Pino 3 = Saida
}
// a rotina loop roda repetida e eternamente
void loop() {
// assinala o valor da intensidade ao LED
analogWrite(ledApagando, intensidadeApagando);
analogWrite(ledAcendendo, intensidadeAcendendo);
// atualiza os valores para o próximo passo
intensidadeApagando = intensidadeApagando - passo;
intensidadeAcendendo = intensidadeAcendendo + passo;
// Verifica se eh hora de mudar de par de LEDs acendendo e apagando
if (intensidadeApagando == intensidadeMinima) {
intensidadeApagando=intensidadeMaxima;
intensidadeAcendendo=intensidadeMinima;
switch (ledApagando){
case 9:
ledApagando=led2;
ledAcendendo=led3;
sentido=0;
break;
case 10:
if (sentido==0){
ledApagando=led3;
ledAcendendo=led4;
}
else {
ledApagando=led1;
ledAcendendo=led2;
delay(150);
}
break;
case 11:
if (sentido==0){
ledApagando=led4;
ledAcendendo=led3;
delay(150);
}
else {
ledApagando=led2;
ledAcendendo=led1;
}
break;
case 3:
ledApagando=led3;
ledAcendendo=led2;
sentido=1;
break;
}
}
// espera 12 ms
delay(12);
}
/* fim do codigo */
Nenhum comentário:
Postar um comentário