import network
import time
from machine import Pin, ADC
import ujson
from umqtt.simple import MQTTClient
# MQTT Server Parameters
MQTT_CLIENT_ID = "demoErick"
MQTT_BROKER = "broker.emqx.io"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC_SENSOR = "pings/to" # Topic untuk data sensor
MQTT_TOPIC_LED = "pings/tu" # Topic untuk kontrol LED
# LDR sensor pin setup
LDR_PIN = ADC(Pin(34)) # Pin ADC untuk LDR
LDR_PIN.atten(ADC.ATTN_11DB) # Mengatur attenuasi untuk rentang tegangan penuh (0-3.3V)
# LED pin setup
LED_PIN = Pin(2, Pin.OUT)
# Function to read light level from the LDR sensor
def read_light_level():
return LDR_PIN.read() # Membaca nilai ADC (0-4095)
# Normalize the ADC reading (0-4095) to a percentage (0-100%)
def normalize_light_level(raw_value):
return int((raw_value / 4095) * 100) # Normalisasi ke persentase (0-100%)
# Callback function to handle MQTT messages
def mqtt_callback(topic, msg):
global led_state
print("Message received on topic {}: {}".format(topic, msg))
if topic.decode() == MQTT_TOPIC_LED:
command = msg.decode().strip().lower()
if command == "on":
LED_PIN.value(1) # Nyalakan LED
elif command == "off":
LED_PIN.value(0) # Matikan LED
# WIFI Connection
def connect_wifi():
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
def connect_mqtt():
print("Connecting to MQTT server... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.set_callback(mqtt_callback)
client.connect()
client.subscribe(MQTT_TOPIC_LED)
print("Connected and subscribed to topic {}".format(MQTT_TOPIC_LED))
return client
# Main loop to monitor and control
def main():
# Connect to Wi-Fi and MQTT server
connect_wifi()
client = connect_mqtt()
while True:
try:
# Check for incoming MQTT messages
client.check_msg()
# Read and normalize light level
light_level_raw = read_light_level()
light_level_normalized = normalize_light_level(light_level_raw)
# Create message to send
message = ujson.dumps({
"light_level_raw": light_level_raw,
"light_level_percentage": light_level_normalized
})
# Publish the light level data to MQTT topic
client.publish(MQTT_TOPIC_SENSOR, message)
print("Published sensor data: {}".format(message))
# Delay for next reading (set to 1 second for faster response)
time.sleep(1)
except Exception as e:
print("Error: ", e)
time.sleep(5)
# Run the main loop
if __name__ == "__main__":
main()