from machine import Pin, I2C, PWM
from utime import sleep
from lcd_api import LcdApi
from pico_i2c_lcd import I2cLcd
import dht
import utime
# Ultrasonic sensor pins
TRIGGER_PIN = 3
ECHO_PIN = 2
# Servo motor pin
SERVO_PIN = 22
# Buzzer pin
BUZZER_PIN = 7
# Initialize ultrasonic sensor pins
trigger = Pin(TRIGGER_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)
# Initialize servo motor
servo = PWM(Pin(SERVO_PIN))
servo.freq(50)
# Initialize buzzer
buzzer = Pin(BUZZER_PIN, Pin.OUT)
# LCD setup
I2C_ADDR = 0x27
I2C_NUM_ROWS = 2
I2C_NUM_COLS = 16
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)
lcd.backlight_on()
# Motion sensor pin and LED pin
MOTION_PIN = Pin(16, Pin.IN)
LED = Pin(15, Pin.OUT)
# DHT22 temperature and humidity sensor pin
sensor = dht.DHT22(Pin(5))
# Display welcome message on LCD
lcd.clear()
lcd.putstr("Welcome IOT")
sleep(2) # Display for 2 seconds
def measure_distance():
trigger.low()
utime.sleep_us(2)
trigger.high()
utime.sleep_us(10)
trigger.low()
while echo.value() == 0:
signal_off = utime.ticks_us()
while echo.value() == 1:
signal_on = utime.ticks_us()
time_elapsed = utime.ticks_diff(signal_on, signal_off)
distance_cm = (time_elapsed * 0.0343) / 2
return distance_cm
def set_servo_position(angle):
duty = int((angle / 18.0) + 2.5)
servo.duty_u16(duty * 65535 // 100)
utime.sleep(1)
if angle == 180: # If gate is opening
buzzer.on() # Turn on the buzzer
sleep(0.5) # Buzzer on for 0.5 seconds
buzzer.off() # Turn off the buzzer
try:
while True:
# Measure distance using ultrasonic sensor
distance = measure_distance()
if distance < 10:
lcd.clear()
lcd.putstr("Object detected! Opening gate..")
set_servo_position(180) # Open gate
else:
lcd.clear()
lcd.putstr("No object detected. Closing gate...")
set_servo_position(90) # Close gate
sleep(3)
# Display temperature and humidity on LCD
sensor.measure()
lcd.clear()
lcd.putstr(f"Temp: {sensor.temperature():.1f}")
lcd.move_to(0, 1)
sleep(3)
lcd.putstr(f"Humidity: {sensor.humidity():.1f}")
sleep(3)
# Check motion sensor
if MOTION_PIN.value():
lcd.clear()
lcd.putstr("Motion Detected (LED ON)")
LED.on() # Turn on the LED when motion is detected
sleep(1) # Keep the LED on for 1 second
else:
lcd.clear()
lcd.putstr("No Motion")
LED.off() # Turn off the LED when no motion is detected
sleep(5) # Wait for 5 seconds between measurements