from machine import Pin, I2C
import network
import urequests
import time
import math
from mpu6050 import MPU6050
from pico_i2c_lcd import I2cLcd
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASS = ""
BOT_TOKEN = "8946171595:AAF0d5rBvRtP556VnkFH3K1IpcFybdO4IJg"
CHAT_ID = "6262211585"
BLYNK_AUTH = "PaI38EcotPdlSxGe0uv_U8RZYhvX79ls"
TRIG_PIN = 12
ECHO_PIN = 14
BUZZER_PIN = 25
LED_RED_PIN = 26
LED_GREEN_PIN = 27
RESET_BUTTON_PIN = 33
trig = Pin(TRIG_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)
buzzer = Pin(BUZZER_PIN, Pin.OUT)
led_red = Pin(LED_RED_PIN, Pin.OUT)
led_green = Pin(LED_GREEN_PIN, Pin.OUT)
reset_btn = Pin(RESET_BUTTON_PIN, Pin.IN, Pin.PULL_UP)
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
mpu = MPU6050(i2c)
lcd = I2cLcd(i2c, 0x27, 4, 20)
system_latched_alarm = False
ref_pitch = 0
ref_roll = 0
last_blynk_update = 0
last_safe_report = 0
last_alarm_repeat = 0
last_blink = 0
last_v5_check = 0
blink_state = False
current_screen = ""
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASS)
while not wlan.isconnected():
time.sleep(1)
def send_telegram(message):
try:
url = "https://api.telegram.org/bot" + BOT_TOKEN + "/sendMessage"
r = urequests.post(url, json={"chat_id": CHAT_ID, "text": message})
r.close()
except Exception as e:
print("Telegram:", e)
def blynk_write(pin, value):
try:
url = "https://blynk.cloud/external/api/update?token={}&{}={}".format(
BLYNK_AUTH, pin, value
)
r = urequests.get(url)
r.close()
except Exception as e:
print("Blynk:", e)
def blynk_read_v5():
try:
url = "https://blynk.cloud/external/api/get?token={}&V5".format(BLYNK_AUTH)
r = urequests.get(url)
v = r.text.strip()
r.close()
return v
except:
return "0"
def get_pitch_roll():
a = mpu.get_accel()
ax, ay, az = a["x"], a["y"], a["z"]
pitch = math.degrees(math.atan2(ax, math.sqrt(ay*ay + az*az)))
roll = math.degrees(math.atan2(ay, math.sqrt(ax*ax + az*az)))
return pitch, roll
def get_distance():
trig.off()
time.sleep_us(5)
trig.on()
time.sleep_us(10)
trig.off()
timeout = time.ticks_us()
while echo.value() == 0:
if time.ticks_diff(time.ticks_us(), timeout) > 30000:
return 999
start = time.ticks_us()
while echo.value() == 1:
if time.ticks_diff(time.ticks_us(), start) > 30000:
return 999
end = time.ticks_us()
duration = time.ticks_diff(end, start)
return duration * 0.0343 / 2
def lcd_safe(distance, dpitch, droll):
global current_screen
if current_screen != "SAFE":
lcd.clear()
lcd.move_to(0,0); lcd.putstr("ATM SECURITY")
lcd.move_to(0,1); lcd.putstr("STATUS : AMAN")
current_screen = "SAFE"
def lcd_alarm(distance, dpitch, droll):
global current_screen
if current_screen != "ALARM":
lcd.clear()
lcd.move_to(0,0); lcd.putstr("!!! DIBOBOL !!!")
lcd.move_to(0,1); lcd.putstr("STATUS : BAHAYA")
current_screen = "ALARM"
connect_wifi()
lcd.clear()
lcd.putstr("Kalibrasi Sensor")
time.sleep(2)
ref_pitch, ref_roll = get_pitch_roll()
send_telegram("Sistem Keamanan ATM Aktif")
while True:
now = time.ticks_ms()
pitch, roll = get_pitch_roll()
delta_pitch = abs(pitch - ref_pitch)
delta_roll = abs(roll - ref_roll)
distance = get_distance()
intrusion = (
delta_pitch > 5.0 or
delta_roll > 5.0 or
distance < 20
)
if intrusion and not system_latched_alarm:
system_latched_alarm = True
led_red.on()
buzzer.on()
send_telegram("ATM Terdeteksi Dibobol")
blynk_write("V1", "BAHAYA")
last_alarm_repeat = now
if not system_latched_alarm:
led_green.on()
led_red.off()
buzzer.off()
lcd_safe(distance, delta_pitch, delta_roll)
if time.ticks_diff(now, last_safe_report) >= 30000:
blynk_write("V1", "AMAN")
blynk_write("V2", round(distance,1))
blynk_write("V3", round(delta_pitch,2))
blynk_write("V4", round(delta_roll,2))
last_safe_report = now
else:
led_green.off()
lcd_alarm(distance, delta_pitch, delta_roll)
if time.ticks_diff(now, last_blink) >= 100:
blink_state = not blink_state
led_red.value(blink_state)
buzzer.value(blink_state)
last_blink = now
if time.ticks_diff(now, last_alarm_repeat) >= 10000:
send_telegram("PERINGATAN ULANG - Alarm masih aktif")
last_alarm_repeat = now
if time.ticks_diff(now, last_blynk_update) >= 5000:
blynk_write("V2", round(distance,1))
blynk_write("V3", round(delta_pitch,2))
blynk_write("V4", round(delta_roll,2))
last_blynk_update = now
# ==================================================
# RESET ALARM DENGAN TOMBOL FISIK GPIO33
# ==================================================
if reset_btn.value() == 0 and system_latched_alarm:
time.sleep_ms(50)
if reset_btn.value() == 0:
system_latched_alarm = False
buzzer.off()
led_red.off()
led_green.on()
ref_pitch, ref_roll = get_pitch_roll()
blynk_write("V1", "AMAN")
blynk_write("V5", 0)
send_telegram(
" ALARM RESET: Sistem telah dinonaktifkan kembali melalui tombol fisik."
)
lcd.clear()
lcd.move_to(0,0)
lcd.putstr("ALARM DIRESET")
lcd.move_to(0,1)
lcd.putstr("STATUS : AMAN")
while reset_btn.value() == 0:
time.sleep_ms(10)
if time.ticks_diff(now, last_v5_check) >= 2000:
if blynk_read_v5() == "1":
system_latched_alarm = False
buzzer.off()
led_red.off()
led_green.on()
ref_pitch, ref_roll = get_pitch_roll()
blynk_write("V5", 0)
blynk_write("V1", "AMAN")
send_telegram("✅ *ALARM RESET*: Sistem telah dinonaktifkan kembali oleh petugas via Blynk.")
last_blink = now
last_v5_check = now
time.sleep_ms(50)