import network
import time
from machine import Pin,I2C, SoftI2C,ADC, PWM
import dht
import ujson
from umqtt.simple import MQTTClient
import ssd1306
import utime
import mpu6050
import sys
motion = False
pwd = "5384"
WIDTH = 128
HEIGHT = 64
p4 = Pin(12)
servo = PWM(p4,freq=50)
i2c = I2C(scl=Pin(22), sda=Pin(21)) #Init i2c
i2cAcc = SoftI2C(sda=Pin(33),scl=Pin(32))
oled=ssd1306.SSD1306_I2C(128,64,i2c,0x3c)
# CONSTANTS
KEY_UP = const(0)
KEY_DOWN = const(1)
pot = ADC(Pin(34))
pot.atten(ADC.ATTN_11DB)
keys = [['1', '2', '3', 'A'], ['4', '5', '6', 'B'], ['7', '8', '9', 'C'], ['*', '0', '#', 'D']]
# Pin names for Pico
cols = [19,16,15,23]
rows = [2,4,5,18]
# set pins for rows as outputs
row_pins = [Pin(pin_name, mode=Pin.OUT) for pin_name in rows]
# set pins for cols as inputs
col_pins = [Pin(pin_name, mode=Pin.IN, pull=Pin.PULL_DOWN) for pin_name in cols]
password = ""
pwd_flag = False
def init():
for row in range(0,4):
for col in range(0,4):
row_pins[row].value(0)
def scan(row, col):
""" scan the keypad """
# set the current column to high
row_pins[row].value(1)
key = None
# check for keypressed events
if col_pins[col].value() == KEY_DOWN:
key = KEY_DOWN
if col_pins[col].value() == KEY_UP:
key = KEY_UP
row_pins[row].value(0)
# return the key state
return key
def handle_interrupt(pin):
global motion
motion = True
global interrupt_pin
interrupt_pin = pin
led = Pin(4, Pin.OUT)
pir = Pin(13, Pin.IN)
pir.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)
fire_flag = False
def f(topic,msg):
global pwd_flag
global password
if topic.decode('ASCII') == 'Admin':
print("admin access")
if msg.decode('ASCII') == 'lock':
servo.duty(120)
pwd_flag = False
password = ""
time.sleep(5)
servo.duty(40)
if msg.decode('ASCII') == 'unlock':
servo.duty(120)
pwd_flag = True
password = ""
time.sleep(5)
servo.duty(40)
print(topic[1:],msg)
windowFlag = False
ldr_flag = False
sensor = dht.DHT22(Pin(15))
print("Connecting to WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Connected!")
print("Connecting to MQTT server... ", end="")
client = MQTTClient(
client_id = b"test1",
server = "SERVER-ADDRESS",
port = 8883,
user = "username",
password = "password",
ssl = True,
ssl_params = {'server_hostname':"SERVER-ADDRESS"}
)
client.connect()
client.set_callback(f)
client.subscribe("Admin", qos=1)
print("Connected!")
prev_weather = ""
mpu = mpu6050.accel(i2cAcc)
password =""
while True:
client.check_msg()
oled.fill(0)
oled.text("Enter Pwd ["+('U' if pwd_flag else 'L') +"]: ",0,0)
for row in range(4):
for col in range(4):
key = scan(row, col)
if key == KEY_DOWN:
print("Key Pressed", keys[row][col])
if keys[row][col] == '#' :
print(password , pwd)
if password == pwd:
print("Access Granted")
servo.duty(120)
oled.text("Access Granted", 0, 50)
client.publish("security_logs",'Access Granted')
pwd_flag = not pwd_flag
time.sleep(5)
else:
print("Access Denied")
oled.text("Access Denied", 0, 50)
client.publish("security_logs",'Unauthorise Access')
pwd_flag = 0
time.sleep(5)
password =""
else:
password = password + keys[row][col]
print(password)
# display the character associated with the key press
last_key_press = keys[row][col]
oled.text(password, 0, 20)
oled.show()
servo.duty(40)
if not pwd_flag:
vals = mpu.get_values()
pot_value = pot.read()
if pot_value > 1000:
print("Laser Mesh Tripped", pot_value)
if not ldr_flag:
client.publish("security_logs","Laser Mesh Tripped")
ldr_flag = True
else:
ldr_flag = False
if vals['Tmp'] > 60:
print("Possibilty of Fire")
if not fire_flag:
client.publish("security_logs","Possibilty of Fire")
fire_flag = True
else:
fire_flag = False
if vals['GyZ'] > 2500 or vals['GyZ'] < -2500 or vals['GyX'] > 2500 or vals['GyX'] < -2500 or vals['GyY'] > 2500 or vals['GyY'] < -2500:
print("Window Tampering Detected")
if not windowFlag:
client.publish("security_logs",'Window Tampering Detected')
windowFlag = True
else:
windowFlag = False
if motion:
print('MOTION DETECTED')
client.publish("security_logs","PIR sensor Tripped")
led.value(1)
led.value(0)
motion = False
time.sleep(0.5)
Loading
ssd1306
ssd1306