from machine import Pin, I2C, ADC
import dht
import time
import network
import ubinascii
import machine
import micropython
from umqtt.simple import MQTTClient
from lcd_api import LcdApi
from i2c_lcd import I2cLcd

I2C_ADDR = 0x27
LCD_ROWS = 2
LCD_COLS = 16

MQTT_BROKER = "broker.mqtt-dashboard.com"
MQTT_CLIENT_ID = "clientId-uJ2TD2fCpr"
MQTT_TOPIC_PUBLISH = "sensor/data"
MQTT_TOPIC_SUBSCRIBE = "sensor/control"

dht_pin = Pin(14)
dht_sensor = dht.DHT22(dht_pin)

soil_moisture_pin = ADC(Pin(34))
soil_moisture_pin.atten(ADC.ATTN_11DB)  # Configure to read the full range (0-3.3V)


relay_pin = Pin(18, Pin.OUT)
relay_pin.value(0)  # Initially turn off the relay

i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)  # Adjust pins as necessary
lcd = I2cLcd(i2c, I2C_ADDR, LCD_ROWS, LCD_COLS)  # Adjust address if needed

ssid = 'Wokwi-GUEST'
password = ''

def connect_to_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, password)
    
    while not wlan.isconnected():
        print("Connecting to WiFi...")
        time.sleep(1)
        
    print("Connected to WiFi")
    print(wlan.ifconfig())

connect_to_wifi()

def on_message(topic, msg):
    print("Received message on topic {}: {}".format(topic, msg))
    if topic == MQTT_TOPIC_SUBSCRIBE:
        message = msg.decode("utf-8")
        if message == "fan_on":
            relay_pin.value(1)
            print("Fan turned ON via MQTT")
        elif message == "fan_off":
            relay_pin.value(0)
            print("Fan turned OFF via MQTT")
        elif message == "pump_on":
            relay_pin.value(1)
            print("Pump turned ON via MQTT")
        elif message == "pump_off":
            relay_pin.value(0)
            print("Pump turned OFF via MQTT")

def connect_to_mqtt():
    client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER)
    client.set_callback(on_message)
    client.connect()
    client.subscribe(MQTT_TOPIC_SUBSCRIBE)
    print("Connected to MQTT Broker and subscribed to topic:", MQTT_TOPIC_SUBSCRIBE)
    return client

mqtt_client = connect_to_mqtt()

def read_dht_sensor():
    dht_sensor.measure()
    temp = dht_sensor.temperature()
    humidity = dht_sensor.humidity()
    return temp, humidity

def read_soil_moisture():
    moisture_value = soil_moisture_pin.read()
    moisture_percentage = (moisture_value / 4095.0) * 100  # Convert to percentage
    return moisture_percentage

def update_lcd(temp, humidity):
    lcd.clear()
    lcd.putstr("Temp: {:.2f}C\nHum: {:.2f}%".format(temp, humidity))

while True:
    temp, humidity = read_dht_sensor()
    soil_moisture = read_soil_moisture()
    
    print("Temperature: {:.2f} C".format(temp))
    print("Humidity: {:.2f} %".format(humidity))
    print("Soil Moisture: {:.2f} %".format(soil_moisture))
    
    update_lcd(temp, humidity)
    
    if temp > 30:  # If temperature is above 30 degrees Celsius
        relay_pin.value(1)  # Turn on the fan
        print("Fan turned ON")
    else:
        relay_pin.value(0)  # Turn off the fan
        print("Fan turned OFF")
    
    if soil_moisture < 30:  # If soil moisture is below 30%
        relay_pin.value(1)  # Turn on the pump
        print("Pump turned ON")
    else:
        relay_pin.value(0)  # Turn off the pump
        print("Pump turned OFF")
    
    try:
        data = {
            "temperature": temp,
            "humidity": humidity,
            "soil_moisture": soil_moisture,
        }
        mqtt_client.publish(MQTT_TOPIC_PUBLISH, str(data))
        print("Data sent to MQTT Broker:", data)
    except Exception as e:
        print("Failed to send data to MQTT Broker:", e)
    
    mqtt_client.check_msg()
    
    time.sleep(10)  # Wait for 10 seconds before the next reading
NOCOMNCVCCGNDINLED1PWRRelay Module