import machine
from machine import Pin, UART, ADC, PWM
import dht
import time
# ---------------- Pins ----------------
DHT_PIN = 14
MQ2_PIN = 34
TRIG_PIN = 5
ECHO_PIN = 18
SERVO_PIN = 27
LED_PIN = 2
UART_TX = 17
UART_RX = 16
# ---------------- Devices ----------------
led = Pin(LED_PIN, Pin.OUT)
dht_sensor = dht.DHT22(Pin(DHT_PIN))
mq2 = ADC(Pin(MQ2_PIN))
mq2.atten(ADC.ATTN_11DB)
trigger = Pin(TRIG_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)
servo = PWM(Pin(SERVO_PIN))
servo.freq(50)
uart = UART(1, baudrate=9600, tx=Pin(UART_TX), rx=Pin(UART_RX))
# ---------------- Servo ----------------
def set_servo(angle):
pulse = 500 + (angle / 180) * 2000
duty = int((pulse / 20000) * 65535)
servo.duty_u16(duty)
def door_open():
set_servo(90)
def door_closed():
set_servo(0)
# ---------------- Ultrasonic ----------------
def distance():
trigger.off()
time.sleep_us(2)
trigger.on()
time.sleep_us(10)
trigger.off()
try:
pulse = machine.time_pulse_us(echo, 1, 30000)
if pulse < 0:
return 999
return round(pulse / 58)
except OSError:
return 999
# ---------------- Main ----------------
GAS_THRESHOLD = 2200
previous_message = ""
last_distance = 999
while True:
try:
dht_sensor.measure()
temperature = dht_sensor.temperature()
humidity = dht_sensor.humidity()
except:
temperature = 0
humidity = 0
gas_value = mq2.read()
gas = gas_value > GAS_THRESHOLD
dist = distance()
# Ignore small changes
if abs(dist - last_distance) >= 2:
last_distance = dist
else:
dist = last_distance
if gas:
led.on()
door_open()
door = "OPEN"
elif dist <= 30:
led.off()
door_open()
door = "OPEN"
else:
led.off()
door_closed()
door = "CLOSED"
message = "{:.1f},{:.1f},{},{},{},{}".format(
temperature,
humidity,
dist,
gas_value,
int(gas),
door
)
if message != previous_message:
uart.write(message + "\n")
print(message)
previous_message = message
time.sleep_ms(250)