15 de julio de 2026 · 10 min
Alarma casera con ESP32 y sensor PIR: aviso al celular en segundos
Un sensor de movimiento, un ESP32 y un bot de Telegram: cuando algo se mueve en tu casa, garaje o local, te llega el mensaje al toque. Sin abonos, sin nube paga, sin instalador.
Las alarmas comerciales con monitoreo cuestan un abono todos los meses. Este proyecto no reemplaza una alarma profesional para un comercio con mercadería valiosa — pero para el garaje, el quincho, la casilla del fondo o saber si alguien entró a tu pieza, funciona igual de bien y cuesta lo que cuestan dos componentes: cuando el sensor PIR detecta movimiento, el ESP32 te manda un mensaje de Telegram al celular. Estés donde estés.
Lista de compra
| Componente | Cantidad | Para qué |
|---|---|---|
| ESP32 DevKit | 1 | WiFi + cerebro |
| Sensor PIR HC-SR501 | 1 | Detecta movimiento hasta ~7 m |
| Buzzer activo 5V | 1 | Sirena local (opcional) |
| Fuente 5V 2A | 1 | Alimentación permanente |
| Cables dupont | 1 juego | Conexionado |
Preparar el bot de Telegram (5 minutos, gratis)
- En Telegram, buscá @BotFather, mandale
/newboty seguí los pasos. Te da un token (guardalo). - Buscá @userinfobot y mandale cualquier cosa: te responde tu chat ID (un número).
- Abrile chat a tu bot nuevo y mandale un “hola” (si no, no puede escribirte primero).
Con token + chat ID, el ESP32 ya puede hablarte.
Conexionado
- PIR: VCC → VIN (5V) · OUT → GPIO 27 · GND → GND
- Buzzer: (+) → GPIO 26 · (−) → GND
- El PIR tiene dos potes: Sx (sensibilidad) y Tx (tiempo de salida). Arrancá con ambos al mínimo, girando apenas Sx.
El código
Instalá UniversalTelegramBot y ArduinoJson desde el gestor de librerías.
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
const char* WIFI_SSID = "TU_RED";
const char* WIFI_PASS = "TU_CLAVE";
const char* BOT_TOKEN = "123456:ABC-TU-TOKEN";
const char* CHAT_ID = "TU_CHAT_ID";
const int PIN_PIR = 27;
const int PIN_BUZZER = 26;
const unsigned long ENFRIAMIENTO_MS = 30000; // 1 aviso cada 30 s max
WiFiClientSecure cliente;
UniversalTelegramBot bot(BOT_TOKEN, cliente);
bool armada = true;
unsigned long ultimoAviso = 0;
unsigned long ultimoChequeo = 0;
void setup() {
pinMode(PIN_PIR, INPUT);
pinMode(PIN_BUZZER, OUTPUT);
digitalWrite(PIN_BUZZER, LOW);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) delay(300);
cliente.setInsecure(); // TLS sin validar certificado (suficiente aca)
bot.sendMessage(CHAT_ID, "Alarma en linea y armada.", "");
delay(60000); // el PIR necesita ~1 min para estabilizarse
}
void loop() {
// 1) deteccion
if (armada && digitalRead(PIN_PIR) == HIGH &&
millis() - ultimoAviso > ENFRIAMIENTO_MS) {
ultimoAviso = millis();
bot.sendMessage(CHAT_ID, "MOVIMIENTO detectado!", "");
digitalWrite(PIN_BUZZER, HIGH);
delay(3000);
digitalWrite(PIN_BUZZER, LOW);
}
// 2) comandos: /armar /desarmar /estado (cada 2 s)
if (millis() - ultimoChequeo > 2000) {
ultimoChequeo = millis();
int n = bot.getUpdates(bot.last_message_received + 1);
for (int i = 0; i < n; i++) {
if (bot.messages[i].chat_id != String(CHAT_ID)) continue; // solo vos
String txt = bot.messages[i].text;
if (txt == "/armar") { armada = true; bot.sendMessage(CHAT_ID, "Armada.", ""); }
if (txt == "/desarmar") { armada = false; bot.sendMessage(CHAT_ID, "Desarmada.", ""); }
if (txt == "/estado") { bot.sendMessage(CHAT_ID, armada ? "Armada." : "Desarmada.", ""); }
}
}
}
La manejás desde el mismo chat: /desarmar cuando llegás a casa, /armar cuando te vas, /estado para verificar.
Errores comunes
- Lluvia de falsos positivos el primer minuto. El HC-SR501 necesita ~60 segundos de estabilización al energizar. Nuestro código los espera; no lo saques.
- Falsos positivos permanentes: el PIR apuntando a una ventana con sol, una estufa o el paso de aire caliente dispara detecciones. Reubicalo mirando hacia el interior, lejos de fuentes de calor.
- Sensibilidad al máximo. Con Sx al tope detecta al gato del vecino a través del vidrio. Ajustalo con la puerta cerrada probando desde donde te importa detectar.
- El bot no responde: casi siempre es que nunca le mandaste el primer mensaje al bot (paso 3 de la preparación), o que el chat ID está mal.
Para llevarlo más lejos
- Sumá un segundo PIR (puerta + ventana) en otro GPIO: dos zonas con nombre propio en el aviso.
- Agregá un módulo de relés y que la alarma prenda las luces del patio al detectar movimiento.
- Con un DS18B20 extra, el mismo ESP32 te avisa si la heladera comercial del local se calienta — dos alarmas en una.
Todo en un pedido
ESP32, PIR, buzzer y fuente: todo en electronicabyp.com.ar con envío a todo el país. ¿Local comercial con varias zonas? Consultanos por WhatsApp y lo dimensionamos.
¿Necesitás los componentes de esta guía? Los encontrás en electronicabyp.com.ar — hacemos envíos a toda Argentina. Para cotizaciones por cantidad, escribinos por WhatsApp.