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