2017 멀티캠퍼스/Raspberry Pi

#11 라즈베리파이 조도센서

꿈꾸는어린이 2018. 1. 30. 22:22

//

일시 : 2018.01.11

내용 : I2C light (조도센서)

//

I2C light (조도 센서)

  • 주변의 빛을 감지하는 센서

  • 조도 측정 범위는 0 ~ 65535 룩스(lx)

  • 내부에 16비트 A/D(아날로그 디지털 변환기)가 내장 -> 디지털 출력

  • 아날로그는 전압값(0~3.3V) -> 디지털 값(0~65535) Low, High

  • 디지털 출력 방식은 I2C 표준

  • 스마트폰의 자동 밝기 조절 모드

    이 기능을 활용한 앱 Pocketmode (주변의 밝기를 감지해 벨소리 조절. 예를 들어 스마트폰이 주머니나 가방같은 어두운 곳에 있을 때는 벨소리를 크게)



SMBus

  • System Management Bus

  • 마더보드에 있는 저속도 장치들과 통신하는데 사용하는 간단한 I2C 버스 (마더보드에서 전원부와 CPU간 시스템 통신을 위해 사용)

  • SMBus 장치는 제조자 정보를 제공, 시스템에 장비 모델과 부품번호를 알려줌, 여러가지 오류 보고 및 이벤트에 대한 상태 저장 등

  • I2C에다 Intel이 규격을 조금 변경하여 packet 형식으로 변경(I2C기반으로 확장된 것)

  • smbus 설치 $sudo apt-get install python-smbus

참고 블로그


  #!/usr/bin/python
import smbus2 as smbus
import time

# Define some constants from the datasheet

DEVICE     = 0x23 # Default device I2C address   슬레이브 주소

POWER_DOWN = 0x00 # No active state
POWER_ON   = 0x01 # Power on
RESET     = 0x07 # Reset data register value

# Start measurement at 4lx resolution. Time typically 16ms.
CONTINUOUS_LOW_RES_MODE = 0x13
# Start measurement at 1lx resolution. Time typically 120ms
CONTINUOUS_HIGH_RES_MODE_1 = 0x10
# Start measurement at 0.5lx resolution. Time typically 120ms
CONTINUOUS_HIGH_RES_MODE_2 = 0x11
# Start measurement at 1lx resolution. Time typically 120ms
# Device is automatically set to Power Down after measurement.
ONE_TIME_HIGH_RES_MODE_1 = 0x20
# Start measurement at 0.5lx resolution. Time typically 120ms
# Device is automatically set to Power Down after measurement.
ONE_TIME_HIGH_RES_MODE_2 = 0x21
# Start measurement at 1lx resolution. Time typically 120ms
# Device is automatically set to Power Down after measurement.
ONE_TIME_LOW_RES_MODE = 0x23

bus = smbus.SMBus(1)  # Rev 2 Pi uses 1 , 채널번호
def convertToNumber(data):
 # Simple function to convert 2 bytes of data
 # into a decimal number
 return ((data[1] + (256 * data[0])) / 1.2)
def readLight(addr=DEVICE):
 data = bus.read_i2c_block_data(addr, ONE_TIME_HIGH_RES_MODE_1, 2)  #마지막인자는 바이트수
 return convertToNumber(data)

def main():
 while True:
   print "Light Level : " + str(readLight()) + " lx"
   time.sleep(0.5)
if __name__=="__main__":
  main()