from machine import Pin, ADC
import time
from math import log
from utime import sleep
## Pin interrupt handler
#
# A function to handle pin interrupts
# Expects a Pin type parameter
button_pressed = False
def interrupt_callback(pin):
global button_pressed
stamp = 0.5
pressed_time = time.ticks_ms() - stamp
if pressed_time > 199.5:
button_pressed = True
stamp = pressed_time
def main():
global button_pressed
global stamp
global counter
# a tiny sleep to allow the first print to be displayed
b0 = Pin(2, Pin.IN, Pin.PULL_DOWN)
b1 = Pin(1, Pin.IN, Pin.PULL_DOWN)
b2 = Pin(0, Pin.IN, Pin.PULL_DOWN)
led1 = Pin(16, Pin.OUT)
led2 = Pin(17, Pin.OUT)
led3 = Pin(18, Pin.OUT)
led4 = Pin(19, Pin.OUT)
ntc = ADC(Pin(26))
ldr = ADC(Pin(27))
pir = Pin(15, Pin.IN)
mq2 = ADC(Pin(28))
input_passcode = []
correct_passcode = [1, 2, 1]
ntc_beta = 3950
ldr_gamma = 0.7
ldr_rl10 = 50
print('Program starting')
# code below here
while True:
# Pin Interrupt Handlers
b0.irq(trigger=Pin.IRQ_RISING, handler=interrupt_callback)
b1.irq(trigger=Pin.IRQ_RISING, handler=interrupt_callback)
b2.irq(trigger=Pin.IRQ_RISING, handler=interrupt_callback)
x = 0
y = 1
z = 2
sleep(0.01)
if button_pressed == True:
if b0.value():
print(f"Key {x} is pressed")
sleep(1)
input_passcode.append(x)
elif b1.value():
print(f"Key {y} is pressed")
sleep(1)
input_passcode.append(y)
elif b2.value():
print(f"Key {z} is pressed")
sleep(1)
input_passcode.append(z)
button_pressed = False
# Temperature from NTC {Degree Symbol "°"}
celsius = 1 / (log(1 / (65535. / ntc.read_u16() - 1)) / ntc_beta + 1.0 / 298.15) - 273.15
# Light from LDR
voltage = ldr.read_u16() / 65535. * 5
resistance = 2000 * voltage / (1 - voltage / 5)
lux = pow(ldr_rl10 * 1e3 * pow(10, ldr_gamma) / resistance, (1 / ldr_gamma))
# Motion from PIR
motion = pir.value()
# Gas from MQ2
gas = mq2.read_u16()
# If password is entered correctly then display accurate information of the sensors
if len(input_passcode) == len(correct_passcode):
if input_passcode == correct_passcode:
print("Access Granted")
print("")
sleep(0.5)
print(f"Temperature: {round(celsius, 1)}°C")
print("State: Night" if lux < 400 else "State: Day")
print("Door Motion: Detected!" if motion else "Door Motion: Ended")
print("Smoke: Detected!" if gas > 58654 else "Smoke: 0")
input_passcode = []
else:
print("Access Denied")
sleep(0.2)
print("Please enter the correct passcode")
input_passcode = []
if len(input_passcode) > len(correct_passcode):
if len(input_passcode) == 4:
subset = input_passcode[:3]
subset2 = input_passcode[4]
if subset != correct_passcode:
print("You entered the wrong passcode")
sleep(0.5)
print("However make sure to write 2 more digits")
input_passcode = []
input_passcode.append(subset2)
elif len(input_passcode) == 5:
subset = input_passcode[:3]
subset2 = input_passcode[4]
subset3 = input_passcode[5]
if subset != correct_passcode:
print("You entered the wrong passcode")
sleep(0.5)
print("However make sure to write 1 more digit")
input_passcode = []
input_passcode.append(subset2)
input_passcode.append(subset3)
if len(input_passcode) == len(correct_passcode):
if input_passcode == correct_passcode:
print("Access Granted")
print("")
sleep(0.5)
print(f"Temperature: {round(celsius, 1)}°C")
print("State: Night" if lux < 400 else "State: Day")
print("Door Motion: Detected!" if motion else "Door Motion: Ended")
print("Smoke: Detected!" if gas > 58654 else "Smoke: 0")
input_passcode = []
else:
print("Access Denied")
sleep(0.2)
print("Please enter the correct passcode")
input_passcode = []
led1.value(1 if round(celsius, 1) > 30 else 0)
led2.value(1 if lux < 400 else 0)
led3.value(1 if motion else 0)
led4.value(1 if gas > 58654 else 0)
if __name__ == "__main__":
main()