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():
"""Membaca nilai raw dari sensor LDR"""
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):
"""Normalisasi nilai ADC ke persentase (0-100%)"""
normalized = (raw_value / 4095) * 100 # Normalisasi ke persentase (0-100%)
return round(normalized, 2) # Pembulatan 2 digit desimal
# Callback function to handle MQTT messages
def mqtt_callback(topic, msg):
"""Fungsi untuk menangani pesan yang diterima melalui MQTT"""
global led_state
print("Pesan diterima pada topik {}: {}".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():
"""Fungsi untuk menghubungkan ke WiFi"""
print("Mencoba menghubungkan ke 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(" Terhubung!")
# MQTT Server connection
def connect_mqtt():
"""Fungsi untuk menghubungkan ke broker MQTT"""
print("Mencoba menghubungkan ke server MQTT...", 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("Terhubung dan berlangganan ke topik {}".format(MQTT_TOPIC_LED))
return client
# Main loop to monitor and control
def main():
"""Fungsi utama untuk menjalankan loop pemantauan dan pengendalian"""
# Hubungkan ke Wi-Fi dan MQTT server
connect_wifi()
client = connect_mqtt()
while True:
try:
# Cek pesan masuk di MQTT
client.check_msg()
# Baca dan normalisasi tingkat cahaya
light_level_raw = read_light_level()
light_level_normalized = normalize_light_level(light_level_raw)
# Tampilkan nilai raw dan normalisasi untuk debugging
print("Tingkat cahaya raw: {}, Tingkat cahaya normalisasi: {}%".format(light_level_raw, light_level_normalized))
# Membuat pesan untuk dikirim
message = ujson.dumps({
"light_level_raw": light_level_raw,
"light_level_percentage": light_level_normalized
})
# Terbitkan data sensor ke topik MQTT
client.publish(MQTT_TOPIC_SENSOR, message)
print("Data sensor diterbitkan: {}".format(message))
# Delay untuk pembacaan berikutnya (1 detik)
time.sleep(1)
except Exception as e:
print("Terjadi kesalahan: ", e)
time.sleep(5)
# Jalankan fungsi utama
if __name__ == "__main__":
main()