import machine
import time
from machine import Pin, I2C
import dht
from ssd1306 import SSD1306_I2C
# Pin assignments
PIR_PIN = 1
TRIG_PIN = 10
ECHO_PIN = 11
DHT_PIN = 15
RELAY_OPEN_PIN = 16
RELAY_CLOSE_PIN = 17
OLED_SCL_PIN = 5
OLED_SDA_PIN = 4
# Constants
TIMEOUT = 30 # Time in seconds before closing the door
DOOR_OPEN_TIME = 15 # Adjust based on your garage door's opening time
DOOR_CLOSE_TIME = 15 # Adjust based on your garage door's closing time
DISTANCE_THRESHOLD = 200 # Adjust based on your garage setup (in cm)
SOUND_SPEED = 34300 # Speed of sound in cm/s
# Initialize components
pir_sensor = Pin(PIR_PIN, Pin.IN)
trigger = Pin(TRIG_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)
dht_sensor = dht.DHT22(Pin(DHT_PIN))
relay_open = Pin(RELAY_OPEN_PIN, Pin.OUT)
relay_close = Pin(RELAY_CLOSE_PIN, Pin.OUT)
# Initialize SSD1306
i2c = I2C(0, scl=Pin(OLED_SCL_PIN), sda=Pin(OLED_SDA_PIN))
oled = SSD1306_I2C(128, 64, i2c)
last_presence_time = 0
door_state = 0 # 0: Closed, 1: Opening, 2: Open, 3: Closing
previous_door_state = None
previous_temperature = None
previous_humidity = None
def measure_distance():
trigger.low()
time.sleep_us(2)
trigger.high()
time.sleep_us(10)
trigger.low()
while echo.value() == 0:
pass
start_time = time.ticks_us()
while echo.value() == 1:
pass
end_time = time.ticks_us()
duration = time.ticks_diff(end_time, start_time)
distance = (duration * SOUND_SPEED) / 2 / 1000000
return distance
while True:
# Presence detection
if pir_sensor.value() == 1 or measure_distance() < DISTANCE_THRESHOLD:
last_presence_time = time.time()
# Open door
if last_presence_time > 0 and time.time() - last_presence_time < TIMEOUT and door_state == 0:
print("Opening the door...")
relay_open.value(1)
door_state = 1
time.sleep_ms(100) # Slight delay for OLED to catch up
oled.fill(0)
oled.text("Door: Opening", 0, 0)
oled.show()
time.sleep(DOOR_OPEN_TIME)
relay_open.value(0)
door_state = 2
# Close door
if time.time() - last_presence_time > TIMEOUT and door_state == 2:
print("Closing the door...")
relay_close.value(1)
door_state = 3
time.sleep_ms(100) # Slight delay for OLED to catch up
oled.fill(0)
oled.text("Door: Closing", 0, 0)
oled.show()
time.sleep(DOOR_CLOSE_TIME)
relay_close.value(0)
door_state = 0
last_presence_time = 0
# Read DHT22 data
dht_sensor.measure()
temperature = dht_sensor.temperature()
humidity = dht_sensor.humidity()
# Update OLED display if door state or environmental readings have changed
if door_state != previous_door_state or temperature != previous_temperature or humidity != previous_humidity:
oled.fill(0)
door_status_text = {
0: "Closed",
1: "Opening",
2: "Open",
3: "Closing"
}
oled.text("Door: {}".format(door_status_text[door_state]), 0, 0)
oled.text("Temp: {:.1f} C".format(temperature), 0, 10)
oled.text("Humidity: {:.1f} %".format(humidity), 0, 20)
oled.show()
previous_door_state = door_state
previous_temperature = temperature
previous_humidity = humidity
time.sleep(0.1) # Reduced delay for faster loop iterations
Loading
pi-pico-w
pi-pico-w