Files
PiDoorbell/main.py
2023-11-05 21:05:16 +01:00

156 lines
3.9 KiB
Python

import rp2
import network
import ubinascii
import machine
from machine import Pin
from time import sleep
import urequests as requests
import time
from secrets import secrets
import socket
# Set country to avoid possible errors
rp2.country('HU')
print('Starting up...')
wlan = network.WLAN(network.STA_IF)
# Define blinking function for onboard LED to indicate error codes
def blink_onboard_led(num_blinks):
led = machine.Pin('LED', machine.Pin.OUT)
for i in range(num_blinks):
led.value(1)
time.sleep_ms(200)
led.value(0)
time.sleep_ms(200)
def connect_wifi():
wlan.active(True)
# If you need to disable powersaving mode
# wlan.config(pm = 0xa11140)
# See the MAC address in the wireless chip OTP
mac = ubinascii.hexlify(network.WLAN().config('mac'),':').decode()
print('mac = ' + mac)
# Other things to query
# print(wlan.config('channel'))
# print(wlan.config('essid'))
# print(wlan.config('txpower'))
# Load login data from different file for safety reasons
ssid = secrets['ssid']
pw = secrets['pw']
wlan.connect(ssid, pw)
# Wait for connection with 10 second timeout
timeout = 10
while timeout > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
timeout -= 1
print('Waiting for connection...')
time.sleep(1)
# Handle connection error
# Error meanings
# 0 Link Down
# 1 Link Join
# 2 Link NoIp
# 3 Link Up
# -1 Link Fail
# -2 Link NoNet
# -3 Link BadAuth
wlan_status = wlan.status()
blink_onboard_led(wlan_status)
if wlan_status != 3:
raise RuntimeError('Wi-Fi connection failed')
else:
print('Connected')
status = wlan.ifconfig()
print('ip = ' + status[0])
def disconnect_wifi():
wlan.disconnect()
wlan.active(False)
wlan.deinit()
print('Disconnected')
def send_notification(notify_url):
print('Sending notification to ' + notify_url + '...')
# Send notification
request = requests.post(notify_url, data="Csengo", headers={
'Title': 'Dany Csengo',
'Priority': '5',
'X-Tags': 'bell'
})
print(request.content)
request.close()
def set_cpu_to_high_freq():
machine.freq(125000000)
def set_cpu_to_low_freq():
machine.freq(20000000)
door_bell = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
debug_mode = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_DOWN)
doorbell_last_state = False
doorbell_current_state = False
debug_last_state = False
debug_current_state = False
""" led = Pin('LED', Pin.OUT)
print('Blinking LED Example')
while True:
led.value(not led.value())
sleep(0.5) """
led = Pin('LED', Pin.OUT)
disconnect_wifi()
blink_onboard_led(2)
print('Changing frequency and beginning loop...')
set_cpu_to_low_freq()
while True:
doorbell_current_state = door_bell.value()
debug_current_state = debug_mode.value()
if debug_last_state == False and debug_current_state == True:
set_cpu_to_high_freq()
print('Frequency is set to default')
blink_onboard_led(5)
debug_last_state = debug_current_state
if doorbell_last_state == False and doorbell_current_state == True:
set_cpu_to_high_freq()
led.value(1)
connect_wifi()
try:
send_notification('https://ntfy.sh/adix-dany-doorbell-test')
except:
print('Error sending notification')
blink_onboard_led(3)
send_notification('https://ntfy.adix.link/adix-dany-doorbell-test')
disconnect_wifi()
led.value(0)
time.sleep_ms(200)
blink_onboard_led(1)
# Sleep for 5 sec to avoid multiple triggers AND too frequent frequency change
print('Waiting 5 seconds before changing frequency...')
time.sleep(5)
set_cpu_to_low_freq()
doorbell_last_state = doorbell_current_state
time.sleep_ms(200)