Controlando o brilho da lâmpada com um sensor de luz

Vamos ensinar o que é um LDR, como ele funciona e vamos utilizá-lo para controlar o brilho de uma lâmpada.

!Informações importantes

Todas as coisas simples, com um toque adicional, podem ser fantásticas. Acrescentando um LDR podemos fazer com que a luz de uma lâmpada responda às necessidades do ambiente. Quando está mais escuro precisamos de mais luz, e quando está mais claro, menos luz.

O LDR, Light Dependent Resistor em inglês, é um componente eletrônico passivo do tipo resistor variável. Mais especificamente, é um resistor cuja resistência varia conforme a intensidade da luz que incide sobre ele.

!Identificando os componentes

LDR

Resistor (esquerda) e LDR (direita)

!Identificando os componentes

Para montar o circuito, siga atentamente os passos a seguir:

  • Conecte um dos terminais do LDR no pino 5V
  • Conecte o outro terminal do LDR no pino A3
  • Conecte um dos terminais do resistor no pino A3
  • Conecte o outro terminal do resistor no pino GND

Ao final da montagem estará assim:

Base

Aspecto Final (clique para ampliar)

!Componentes de código

Vamos utilizar uma função especifica que recebe o valor lido do sensor e retorna um valor relativo ao brilho para a situação.

int intensity(int sensorValue)
{
  float intensityReturn;
  float bright = (sensorValue / 4);
  intensityReturn = 255 - bright;
  Serial.print(intensityReturn);
  return intensityReturn;
}

!Executando no Arduino

int lamp = 3;
int ldr = A3;
int button = A0;
int light;

int intensity(int sensorValue)
{
  float intensityReturn;
  float bright = (sensorValue / 4);
  intensityReturn = 255 - bright;
  Serial.print(intensityReturn);
  return intensityReturn;
}

int getButtonState()
{
  int value = analogRead(button);
  if (value < 69) {
    return 1;
  } else if (value >= 69 && value <= 230) {
    return 2;
  } else if (value >= 231 && value <= 407) {
    return 3;
  } else if (value >= 408 && value <= 630) {
    return 4;
  } else if (value >= 631 && value <= 896) {
    return 5;
  } else {
    return 0;
  }
}

int readButton()
{
  int state = getButtonState();
  int count = 1;

  while (count < 5) {
    delay(5);
    int newState = getButtonState();
    if (newState == state) {
      count++;
    } else {
      count = 1;
    }
    state = newState;
  }

  return state;
}

void setup()
{
  pinMode(lamp, OUTPUT);
  analogWrite(lamp, 0);
}

void loop()
{
  // --- Estado: lampada ligada, botao solto
  // Lampada ligada enquanto botao nao esta apertado
  int btn;
  while ((btn = readButton()) != 5) {
    int sensorValue = analogRead(ldr);
    light = intensity(sensorValue);
    analogWrite(lamp, light);
  }

  // --- Estado: lampada desligada, botao apertado
  // Desliga a lampada
  analogWrite(lamp, 0);

  // Espera soltar o botao
  while (readButton() != 0);

  // --- Estado: lampada desligada, botao solto
  // Espera apertar o botao
  while (readButton() != 5);

  // --- Estado: lampada ligada, botao apertado
  // Espera soltar o botao
  while (readButton() != 0);
}

!Sua Vez!

Modifique o código acima para que o funcionamento seja indicado pelos LEDs

Resposta

int lamp = 3;
int ldr = A3;
int button = A0;
int light;
int ledAmarelo = A1;
int ledVerde = A2;

int intensity(int sensorValue)
{
  float intensityReturn;
  float bright = (sensorValue / 4);
  intensityReturn = 255 - bright;
  Serial.print(intensityReturn);
  return intensityReturn;
}

int getButtonState()
{
  int value = analogRead(button);
  if (value < 69) {
    return 1;
  } else if (value >= 69 && value <= 230) {
    return 2;
  } else if (value >= 231 && value <= 407) {
    return 3;
  } else if (value >= 408 && value <= 630) {
    return 4;
  } else if (value >= 631 && value <= 896) {
    return 5;
  } else {
    return 0;
  }
}

int readButton()
{
  int state = getButtonState();
  int count = 1;

  while (count < 5) {
    delay(5);
    int newState = getButtonState();
    if (newState == state) {
      count++;
    } else {
      count = 1;
    }
    state = newState;
  }

  return state;
}

void setup()
{
  pinMode(lamp, OUTPUT);
  pinMode(ledAmarelo, OUTPUT);
  pinMode(ledVerde, OUTPUT);
  analogWrite(lamp, 0);
}

void loop()
{
  // --- Estado: lampada ligada, botao solto
  // Lampada ligada enquanto botao nao esta apertado
  int btn;
  while ((btn = readButton()) != 5) {
    int sensorValue = analogRead(ldr);
    light = intensity(sensorValue);
    analogWrite(lamp, light);
    digitalWrite(ledVerde, HIGH);
  }

  // --- Estado: lampada desligada, botao apertado
  // Desliga a lampada
  analogWrite(lamp, 0);

  // Espera soltar o botao
  while (readButton() != 0);
  digitalWrite(ledVerde, LOW);
  digitalWrite(ledAmarelo, HIGH);

  // --- Estado: lampada desligada, botao solto
  // Espera apertar o botao
  while (readButton() != 5);

  // --- Estado: lampada ligada, botao apertado
  // Espera soltar o botao
  while (readButton() != 0);
  digitalWrite(ledAmarelo, LOW);
}