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
# Constants for the LCD
I2C_ADDR = 0x27
LCD_ROWS = 2
LCD_COLS = 16
# MQTT Configuration
MQTT_BROKER = "broker.mqtt-dashboard.com"
MQTT_CLIENT_ID = "clientId-VikHOy0bo0"
MQTT_TOPIC_PUBLISH = "sensor/data"
MQTT_TOPIC_SUBSCRIBE = "sensor/control"
# Initialize the DHT22 sensor
dht_pin = Pin(14)
dht_sensor = dht.DHT22(dht_pin)
# Initialize the potentiometer (simulating soil moisture sensor)
soil_moisture_pin = ADC(Pin(34))
soil_moisture_pin.atten(ADC.ATTN_11DB) # Configure to read the full range (0-3.3V)
# Initialize the LDR
ldr_pin = ADC(Pin(35))
ldr_pin.atten(ADC.ATTN_11DB) # Configure to read the full range (0-3.3V)
# Initialize the I2C interface and LCD
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
# WiFi Configuration (replace with your WiFi credentials)
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()
# MQTT message callback function
def on_message(topic, msg):
print("Received message on topic {}: {}".format(topic, msg))
if topic == MQTT_TOPIC_SUBSCRIBE.encode('utf-8'):
message = msg.decode("utf-8")
print("Message received via MQTT:", message)
# Connect to MQTT Broker
def connect_to_mqtt():
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER)
client.set_callback(on_message)
while True:
try:
print("Connecting to MQTT server... ", end="")
client.connect()
client.subscribe(MQTT_TOPIC_SUBSCRIBE)
print("Connected to MQTT Broker and subscribed to topic:", MQTT_TOPIC_SUBSCRIBE)
break
except Exception as e:
print("Failed to connect to MQTT Broker:", e)
time.sleep(5)
return client
mqtt_client = connect_to_mqtt()
# Function to read temperature and humidity
def read_dht_sensor():
dht_sensor.measure()
temp = dht_sensor.temperature()
humidity = dht_sensor.humidity()
return temp, humidity
# Function to read simulated soil moisture
def read_soil_moisture():
moisture_value = soil_moisture_pin.read()
moisture_percentage = (moisture_value / 4095.0) * 100 # Convert to percentage
return moisture_percentage
# Function to read light intensity
def read_ldr():
ldr_value = ldr_pin.read()
light_percentage = (ldr_value / 4095.0) * 100 # Convert to percentage
return light_percentage
# Function to update LCD display
def update_lcd(temp, humidity, light_intensity):
lcd.clear()
lcd.putstr("Temp: {:.2f}C\nHum: {:.2f}%".format(temp, humidity))
lcd.putstr("\nLight: {:.2f}%".format(light_intensity))
# Main loop
while True:
try:
temp, humidity = read_dht_sensor()
soil_moisture = read_soil_moisture()
light_intensity = read_ldr()
print("Temperature: {:.2f} C".format(temp))
print("Humidity: {:.2f} %".format(humidity))
print("Soil Moisture: {:.2f} %".format(soil_moisture))
print("Light Intensity: {:.2f} %".format(light_intensity))
# Update the LCD with the latest readings
update_lcd(temp, humidity, light_intensity)
# Publish data to MQTT broker
try:
data = {
"temperature": temp,
"humidity": humidity,
"soil_moisture": soil_moisture,
"light_intensity": light_intensity
}
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)
# Check for new messages
mqtt_client.check_msg()
time.sleep(10) # Wait for 10 seconds before the next reading
except OSError as e:
print("Sensor reading failed:", e)
time.sleep(5) # Wait before trying again
except Exception as e:
print("MQTT connection error:", e)
mqtt_client = connect_to_mqtt() # Reconnect to MQTT broker if there was a failure