# ================================
# SMART HOME - FULL SYSTEM
# ================================
from machine import Pin, PWM, I2C, time_pulse_us
import dht
import ssd1306
import neopixel
import time
# ================================
# HARDWARE SETUP
# ================================
# DHT11
sensor = dht.DHT11(Pin(4))
# Ultrasonic
trig = Pin(5, Pin.OUT)
echo = Pin(18, Pin.IN)
# OLED
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Servo
servo = PWM(Pin(19), freq=50)
# NeoPixel (8 LEDs)
np = neopixel.NeoPixel(Pin(23), 8)
# ================================
# FUNCTIONS
# ================================
def get_distance():
trig.off()
time.sleep_us(2)
trig.on()
time.sleep_us(10)
trig.off()
duration = time_pulse_us(echo, 1, 30000)
distance = (duration / 2) / 29.1
return round(distance, 1)
def set_neopixel(color):
if color == "red":
np.fill((255, 0, 0))
elif color == "blue":
np.fill((0, 0, 255))
else:
np.fill((0, 0, 0))
np.write()
def open_garage():
servo.duty_u16(5000) # Open
time.sleep(1)
def close_garage():
servo.duty_u16(2000) # Close
time.sleep(1)
def read_sensors():
sensor.measure()
temp = sensor.temperature()
dist = get_distance()
return temp, dist
def update_display(temp, dist):
oled.fill(0)
oled.text("SMART HOME", 0, 0)
oled.text("Temp: {} C".format(temp), 0, 16)
oled.text("Dist: {} cm".format(dist), 0, 32)
oled.show()
def control_actuators(temp, dist):
# Temperature Logic
if temp > 30:
set_neopixel("red")
else:
set_neopixel("blue")
# Garage Logic
if dist < 30:
open_garage()
else:
close_garage()
# ================================
# MAIN LOOP
# ================================
while True:
temp, dist = read_sensors()
print("Temp:", temp, "C")
print("Distance:", dist, "cm")
print("-------------------")
update_display(temp, dist)
control_actuators(temp, dist)
time.sleep(2)