Mesh Beacon — ESP32 + 915 MHz LoRa Mesh with Solar, LTE Gateway & Check-In Button (GamerzCrave)
OFF-GRID COMMSLoRa 915 MHzSOLAR

Mesh Beacon — Neighborhood LoRa Mesh with Solar Trickle & LTE SMS/Email Gateway

Operational, repeatable build: ESP32 + LoRa (US-915), solar-trickled nodes, a status board with a check-in button, and an LTE bridge that forwards critical messages to SMS/email when the internet resurfaces.

What you’re building

  • Nodes (x3+) — ESP32+LoRa radios flashed with Meshtastic, 915 MHz antennas, solar-charged 18650s.
  • Repeater — same hardware, elevated placement, router role enabled.
  • Gateway — Meshtastic USB radio + mini PC/Raspberry Pi + LTE router; Python bridge to SMS/Email.
  • Status Board — small display shows last messages; big pushbutton sends “I’m OK / Need help”.

Standards based, legal-use aware (FCC Part 15). Region set to US915 with proper power/channel presets.

Bill of Materials (core)

LoRa NodesLILYGO T-Beam (ESP32 + SX1262/127x, 915 MHz) or Heltec WiFi LoRa 32 V2
Antennas915 MHz whip (keep matched for US-915)
Solar (node)6 V 5–10 W panel → Adafruit BQ24074 Solar Li-ion charger → 18650 → 5 V boost
Gateway LTEGL.iNet router (USB LTE or built-in) + SIM; or USB LTE modem to mini PC
Status BoardRaspberry Pi + 7″ HDMI or any small monitor; big momentary pushbutton

Choose US-915 hardware and set the Meshtastic region to US during initial config.

Regulatory sanity & radio plan (US-915)

  • Unlicensed band: 902–928 MHz under FCC Part 15; devices must not cause harmful interference and must accept interference. Use certified modules/boards and follow antenna/power limits in the firmware presets.
  • Meshtastic Region: set to US (band 902–928 MHz). Use LongFast default unless you need LongSlow for extreme range. Avoid custom overrides until your basics work.

References: FCC Part 15; LoRaWAN US915 regional parameters (channelization & band); Meshtastic radio settings.

Node Power (solar trickle)

Panel6 V 5–10 W mono panel
ChargerAdafruit BQ24074 Solar Li-ion (smart load-sharing)
Battery18650 Li-ion 3000–3500 mAh (protected)
BoostPololu U3V12F5 5 V step-up to power the ESP32 board
FuseInline 2 A on battery +
Solar 6V → BQ24074 VIN BQ24074 BATT → 18650 BQ24074 LOAD (~3.7–4.4V) → 5V Boost → ESP32 5V Ground common. Keep leads short. Add weather hood.

Gateway Power (bigger)

Battery12 V LiFePO₄ 10–20 Ah
Solar100 W panel → Victron SmartSolar 75/15
LoadsMeshtastic USB radio + Pi/mini-PC + LTE router
FuseBlade/MIDI fuses near battery +
Panel → MPPT → 12V LiFePO₄ → 12V bus 12V → Pi (buck 12→5V) ; 12V → LTE router; Pi USB → Meshtastic radio.

Wiring Maps (ASCII)

[NODE SOLAR] 6V Panel ──► BQ24074 VIN 18650 ──► BQ24074 BATT BQ24074 LOAD ──► 5V Boost ──► ESP32/T-Beam 5V GND all common (Inline 2A fuse on battery +; weatherproof box; strain relief) [REPEATER] Same as node; mount high (roof/mast). Meshtastic Device Role: Router/Repeater. External 915 MHz antenna. [GATEWAY] 12V LiFePO₄ ─► Fuse ─► DC bus Bus ─► Victron MPPT (from panel) Bus ─► LTE router (12V) Bus ─► Pi / mini-PC (buck 12→5V @3A) Pi USB ─► Meshtastic radio (Heltec/T-Beam) Pi runs Python bridge to SMS/Email.

Step-by-Step — Flash & Configure Meshtastic

  1. Flash firmware: Connect board via USB, open flasher.meshtastic.org in Chrome/Edge, select device, flash latest stable. Never power the radio without the antenna attached.
  2. Initial config: Using the app or web client/CLI, set Region = US, confirm 915 MHz band. Keep LongFast preset initially.
  3. Channels: Create a private primary channel (your neighborhood). Share via QR with neighbors. Optionally add a public secondary for discovery.
  4. Roles: On the high node, set Device Role = Router or Repeater; enable Store & Forward on fixed nodes if you want delayed delivery.
  5. Power tuning: Start at default TX power; only raise if needed. Follow local limits.

Docs: Web flasher + initial config + channels + radio presets are all in Meshtastic’s official docs.

“I’m OK” Check-In Button (no phone needed)

  1. Wire a normally-open pushbutton between GND and an unused GPIO (e.g., GPIO 26 on T-Beam).
  2. In Meshtastic, enable the Canned Message module:
    • Input Source: scanAndSelect
    • Input Broker Pin Press: your GPIO
    • Preset list: “OK”, “Need help: water”, “Need help: medical”
  3. Press: cycles the presets; long-press: sends.

Module supports buttons/encoders; see docs for exact GPIOs per board.

Status Board (Pi + USB radio)

  1. Plug your Meshtastic node into the Pi via USB.
  2. Install Python libs: pip install meshtastic twilio sendgrid.
  3. Run the bridge script below to print the last 50 messages on screen and forward alerts to SMS/Email when LTE is up.

US SMS: comply with Twilio 10DLC rules; verify numbers/senders.

Gateway Bridge — Python (SMS/Email on LTE)

Create /opt/meshbridge/bridge.py, set env vars, then make a systemd service (unit file included below).

#!/usr/bin/env python3 import os, time, json, socket import meshtastic import meshtastic.serial_interface from twilio.rest import Client from sendgrid import SendGridAPIClient from sendgrid.helpers.mail import Mail TWILIO_SID = os.getenv(“TWILIO_ACCOUNT_SID”,””) TWILIO_TOKEN = os.getenv(“TWILIO_AUTH_TOKEN”,””) TWILIO_FROM = os.getenv(“TWILIO_NUMBER”,””) SMS_NOTIFY = [n.strip() for n in os.getenv(“SMS_NOTIFY”,”+15551234567″).split(“,”)] SENDGRID_KEY = os.getenv(“SENDGRID_API_KEY”,””) EMAIL_FROM = os.getenv(“EMAIL_FROM”,”mesh@gamerzcrave.local”) EMAIL_NOTIFY = [e.strip() for e in os.getenv(“EMAIL_NOTIFY”,”alerts@example.com”).split(“,”)] KEYWORDS = os.getenv(“ALERT_WORDS”,”ALERT,HELP,911,SOS,MEDICAL,WATER”).split(“,”) def has_inet(): try: socket.create_connection((“1.1.1.1”, 53), timeout=2).close() return True except Exception: return False def send_sms(body): if not (TWILIO_SID and TWILIO_TOKEN and TWILIO_FROM): return try: cli = Client(TWILIO_SID, TWILIO_TOKEN) for n in SMS_NOTIFY: cli.messages.create(from_=TWILIO_FROM, to=n, body=body) except Exception as e: print(“SMS error:”, e) def send_email(subject, body): if not SENDGRID_KEY: return try: sg = SendGridAPIClient(SENDGRID_KEY) for dst in EMAIL_NOTIFY: mail = Mail(from_email=EMAIL_FROM, to_emails=dst, subject=subject, plain_text_content=body) sg.send(mail) except Exception as e: print(“Email error:”, e) def on_text(packet, interface): rx = packet.get(“decoded”,{}).get(“text”,””) fr = packet.get(“fromId”,””) tm = packet.get(“rxTime”,0) msg = f”[{time.strftime(‘%Y-%m-%d %H:%M:%S’, time.localtime(tm))}] {fr}: {rx}” print(msg, flush=True) # alert routing if any(k.strip().lower() in rx.lower() for k in KEYWORDS): if has_inet(): send_sms(f”Mesh Alert: {rx} ({fr})”) send_email(“Mesh Alert”, msg) if __name__ == “__main__”: iface = meshtastic.serial_interface.SerialInterface() # auto-detect /dev/ttyUSB* iface.start() pub = iface.pub sub = iface.sub # subscribe to text messages sub.onMessage(on_text, “meshtastic.receive.text”) print(“MeshBridge started.”) try: while True: time.sleep(1) except KeyboardInterrupt: pass

systemd unit (auto-start)

# /etc/systemd/system/meshbridge.service [Unit] Description=Meshtastic SMS/Email Bridge After=network-online.target [Service] Environment=TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxx Environment=TWILIO_AUTH_TOKEN=xxxxxxxxxxxxxxxx Environment=TWILIO_NUMBER=+15551234567 Environment=SMS_NOTIFY=+15559876543,+15557654321 Environment=SENDGRID_API_KEY=SG.xxxxxxxxxxxxx Environment=EMAIL_FROM=mesh@gamerzcrave.local Environment=EMAIL_NOTIFY=ops@example.com Environment=ALERT_WORDS=ALERT,HELP,911,SOS,MEDICAL,WATER ExecStart=/usr/bin/python3 /opt/meshbridge/bridge.py Restart=always User=pi WorkingDirectory=/opt/meshbridge [Install] WantedBy=multi-user.target

Node Setup — Step-by-Step

  1. Assemble power: panel→BQ24074→18650→5 V boost→ESP32 5 V. Verify 5.0 V, polarity, and fusing.
  2. Flash Meshtastic via Web Flasher; pair the phone or use CLI; set Region=US.
  3. Create your private channel; share QR; keep LongFast.
  4. Enable canned messages on the node with the button wiring. Test sends.
  5. Weatherproof box, strain-relief, desiccant. Mount with the antenna vertical.

Repeater/Gateway — Step-by-Step

  1. Mount repeater high; set Device Role = Router/Repeater. Optional: enable Store & Forward.
  2. Gateway: wire 12 V system + MPPT + LTE router + Pi. Boot.
  3. Attach USB Meshtastic radio; run pip install meshtastic twilio sendgrid.
  4. Drop the Python script, enable the systemd unit, reboot. Send a test “ALERT Water at 5th & Pine”.
  5. Verify SMS/Email receipt. If no LTE, message stays on the mesh only; retries when back online.

Operational Checks

  • Range walk: Send canned message every 100 m; log hops on status board.
  • Power audit: Sunny/overcast overnight; confirm nodes don’t brown-out.
  • Failover drill: Kill LTE; confirm mesh still passes messages; restore LTE; confirm SMS bursts arrive.
  • Noise hygiene: Don’t spam the mesh; canned messages keep airtime light. Use Router role on fixed nodes only.

Quick-Start Card (print)

  1. Turn on nodes; antenna vertical; battery above 25%.
  2. Check the status board for last traffic.
  3. Press the big button to send “OK”. Long-press cycles messages (“Need water/medical”).
  4. If LTE is up, alerts mirror to SMS/email; if not, they still traverse the mesh.
  5. Solar: face south (N. hemisphere), tilt ~latitude; secure cables.

Bill of Materials — Links & Notes

Radios

Power (node)

  • Adafruit BQ24074 Solar Li-ion charger. ProductGuide (load-sharing)
  • Pololu U3V12F5 5 V step-up. Specs

Mesh/Gateway Software

LTE & Email/SMS

  • GL.iNet cellular setup (USB modem & built-in). Docs v4
  • Twilio Programmable SMS Quickstart. Docs
  • SendGrid Email API Quickstart (Python). Docs

Solar (gateway)

Legal & Safety

  • Operate under FCC Part 15; do not exceed allowed power; your device must accept interference.
  • Always attach the antenna before powering the radio.
  • Use protected 18650 cells, correct polarity, and fuses near sources.
  • Respect channel plans and duty-cycle etiquette; avoid spamming the mesh.
© GamerzCrave — Build it once, keep comms when everything else goes quiet.
Scroll to Top