import network
import time
from machine import Pin, ADC
import ujson
from umqtt.simple import MQTTClient
# MQTT Server Parameters
MQTT_CLIENT_ID = "Test_uhuy"
MQTT_BROKER = "broker.emqx.io"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC_SENSOR = "/UNI183/MuhamadHusniNasauha/data_sensor"
MQTT_TOPIC_LED = "/UNI183/MuhamadHusniNasauha/aktuasi_led"
# Setup LDR and LED
ldr = ADC(Pin(35))
ldr.atten(ADC.ATTN_11DB)
led = Pin(15, Pin.OUT)
light_threshold = 1500
# WIFI Connection
print("Connecting to WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Connected!")
# MQTT Server connection
print("Connecting to MQTT server... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.connect()
print("Connected!")
# Callback function for incoming MQTT messages
def mqtt_callback(topic, msg):
if topic.decode() == MQTT_TOPIC_LED:
command = msg.decode()
if command == "ON":
led.value(1)
print("LED is turned ON via MQTT")
elif command == "OFF":
led.value(0)
print("LED is turned OFF via MQTT")
# Subscribe to LED control topic
client.set_callback(mqtt_callback)
client.subscribe(MQTT_TOPIC_LED, qos=1)
# Variables to track changes
prev_light_level = -1
prev_led_status = None
last_publish_time = time.time()
def publish_sensor_data():
global prev_light_level
light_level = ldr.read()
if light_level != prev_light_level:
message = ujson.dumps({"light_level": light_level})
print(f"Publishing light data: {message}")
client.publish(MQTT_TOPIC_SENSOR, message)
prev_light_level = light_level
def control_led_based_on_light():
global prev_led_status
light_level = ldr.read()
led_status = "ON" if light_level < light_threshold else "OFF"
if led_status != prev_led_status:
print(f"Publishing LED status: {led_status}")
client.publish(MQTT_TOPIC_LED, led_status)
prev_led_status = led_status
while True:
try:
client.check_msg() # Handle incoming messages
current_time = time.time()
# Publish sensor data every 5 seconds
if current_time - last_publish_time >= 5:
publish_sensor_data()
control_led_based_on_light()
last_publish_time = current_time
time.sleep(0.1) # Short delay to prevent busy looping
except Exception as e:
print(f"Error: {e}")
time.sleep(5)