import uasyncio as asyncio
from machine import Pin, PWM, ADC, I2C
import ssd1306
MAX_THRESHOLD = 30000
light_level = 0
threshold = 0
brightness = 0
lamp_status = "OFF"
redled = PWM(Pin(12), freq=1000)
greenled = PWM(Pin(14), freq=1000)
blueled = PWM(Pin(27), freq=1000)
pot = ADC(Pin(4, Pin.IN))
LDR = ADC(Pin(26, Pin.IN))
pot.atten(ADC.ATTN_11DB)
LDR.atten(ADC.ATTN_11DB)
i2c = I2C(scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
def set_rgb_brightness(percentage):
duty_value = int((percentage / 100) * 65535)
redled.duty_u16(duty_value)
greenled.duty_u16(duty_value)
blueled.duty_u16(duty_value)
async def light_control_loop():
global light_level, threshold, brightness, lamp_status
while True:
light_level = int((LDR.read() / 4095) * MAX_THRESHOLD)
threshold = int((pot.read() / 4095) * MAX_THRESHOLD)
if light_level >= threshold:
brightness = 0
lamp_status = "OFF"
else:
darkness_difference = threshold - light_level
brightness = (darkness_difference / threshold) * 100
if brightness <= 0.8:
brightness = 0
if 33.3 >= brightness >= 33.0:
brightness = 33.3
if brightness > 99.2:
brightness = 100
if brightness == 0:
lamp_status = "OFF"
elif brightness == 100:
lamp_status = "FULL"
else:
lamp_status = "DIMMED"
set_rgb_brightness(brightness)
await asyncio.sleep(0.02)
async def oled_dashboard_task():
while True:
oled.fill(0)
oled.text("Light: {}".format(light_level), 0, 24)
oled.text("Threshold:{}".format(threshold), 0, 34)
oled.text("Bright: {:.1f}%".format(brightness), 0, 44)
oled.text("Lamp Stat:{}".format(lamp_status), 0, 54)
oled.show()
await asyncio.sleep(0.1)
async def main():
asyncio.create_task(light_control_loop())
asyncio.create_task(oled_dashboard_task())
while True:
await asyncio.sleep(1)
asyncio.run(main())