import timerun import TimeRun
from run import runfrom Parse import Parse
from parse import Parse
from ssd1306 import SSD1306_I2C
import math
brightness = 0
run = Run()
# ----------------
# 핀/하드웨어 설정(pinno 제거)
# ---------------
# I2C for OLED
I2C_SCL = 22
I2C_SDA = 21
I2C - I2C(0, sd=Pin(I2C_SCL), sda=Pin(I2C_SDA))
WIDTH = 128
HEIGHT = 64
oled = SSD1306_I2C(WIDTH, HEIGHT, I2C)
# Photosistor(아날로그) 입력 핀
LDR_ADC_PIN = 1
IDR = ADC(Pin(LDR_ADC_PIN))
try:
idr.atten(ADC.ATTN_11DB)
except:
pass
# ---------------------------
# LDR -> lux 근사 변환 설정값(예시)
# --------------------
# 모듈 직렬저항(보통 10k) 가정
R_FIXED = 10_000 # Ω
VCC = 3.3 # V
# LDR 특성 근사 (센서마다 다름)
GAMMA = 0.7
RL10 = 50_000
def read_lux_from_ldr():
"""LDR ADC값을 받아 lux 근사값으로 환산"""
raw = ldr.read() # 0~4095
if raw == 0:
raw = 1
voltage = raw / 4095.0 * VCC
try:
r_ldr = R_FIXED * (VCC / voltage - 1.0)
if r_ldr <= 0:
r_ldr = 1
except ZeroDivisionError:
r_ldr = 1
# LDR 곡선 근사: lux = 10^(log10(R_ldr / RL10) / -GAMMA)
try:
lux = pow(10, (math.log10(r_ldr / RL10) / -GAMMA))
except ValueError:
lux = 0
return raw, voltage, int(lux)
class PhotoSensor:
"""
read 반환 예:
{
"LuxUnit": "lx",
"LDR_001": {
"Brightness": 123, # lux (근사)
"ADC": 2048, # 원시값(선택)
"Volt": 1.65 # 전압(선택)
}
}
"""
def __init__(self, ser="001", name="LDR"):
self.name = f"{name}_{ser}"
self.unit = "lx"
def read(self):
raw, volt, lux = read_lux_from_ldr()
# "Brightness"가 dict의 첫 번째 항목이 되도록 삽입 순서 유지
payload = {
"LuxUnit": self.unit,
self.name: {
"Brightness": lux,
"ADC": raw,
"Volt": round(volt, 3),
}
}
return payload
# ------------
# 포토센서 인스턴스
PhotoSensor = PhotoSensor(ser="001", name="LDR")
# ----------------
# OLED 표시
# ---------------
def display_oled():
oled.fill(0)
try:
from hangul import draw_hangul
draw_hangul(oled, '조도', 0,0)
except:
oled.text('LUX', 0, 0)
oled.text('{} lx'.format(brightness), 0, 20)
oled.show()
# ---------
# 타이머 콜백 : 센서 읽기 - > 파싱 - > OLED 표시
# ----------
def sensor_read():
global brightness
data = PhotoSensor.read()
print(data)
p = Parse(data) # p.key / p.value 사용 가정
brightness = p.value
print(f'{p.key}: {p.value}')
display_oled()
# 타이머 등록 (5초 주기)
timer_sensor = TimerRun(period=5*1000, callback=sensor_read)
run.add(timer_sensor.run)
def main():
while True:
run.run()
if __name__=='__main__':
main()