from machine import I2C, Pin, ADC
from umqtt.simple import MQTTClient
from bmp180 import BMP180
import machine
import network
import ujson
import time
import dht
# ---------------------------
# Sensors
# ---------------------------
# DHT22
dht_sensor = dht.DHT22(Pin(15))
# Soil Moisture
soil_adc = ADC(Pin(34))
soil_adc.atten(ADC.ATTN_11DB)
soil_adc.width(ADC.WIDTH_12BIT)
# LDR
ldr_adc = ADC(Pin(35))
ldr_adc.atten(ADC.ATTN_11DB)
ldr_adc.width(ADC.WIDTH_12BIT)
# PIR Motion
motion_sensor = Pin(27, Pin.IN)
# BMP180
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
bmp = BMP180(i2c)
# HC-SR04 Ultrasonic
trig = Pin(13, Pin.OUT)
echo = Pin(12, Pin.IN)
trig.value(0)
def get_distance():
trig.value(0)
time.sleep_us(2)
trig.value(1)
time.sleep_us(10)
trig.value(0)
try:
pulse_time = machine.time_pulse_us(echo, 1, 30000)
distance = (pulse_time * 0.0343) / 2
return round(distance, 1)
except OSError:
return None
# ---------------------------
# WiFi
# ---------------------------
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
print("Connecting to WiFi...")
wifi.connect("Wokwi-GUEST", "")
while not wifi.isconnected():
time.sleep(0.5)
print("WiFi Connected!")
print(wifi.ifconfig())
# ---------------------------
# MQTT
# ---------------------------
MQTT_BROKER = "mqtt-dashboard.com"
MQTT_CLIENT_ID = "do7amqtt_se"
TOPIC = "do7a_d7d7"
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER)
print("Connecting to MQTT...")
client.connect()
print("MQTT Connected!")
# ---------------------------
# Main Loop
# ---------------------------
while True:
try:
# DHT22
dht_sensor.measure()
temp = dht_sensor.temperature()
humidity = dht_sensor.humidity()
# Soil Moisture
soil_raw = soil_adc.read()
soil = round((soil_raw / 4095) * 100, 1)
# LDR
light = ldr_adc.read()
# PIR
motion = motion_sensor.value()
# BMP180
try:
pressure = int(bmp.pressure())
except:
pressure = int(bmp.pressure)
# Ultrasonic
distance = get_distance()
payload = {
"temp": temp,
"humidity": humidity,
"soil": soil,
"light": light,
"motion": motion,
"pressure": pressure,
"distance": distance
}
client.publish(TOPIC, ujson.dumps(payload))
print(payload)
except Exception as e:
print("Error:", e)
time.sleep(2)