import machine
import time
import network
import umqtt.simple as mqtt
import dht
# Constants
DHT_PIN = 23
MOISTURE_PIN = 34
LDR_PIN = 32
RELAY_PIN = 26
MQTT_BROKER = "8e1473acacc04ba68cfa29d8a2799513.s1.eu.hivemq.cloud"
MQTT_PORT = 8883
MQTT_TOPIC = "irrigation/sensor_data"
PREDICT_TOPIC = "irrigation/predict"
# Wi-Fi Credentials
SSID = "Wokwi-GUEST"
PASSWORD = ""
# Setup
dht_sensor = dht.DHT22(machine.Pin(DHT_PIN))
moisture_sensor = machine.ADC(machine.Pin(MOISTURE_PIN))
ldr_sensor = machine.ADC(machine.Pin(LDR_PIN))
relay = machine.Pin(RELAY_PIN, machine.Pin.OUT)
relay.value(0) # Start with the relay off
# Connect to Wi-Fi automatically
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
print("Connecting to Wi-Fi...")
while not wlan.isconnected():
time.sleep(1)
print("Connected to Wi-Fi:", wlan.ifconfig())
# MQTT Callback
def sub_callback(topic, msg):
if topic == PREDICT_TOPIC:
prediction = int(msg)
if prediction == 1:
relay.value(1) # Turn on relay (water pump)
print("Water pump ON")
else:
relay.value(0) # Turn off relay (water pump)
print("Water pump OFF")
# Main loop
def main():
connect_wifi()
client = mqtt.MQTTClient("ESP32Client", MQTT_BROKER, port=MQTT_PORT) # Include port
try:
client.set_callback(sub_callback)
client.connect() # Try connecting to the MQTT broker
client.subscribe(PREDICT_TOPIC)
except OSError as e:
print("Failed to connect to MQTT broker:", e)
return # Exit if connection fails
while True:
# Read sensor data
dht_sensor.measure()
humidity = dht_sensor.humidity()
temperature = dht_sensor.temperature()
soil_moisture = moisture_sensor.read() # Read moisture from potentiometer
light_intensity = ldr_sensor.read() # Read light intensity
# Publish sensor data to MQTT
payload = '{"humidity":%.2f,"temperature":%.2f,"soil_moisture":%d,"light":%d}' % (
humidity, temperature, soil_moisture, light_intensity)
client.publish(MQTT_TOPIC, payload)
# Check for incoming messages
client.check_msg()
time.sleep(5) # Delay for 5 seconds before the next reading
# Run the main function
if __name__ == "__main__":
main()