Preview build — page text is a draft awaiting human review. Code badges come from real compiles. The flasher is real but not yet hardware-tested; the Playground is still a preview.
Help Button: the finished build
Pico WHome automation

Help button for elderly parents that alerts the whole family (Pico W)

One press sends an urgent alert to every family member’s phone — with a 5 s cancel.

Difficulty
Easy
Build time
1 h
Parts cost
₹1,535 · $18
Verified — micropython (mpy-cross v1.29.0), 3 Nov 2026Compile-only

Community draft — report a mistake

Parts list

PartQtyApprox.Buy
Raspberry Pi Pico W (MicroPython installed)1₹620Buy Raspberry Pi Pico W (MicroPython installed)
Large red mushroom push button (22 mm, momentary)1₹150Buy Large red mushroom push button (22 mm, momentary)
Active buzzer module1₹25Buy Active buzzer module
2-core flexible wire (to the bedside, 2 m)1₹40Buy 2-core flexible wire (to the bedside, 2 m)
Small power bank that charges while powering (pass-through), or a 5 V adapter1₹600Buy Small power bank that charges while powering (pass-through), or a 5 V adapter
Box for the Pico and buzzer1₹100Buy Box for the Pico and buzzer
Total₹1,535

Affiliate disclosure: “Buy” links may earn FlashReady a small commission at no extra cost to you. Prices are indicative.

Wiring

Raspberry Pi Pico WOnly the pins used are shown · 3.3 V logicPush button (6 mm tactile switch)Active buzzer module (high-level trigger)GNDGP14GP153V312I/OVCCGND
Every connection
Raspberry Pi Pico WPart · pinWireNotes
GP14Push button (6 mm tactile switch) · 1yellowInternal pull-up — physical pin 19
GNDPush button (6 mm tactile switch) · 2black
GP15Active buzzer module (high-level trigger) · I/OorangePhysical pin 20
3V3Active buzzer module (high-level trigger) · VCCred
GNDActive buzzer module (high-level trigger) · GNDblack

Board quirks: This is a convenience alert, not a medical alarm service. It depends on home Wi-Fi, the internet and someone seeing the phone. Keep emergency numbers (112) on a card next to the button and make sure your parent knows to call too. Every family member installs the free <strong>ntfy</strong> app and subscribes to the same long, random topic. Alerts are sent with priority “urgent”, which ntfy can show as a loud full-screen notification even on silent — turn that on in the app. Power it from a pass-through power bank or put the Wi-Fi router and the adapter on the inverter: power cuts are exactly when an old person may fall in the dark. Mount the button where it can be reached from the bed and from the floor beside it, not behind the headboard.

Code

main.pyMicroPythonOpen in PlaygroundOpen in PlaygroundFlash
# Help / panic button for an elderly parent - Raspberry Pi Pico W (MicroPython).
# Big push button between GP14 and GND (internal pull-up). Buzzer module: I/O -> GP15, VCC -> 3V3.
# Press: 3 short beeps, then 5 s to cancel (press again). Then an URGENT ntfy alert goes to every
# phone subscribed to the topic. Hold 3 s: an "I'm OK" message. A daily "button is working" check-in.
from machine import Pin
import time
import network
import json

CANCEL_S = 5
HOLD_OK_S = 3
DAILY_S = 24 * 3600

WIFI_SSID = "your-wifi"
WIFI_PASS = "your-password"
NTFY_TOPIC = "your-private-topic"  # https://ntfy.sh/<topic> - every family member subscribes

# The FlashReady flasher saves your settings to /settings.json; they win over the lines above.
try:
    with open("/settings.json") as f:
        _s = json.load(f)
except (OSError, ValueError):
    _s = {}
WIFI_SSID = _s.get("wifi_ssid") or WIFI_SSID
WIFI_PASS = _s.get("wifi_pass") or WIFI_PASS
NTFY_TOPIC = _s.get("ntfy_topic") or NTFY_TOPIC
ALERTS = WIFI_SSID != "your-wifi" and NTFY_TOPIC != "your-private-topic"
if not ALERTS:
    print("Phone alerts off - no Wi-Fi name or ntfy topic set. Flash from flashready.in or type them into main.py.")

button = Pin(14, Pin.IN, Pin.PULL_UP)
buzzer = Pin(15, Pin.OUT, value=0)
led = Pin("LED", Pin.OUT)
wlan = network.WLAN(network.STA_IF)


def beep(times, on_s=0.12, off_s=0.12):
    for _ in range(times):
        buzzer.on()
        time.sleep(on_s)
        buzzer.off()
        time.sleep(off_s)


def wifi_up():
    if not ALERTS:
        return False
    if not wlan.isconnected():
        wlan.active(True)
        wlan.connect(WIFI_SSID, WIFI_PASS)
        for _ in range(30):
            if wlan.isconnected():
                break
            time.sleep(0.5)
    return wlan.isconnected()


def notify(message, priority, tags):
    print(message)
    if not wifi_up():
        return False
    try:
        import requests
    except ImportError:
        import urequests as requests
    try:
        r = requests.post("https://ntfy.sh/" + NTFY_TOPIC, data=message,
                          headers={"Title": "Help button", "Priority": priority, "Tags": tags})
        ok = r.status_code == 200
        r.close()
        return ok
    except OSError as e:
        print("ntfy failed:", e)
        return False


def pressed():
    """0 = no, 1 = short press, 2 = held HOLD_OK_S."""
    if button.value():
        return 0
    time.sleep_ms(30)
    if button.value():
        return 0
    t0 = time.ticks_ms()
    while not button.value():
        if time.ticks_diff(time.ticks_ms(), t0) > HOLD_OK_S * 1000:
            while not button.value():
                time.sleep_ms(10)
            return 2
        time.sleep_ms(10)
    return 1


def help_alert():
    beep(3)
    print("Help pressed - {} s to cancel".format(CANCEL_S))
    t0 = time.ticks_ms()
    while time.ticks_diff(time.ticks_ms(), t0) < CANCEL_S * 1000:
        led.toggle()
        if pressed():
            beep(1, 0.8)
            print("Cancelled")
            led.off()
            return
        time.sleep_ms(100)
    for attempt in range(3):
        if notify("HELP needed at home - the help button was pressed. Please call now.", "urgent", "rotating_light,sos"):
            beep(2, 0.5, 0.2)  # two long beeps: the family has been told
            print("Help alert sent")
            led.on()
            return
        time.sleep(5)
    print("Could not send the alert")
    beep(10, 0.05, 0.05)  # fast beeps: not sent - use the phone


last_daily = time.time()
notify("Help button is on", "low", "white_check_mark")
while True:
    p = pressed()
    if p == 1:
        help_alert()
    elif p == 2:
        if notify("All OK - checked in with the help button.", "low", "white_check_mark"):
            beep(1, 0.4)
    if time.time() - last_daily > DAILY_S:
        last_daily = time.time()
        notify("Daily check: the help button is powered and online.", "min", "white_check_mark")
    time.sleep_ms(20)

Compiled for picow on micropython (mpy-cross v1.29.0) · 3 Nov 2026

How it works

Many elderly parents in India live alone or spend the day alone while children are at work or in another city. A fall at night, chest pain, dizziness — they may not be able to find or unlock a phone. A big red button by the bed is something anyone can press.

How it works

The button connects GP14 to GND; MicroPython’s internal pull-up keeps it HIGH until it is pressed.

  • Press → three short beeps, then a 5-second cancel window (the on-board LED blinks). Press again to cancel — one long beep. Otherwise the Pico W sends an urgent ntfy.sh message: “HELP needed at home – the help button was pressed. Please call now.” Two long beeps confirm it was sent; ten fast beeps mean it failed after three tries, so use the phone.
  • Hold for 3 seconds → an “All OK – checked in” message with low priority — handy for a morning check-in.
  • Once a day → a silent “the help button is powered and online” message, so the family notices if it ever stops working.

Why these parts

  • Pico W + MicroPython — Wi-Fi and HTTPS in a short, readable script, no app or server needed.
  • ntfy.sh — free push notifications to any number of phones, with urgent priority and no sign-up.
  • A big mushroom button — easy to find in the dark and to press with a shaky hand.

Setting it up

Install MicroPython on the Pico W, flash this project from the page and fill in your Wi-Fi name, password and a long random ntfy topic. Subscribe to the topic on every family member’s phone and test both the press (then let it send) and the cancel.

India notes

If your parent is more comfortable with Hindi or a regional language, change the message text in main.py — ntfy shows Unicode fine. Keep the button and the buzzer at a volume your parent can hear; many elderly people have reduced hearing at high pitches, so a lower-pitched buzzer may be better.

Troubleshooting

Fast beeps after pressing

The alert couldn’t be sent three times — Wi-Fi or internet down. The console in Thonny shows why. Check that the router is on the inverter and the Pico W is in range.

Nobody got the alert

Everyone must subscribe to exactly the same topic (it is case-sensitive). Send a test with a long press (“All OK”) and check every phone receives it.

It triggered by itself

A long, unshielded wire to the button can pick up noise. Keep it short, twist the two cores, or add a 100 nF capacitor across the button.

Upgrades

  • Add a second button in the bathroom (on GP13), with the room name in the alert.
  • Call a phone through a SIM800L as a backup when Wi-Fi is down.
  • Add a fall sensor (MPU-6050) worn on a lanyard, with the same alert path.

↑↓ to move · Enter to open