from timerrun import TimerRun
from run import Run
from parse import Parse
from ssd1306 import SSD1306_I2C
import math
brightness = 0
run = Run()
# I2C 설정
I2C_SCL = 8
I2C_SDA = 9
i2c = I2C(0, scl=Pin(I2C_SCL), sda=Pin(I2C_SDA))
# OLED 설정
WIDTH = 128
HEIGHT = 64
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
# LDR 설정
LDR_ADC_PIN = 1
ldr = ADC(Pin(LDR_ADC_PIN))
try:
ldr.atten(ADC.ATTN_11DB) # ESP32 용
except:
pass # Raspberry Pi Pico 등에서는 생략
# 조도 계산 상수
R_FIXED = 10000
VCC = 3.3
GAMMA = 0.7
RL10 = 50000
def read_lux_from_ldr():
"""LDR ADC값을 받아 lux 근사값으로 환산."""
raw = ldr.read_u16() >> 4 # 0~4095에 맞추기
if raw <= 0:
raw = 1
voltage = raw / 4095 * VCC
try:
r_ldr = R_FIXED * (VCC / voltage - 1.0)
if r_ldr <= 0:
r_ldr = 1
except ZeroDivisionError:
r_ldr = 1
try:
lux = pow(10, (math.log10(r_ldr / RL10) / -GAMMA))
except ValueError:
lux = 0
return raw, voltage, int(lux)
class PhotoSensor:
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()
return {
"LuxUnit": self.unit,
self.name: {
"Brightness": lux,
"ADC": raw,
"Volt": round(volt, 3),
}
}
photosensor = PhotoSensor("001", "LDR")
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(str(brightness), 0, 20) # ← 여기 수정됨!
oled.show()
def sensor_read(timer=None):
global brightness
data = photosensor.read()
print(data)
p = Parse(data) # 사용자가 만든 Parser
brightness = p.value
print(f"{p.key}: {p.value}")
display_oled()
timer_sensor = TimerRun(period=5 * 1000, callback=sensor_read)
run.add(timer_sensor.run)
def main():
while True:
run.run()
if __name__ == '__main__':
main()