Sensor de luminosidade + LCD + LED

Fala galera!

Hoje vou demonstrar um sensor bem interessante para usos gerais e infinitos! O sensor de luminosidade ou photo resistor é capaz de mensurar a quantidade de luz que está sendo direcionado a ele por meio dos filamentos que se encontram em sua parte superior, como na imagem abaixo (em inglês)
light_cdsconstruction

O funcionamento do sensor é simples:

Acionaremos o sensor em estado HIGH , e fica aguardando ele ficar LOW . esse tempo de espera entre ficar HIGH e LOW é o que iremos utilizar para mensurar a luminosidade já que o Raspberry não possui leituras analógicas.

Para isso funcionar realmente precisamos de um capacitor de 1uF para fazer o ciclo de 1ms entre as leituras, lembrando sempre da posição que os pinos devem ser (maior positivo , menor negativo), no meu caso eu fiz a solda de dois fios para poder trabalhar com o capacitor fora da protoboard com espaço para movimentação.
capacitor

Utilizaremos para esse post o LCD que fizemos funcionar no post anterior para mostrar o nível de luminosidade, além de um LED que irá acender proporcionalmente à falta de luz, porém  o LCD não é obrigatório podendo ser tirado do código.

snapshot4

DSC_0057

Primeiramente iremos fazer a montagem do sensor na protobard da seguinte forma:

  1.  conexão do negativo do Raspberry (GPIO6)
  2. o capacitor conectando o negativo em um espaço da protobard
  3. o GPIO7 (4) logo acima da conexão do capacitor
  4. A parte de conexão menor do sensor conectada logo acima
    ___________________________
  5. conexão do GPIO1 (3.3v) na parte de conexão maior do sensor

Caso tenha feito a conexão corretamente o seu protoboard ficará parecido com isso:

SEM_LED

 

Agora no código inicialmente iremos executá-lo para efetuar a medição da luminosidade “Default” do seu ambiente e ai sim iremos configurar o script.

usaremos o seguinte código com base na imagem dos GPIO abaixo:

Raspberry-Pi-GPIO-Layout-Revision-2

#!/usr/bin/env python
 
import RPi.GPIO as GPIO, time, os     
GPIO.setwarnings(False) 

GPIO.setmode(GPIO.BOARD)

while (True):
        ciclos = 0
        GPIO.setup(7, GPIO.OUT)
        GPIO.output(7, GPIO.LOW)
        time.sleep(0.1) 
        GPIO.setup(7, GPIO.IN)
        #Tempo do capacitor de  1ms
        while (GPIO.input(7) == GPIO.LOW):
                ciclos += 1	
  
        print ciclos

 

O código acima irá enviar para a tela o valor de ciclos atuais, sendo maior mais escuro e menor mais claro.
Com isso poderemos identificar qual é o nosso valor padrão de luminosidade para que o nosso sistema não se perca com uma luminosidade diferente da minha no caso.

Feito esse ajuste e captura de um valor médio de luminosidade padrão, iremos colocar isso em nosso aplicativo.

Iremos fazer a conexão com o LED, nesse caso utilizei uma outra protobard menor que eu tinha para separar a conexão, porém pode ser feito na mesma sem problema nenhum.
LEDA conexão é a mesma que utilizamos normalmente, o negativo com o resistor e uma conexão de GPIO que colocaremos na GPIO8 (14).
Um teste que eu sempre faço para testar se a conexão do LED está OK é ao invés de ligar o GPIO eu conecto direto no 3.3V, se ligar é porque a conexão está funcional

Faremos o código com o LCD abaixo, porém o script do LCD está como pinagem BCM ao invés do BOARD que estamos acostumados, relembrando que  BOARD é a numeração física do pino GPIO, que nunca muda indiferente da versão do Raspberry  e a BCM é a numeração representativa, que pode variar de versão do Raspberry, caso não tenha ou não queria utilizar o LCD somente exclua as menções do LCD

#!/usr/bin/env python
 
import RPi.GPIO as GPIO, time, os     
GPIO.setwarnings(False) 
#LCD INICIO
from lcd import raspibrLCD;
raspi = raspibrLCD();
raspi.inicializar();
#LCD FIM
GPIO.setmode(GPIO.BCM)
GPIO.setup(14,GPIO.OUT)	
GPIO.output(14,GPIO.LOW);
luzPadrao = 5000;
p = GPIO.PWM(14,100);
p.start(0)
while (True):
        ciclos = 0
        GPIO.setup(4, GPIO.OUT)
        GPIO.output(4, GPIO.LOW)
        time.sleep(0.1)
 
        GPIO.setup(4, GPIO.IN)
        #Tempo do capacitor de  1ms
        while (GPIO.input(4) == GPIO.LOW):
                ciclos += 1	
  if(ciclos <= luzPadrao):
    cycle = 0.0 ;
  else:
    cycle = (100*ciclos)/22000;
  if(cycle > 100):
    cycle = 100 ;

  p.ChangeDutyCycle(cycle);
  #Daqui pra baixo são informacoes do LCD
  if(cycle >= 0 and cycle <= 30):
    strLuz = "Luz ALTA";
  if(cycle > 30 and cycle < 60):
    strLuz = "Luz Media";
  if(cycle > 60 and cycle < 80):
    strLuz = "Luz Baixa";
  if(cycle > 80 ):
    strLuz = "SEM LUZ!!";
  raspi.escrever(strLuz,1);

Caso a conexão seja feita corretamente o resultado será parecido com esse:

espero que tenham gostado e até a próxima!