LDR e Interrupções com Led no Arduíno UNO

Olá, como estão? A princípio iremos desenvolver um projeto com LDR e interrupções, para estar realizando esse objetivo usaremos o KIT básico com Arduíno da WJ Componentes.

Componentes Utilizados no Projeto com LDR e Interrupções


OU

LDR (Resistor Dependente de Luz)


Antes de mais nada iremos precisar saber como que funciona o LDR. Ele vem do inglês Light Dependent Resistor, ou seja, Resistor Dependente de Luz também é conhecido como fotoresistor. Em outras palavras é um tipo de resistor que varia sua resistência a partir da luz. Dessa forma quanto mais a luz, maior será sua resistência, porém,  quanto menos luz, menor será sua resistência. Apesar disso o LDR não possui polaridade, em outras palavras, não temos um “lado” correto para conectar na protoboard.

Sensor Fotoresistor LDR de 5mm - WJ Componentes

Interrupções com Arduíno


Entretanto, temos que saber como utilizar e como funcionam as interrupções. Contudo as interrupções são um sinal enviado periodicamente por um dispositivo, que interrompe a execução das tarefas da CPU por um tempo. Assim permitindo que execute a instrução enviada pelo equipamento. Em seguida o código retorna para sua rotina convencional. Além disso para usar a interrupção precisamos utilizar os pinos digitais com interrupção, segue uma tabela abaixo dos pinos de alguns microcontroladores:

PLACASPINOS DIGITAIS COM INTERRUPÇÕES
Arduíno UNO, Nano e Mini2 e 3
Arduíno UNO WiFi Rev.2Todos os Pinos Digitais
Arduíno Mega, Mega2560 e MegaADK2, 3, 18, 19, 20 e 21
Arduíno Micro e Leonardo0, 1, 2, 3, 7
Arduíno ZeroTodos os Pinos Digitais, exceto o pino 7
Arduíno DueTodos os Pinos Digitais
Tabela 1 – Pinos Digitais com Interrupções

Sintaxe:

attachInterrupt(digitalPinToInterrupt(pino), ISR, modo);

Parâmetros:

  • pino – Declaramos o pino de interrupção que utilizamos em nosso projeto.
  • ISR – Função a ser chamada quando acontecer interrupção ocorrer.
  • modo – Tipo de sinal para que ocorra a interrupção, para isso temos 5 tipos de modos, sendo eles:
    • LOW – Sempre que o pino for LOW,
    • CHANGE – Sempre que o pino mudar,
    • RESING – Sempre que o pino for de LOW para HIGH,
    • FALLING – Sempre que o pino for de HIGH para LOW.
    • HIGH – Sempre que o pino for HIGH. (Somente Arduíno Due, Zero e MKR1000 suportam).

Exemplo:

//Definições --------------------------------------------------------------------------------------
#define led 2                                                   // Utilizaremos o pino de interrupção
                                                                // para utilizar o led,
//Variáveis Globais -------------------------------------------------------------------------------
bool est = LOW;                                                 // Utilizaremos uma variável para que
                                                                // seja possível armazenar o estado
//Funções Auxiliares ------------------------------------------------------------------------------
void pisca();                                                   // Como iremos utilizar uma função 
                                                                // auxiliar temos que declarar ela
//Setup -------------------------------------------------------------------------------------------
void setup() {
    pinMode(led, OUTPUT);                                       // Configuramos o pino como output
    attachInterrupt(digitalPinToInterrupt(led), pisca, CHANGE); // Definimos modo para acionar a 
}                                                               // interrupção do led, quando ocorrer
                                                                // chamamos a função pisca
//Loop --------------------------------------------------------------------------------------------
void loop() {
    digitalWrite(led, est);                                     // Mudamos o estado do led
}
 
//Pisca -------------------------------------------------------------------------------------------
void pisca(){                                                 
    est = !est;                                                 // Invertemos a variável
}

Funcionamento do Projeto com LDR e Interrupções


Como foi comentado anteriormente hoje iremos desenvolver um projeto com LDR e Interrupções. Entretanto podemos estar controlando o funcionamento do LED a partir de um botão com as funções de:

  • Ligar o LED,
  • Controlar o acionamento do LED a partir da luminosidade do ambiente,
  • Realizar um fade com o LED a partir da luminosidade do ambiente, ou seja, quanto mais escuro mais forte o led, quanto mais claro mais fraco o LED,
  • Desligar o LED.

Todas essas funções irão poder ser acessadas a partir de um único botão assim economizando dinheiro, espaço e melhorando o design do seu projeto.

Montagem do Projeto com LDR e Interrupções


Logo após compra dos componentes na WJ Componentes, vamos à montagem! Em seguida conectamos o LED na protoboard com o resistor que ligamos no catodo do LED, e para finalizar o LED conectamos o anodo ao pino 3 do Arduíno. Logo após conectamos um botão na protoboard e ligamos ao pino 2 do Arduíno, dando seguimento conectamos o LDR com um resistor de 10K Ohms no 5v e um jumper conectando ao pino A5 do Arduíno, em sequência ligamos o GND no LDR.

Contudo segue abaixo uma imagem que demonstra a montagem do circuito.

Pinout LED Código Morse
Pinout LED
Montagem do Circuito Eletrônico na Protoboard - Led com Fade e LDR
Figura 2 – Montagem do Circuito Eletrônico na Protoboard

Diagrama Esquemático do Projeto com LDR e Interrupções


Diagrama do Circuito Eletrico - Led com Fade e LDR
Figura 3 – Diagrama do Circuito Eletrico

Código-fonte do Projeto com LDR e Interrupções


Em seguida terá o código completo do projeto.

//Definições -----------------------------------------------------------------------------------------
#define btn 2                                                          // Definição do pino do botão
#define led 3                                                          // Definição do pino do LED
#define ldr A5                                                         // Definição do pino do LDR
	 
//Variáveis Globais ----------------------------------------------------------------------------------
byte cont = 0;                                                         // Variável de controle
	 
//Funções Auxiliares ---------------------------------------------------------------------------------
void function();                                                       // Seleciona a função
	 
//Setup ----------------------------------------------------------------------------------------------
void setup() { 
    Serial.begin(9600);                                                // Inicializar a Serial
    pinMode(btn, INPUT_PULLUP);                                        // Configura como INPUT PULL UP
    pinMode(led, OUTPUT);                                              // Configura como OUTPUT
    pinMode(ldr, INPUT);                                               // Configura como INPUT
    attachInterrupt(digitalPinToInterrupt(btn), function, FALLING);    // Configura interrupção
}
	 
//Loop -----------------------------------------------------------------------------------------------
void loop() {
    if (cont == 1) {                                                   // Verifica se cont = 1
        digitalWrite(led, HIGH);                                       // Liga o LED
    }
    else if (cont == 2) {                                              // Se não Verifica se cont = 2
        if(analogRead(ldr) > 500){                                     // Se a luminosidade > 500
            digitalWrite(led, HIGH);                                   // Liga o LED
        }
        else {                                                         // Se não
            digitalWrite(led, LOW);                                    // Desliga o LED
        }
    }
    else if (cont == 3) {                                              // Se não verifica se cont = 3
        analogWrite(led, map(analogRead(ldr), 0, 1024, 0, 255));       // Remapeia resistência ao LED
    }
    else {                                                             // Se não 
        digitalWrite(led, LOW);                                        // Desliga o LED
    }
}
 
//Funções --------------------------------------------------------------------------------------------
void function() {
    cont++;                                                            // Incrementa +1 a cont
    switch(cont){                                                      // Realiza um switch de cont
        case 1:                                                        // Caso cont = 1
            Serial.println(F("[1] Ligado"));                           // Imprime na Serial
            break;                                                     // Sai do case
        case 2:                                                        // Caso cont = 2
            Serial.println(F("[2] Ligado com Baixa Iluminação"));      // Imprime na Serial
            break;                                                     // Sai do case
        case 3:                                                        // Caso cont = 3
            Serial.println(F("[3] Fade com Iluminação"));              // Imprime na Serial
            break;                                                     // Sai do case
        case 4:                                                        // Caso cont = 4
            Serial.println(F("[4] Desligado"));                        // Imprime na Serial
            cont = 0;                                                  // Atribuímos 0 a cont 
            break;                                                     // Sai do case
    }
}

Vamos dar uma olhada mais de perto no código:

Definições de Pinos

Primeiramente temos que estar definindo dos pinos que utilizamos em nosso projeto.

//Definições -----------------------------------------------------------------------------------------
#define btn 2                                                          // Definição do pino do botão
#define led 3                                                          // Definição do pino do LED
#define ldr A5                                                         // Definição do pino do LDR

Variáveis Globais

Em seguida declaramos uma variável global, sendo ela cont que é responsável por armazenar o valor da função atual.

//Variáveis Globais ----------------------------------------------------------------------------------
byte cont = 0;                                                         // Variável de controle

Funções Auxiliares

Do mesmo modo também declaramos uma função auxiliar chamada function, onde essa função é responsável por incrementar +1 a cont e assim mudar a função que será executada na função loop.

//Funções Auxiliares ---------------------------------------------------------------------------------
void function();                                                       // Seleciona a função

Funções Setup

Em seguida iremos para a função setup, onde estaremos realizando a inicialização da Serial com velocidade de 9600, configuramos o pino 2 como INPUT_PULLUP, pino 3 como OUTPUT e pino A5 como INPUT.

//Setup ----------------------------------------------------------------------------------------------
void setup() { 
    Serial.begin(9600);                                                // Inicializar a Serial
    pinMode(btn, INPUT_PULLUP);                                        // Configura como INPUT PULL UP
    pinMode(led, OUTPUT);                                              // Configura como OUTPUT
    pinMode(ldr, INPUT);                                               // Configura como INPUT
    attachInterrupt(digitalPinToInterrupt(btn), function, FALLING);    // Configura interrupção
}

Funções Loop

Logo após vamos para a função loop, onde verificamos se cont é igual a 1, 2, 3 ou nenhuma das anteriores, caso seja alguma estaremos realizando a função correspondente a ela. Exemplo caso seja 1 ligaremos o LED, caso seja 2 realizamos o controle do LED a partir da luminosidade, caso seja  3 executamos um fade com o LED com base na luminosidade, ou seja, ele ficará mais forte quanto menor for a iluminação e mais fraco quanto maior for a iluminação e caso não seja nenhuma das anteriores desligamos o LED.

//Loop -----------------------------------------------------------------------------------------------
void loop() {
    if (cont == 1) {                                                   // Verifica se cont = 1
        digitalWrite(led, HIGH);                                       // Liga o LED
    }
    else if (cont == 2) {                                              // Se não Verifica se cont = 2
        if(analogRead(ldr) > 500){                                     // Se a luminosidade > 500
            digitalWrite(led, HIGH);                                   // Liga o LED
        }
        else {                                                         // Se não
            digitalWrite(led, LOW);                                    // Desliga o LED
        }
    }
    else if (cont == 3) {                                              // Se não verifica se cont = 3
        analogWrite(led, map(analogRead(ldr), 0, 1024, 0, 255));       // Remapeia resistência ao LED
    }
    else {                                                             // Se não 
        digitalWrite(led, LOW);                                        // Desliga o LED
    }
}

Função function

Na sequência passamos para a última função chamada function, onde incrementamos +1 em cont e realizamos um switch verificando case, se case é igual 1, 2, 3 ou 4. Caso seja igual a alguma, ele irá imprimir na serial o valor e a função, porém, caso seja igual a 4 atribuímos 0 a cont e imprimimos na serial.

//Funções --------------------------------------------------------------------------------------------
void function() {
    cont++;                                                            // Incrementa +1 a cont
    switch(cont){                                                      // Realiza um switch de cont
        case 1:                                                        // Caso cont = 1
            Serial.println(F("[1] Ligado"));                           // Imprime na Serial
            break;                                                     // Sai do case
        case 2:                                                        // Caso cont = 2
            Serial.println(F("[2] Ligado com Baixa Iluminação"));      // Imprime na Serial
            break;                                                     // Sai do case
        case 3:                                                        // Caso cont = 3
            Serial.println(F("[3] Fade com Iluminação"));              // Imprime na Serial
            break;                                                     // Sai do case
        case 4:                                                        // Caso cont = 4
            Serial.println(F("[4] Desligado"));                        // Imprime na Serial
            cont = 0;                                                  // Atribuímos 0 a cont 
            break;                                                     // Sai do case
    }
}

Assim finalizamos todo o código com a explicação sobre o projeto com Arduíno UNO.

Resultado do Projeto com LDR e Interrupções


Por fim esse foi o resultado obtido com o projeto.

Agradecemos sua Presença


Por fim, espero que tenham gostado e aprendido. Então compartilhe com seus colegas e deixe um comentário de qual projeto deveria ser o próximo aqui no Blog da WJ Componentes!!
Enfim estarei deixando o arquivo Arduíno e Fritzing, link dos posts anteriores referentes ao projeto e software e sites utilizados.
Fique à vontade para tirar suas dúvidas nos comentários.

Software e Sites Utilizados

Post Relacionados

Posts mais Recentes

Julio Cesar Bonow Manoel

Julio Cesar Bonow Manoel

Cursando Engenharia da Computação pelo Centro Universitário Facens e atua no desenvolvimento de projetos na WJ Componentes. Participante da equipe de robótica Omegabotz.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *