Componentes · 11 min de lectura

Sensor de vibración SW-420 con Arduino: golpes, alarma y aviso

Sensor de vibración SW-420 con Arduino: funcionamiento, sensibilidad, contar pulsos y medir duración, alarma antirrobo, límites sísmicos, MPU6050 y Telegram.

En los proyectos con un sensor de vibración y Arduino, la pieza más usada es el módulo SW-420, barato y sencillo. Con un solo pin digital te avisa de que una superficie se ha movido, alguien ha golpeado una puerta, se ha abierto un cajón o una máquina se ha puesto en marcha. El módulo lleva un interruptor de vibración de muelle, un comparador LM393 y un pequeño potenciómetro para ajustar la sensibilidad. Es fácil de usar, pero al primer intento casi todo el mundo choca con los mismos dos problemas: el sensor pierde algunas vibraciones y a veces da la alarma sin motivo.

En esta guía aprenderás cómo funciona el contacto de muelle del SW-420, por qué su salida llega en forma de pulsos cortos y cómo ajustar bien la sensibilidad. Después contaremos los pulsos con una interrupción, mediremos cuánto dura y qué fuerza tiene una sacudida y montaremos una alarma antirrobo que reduce las falsas alarmas. También veremos por qué la idea de un avisador de terremotos no es tan sencilla como parece y qué aporta un acelerómetro MPU6050. Por último, enviaremos un mensaje de Telegram al móvil con un ESP32 cuando se detecte vibración y escribiremos código MicroPython para la Raspberry Pi Pico.

Módulo sensor de vibración SW-420
Módulo SW-420: interruptor de vibración de muelle con carcasa metálica, comparador LM393, potenciómetro de sensibilidad y pines VCC, GND y DO.

¿Qué es el sensor de vibración SW-420 y cómo funciona?

El verdadero elemento sensor del módulo es un interruptor de vibración normalmente cerrado (NC) dentro de una pequeña cápsula metálica cilíndrica. Dentro hay un muelle y una pieza conductora; cuando el sensor está quieto se tocan y el contacto está cerrado. Cuando el sensor se sacude, el muelle oscila y el contacto se abre y se cierra en ráfagas muy cortas, cada una de menos de un milisegundo. El interruptor no tiene dirección preferente, así que reacciona a la vibración venga de donde venga. El LM393 del módulo compara la tensión que genera este interruptor con un umbral fijado por el potenciómetro y produce una salida digital limpia (DO). En la mayoría de los módulos DO está a LOW en reposo y a HIGH durante la vibración, y el LED de señal se apaga o parpadea con la vibración; en algunas placas clónicas la lógica puede ir al revés, así que prueba antes tu módulo con el Monitor Serie.

CaracterísticaValor
Elemento sensorSW-420, interruptor de vibración de muelle normalmente cerrado
Alimentación3,3–5 V
SalidaDigital (DO), a través de un comparador LM393
Ajuste de sensibilidadPotenciómetro de la placa
DirecciónSin dirección preferente, responde desde cualquier lado
Señal de salidaRáfagas de pulsos cortos durante la vibración
PinesVCC, GND, DO
Tamaño de la placaUnos 32 × 14 mm, un agujero de montaje M3

Conexión del SW-420 a Arduino

Pin del móduloArduino UnoESP32Raspberry Pi Pico
VCC5V3V33V3(OUT)
GNDGNDGNDGND
DOD2 (pin de interrupción INT0)GPIO 27GP15
En el ESP32 y la Pico alimenta siempre el módulo a 3,3 V. La salida del LM393 sube hasta la tensión de alimentación del módulo; si lo alimentas a 5 V, el pin DO también dará 5 V y puede dañar una entrada de 3,3 V. El módulo funciona bien a 3,3 V; solo puede que tengas que volver a ajustar la sensibilidad con esa tensión.

Sensibilidad: ¿cómo se ajusta el potenciómetro?

El potenciómetro fija el umbral del comparador. Si queda demasiado sensible, el sensor detecta un vaso que se deja en la mesa, un camión que pasa o incluso la vibración de su propio zumbador; si queda demasiado basto, solo reacciona a golpes fuertes. Para ajustarlo bien, atornilla el módulo a la superficie donde lo vas a usar y observa el LED de señal. Gira el potenciómetro hasta el punto en que el LED se mantiene fijo en reposo pero reacciona cuando das un golpecito suave con el dedo; después baja un poquito la sensibilidad para dejar un margen de seguridad. Este ajuste depende del material: el mismo ajuste puede ser muy sensible en una mesa de madera y sordo en una pared de hormigón.

Primera prueba: detectar la vibración y captar pulsos cortos

El primer código de un principiante suele leer el pin con digitalRead() dentro de loop() y encender un LED al ver HIGH. Funciona con un golpe fuerte, pero con vibraciones suaves casi nunca pasa nada, porque la salida del SW-420 puede estar a HIGH solo unos cientos de microsegundos y, si en ese momento loop() está ocupado con Serial.print() o delay(), el pulso se pierde. La solución es atrapar el pulso con una interrupción y anotar el momento. El código de abajo guarda la hora de cada pulso y mantiene el LED encendido 1 segundo tras el último, así tu ojo puede ver incluso una vibración brevísima.

C++ (Arduino IDE)
1const byte VIB_PIN = 2;                  // SW-420 DO (INT0)
2const byte LED_PIN = 13;                 // dahili LED / onboard LED
3const unsigned long HOLD_MS = 1000;      // son darbeden sonra LED süresi / LED time after the last pulse
4
5volatile unsigned long lastPulseMs = 0;
6volatile bool pulseSeen = false;
7
8void onVibration() {                     // her darbede çalışır / runs on every pulse
9  lastPulseMs = millis();
10  pulseSeen = true;
11}
12
13void setup() {
14  pinMode(VIB_PIN, INPUT);
15  pinMode(LED_PIN, OUTPUT);
16  attachInterrupt(digitalPinToInterrupt(VIB_PIN), onVibration, RISING);   // LOW → HIGH geçişi / LOW to HIGH edge
17  Serial.begin(9600);
18}
19
20void loop() {
21  noInterrupts();
22  unsigned long last = lastPulseMs;
23  bool seen = pulseSeen;
24  pulseSeen = false;
25  interrupts();
26
27  if (seen) Serial.println(F("Titresim / vibration"));
28  digitalWrite(LED_PIN, (last > 0 && millis() - last < HOLD_MS) ? HIGH : LOW);
29}

La interrupción se ejecuta en cada flanco en que el pin pasa de LOW a HIGH; en el Uno solo D2 y D3 ofrecen este tipo de interrupción externa. Si la lógica de tu módulo va al revés, escribe FALLING en vez de RISING; como las ráfagas tienen flancos de subida y de bajada, el recuento no cambia. La función de interrupción es lo más corta posible y no usa Serial; la impresión se hace en loop(). Desactivar un momento las interrupciones al leer las variables en loop() evita que una variable de varios bytes cambie a mitad de lectura y se lea corrupta.

Contar pulsos y medir la duración: ¿cuánto duró y qué fuerza tuvo la sacudida?

El SW-420 no mide la aceleración, pero el número de pulsos que genera da una buena idea de la fuerza de una sacudida: un golpecito produce unos pocos pulsos, un portazo decenas y la vibración de un taladro cientos por segundo. El código de abajo cuenta los pulsos con una interrupción y los agrupa en eventos: el primer pulso abre un evento y, si no llega otro en 500 ms, el evento termina. Al final de cada evento muestra la duración, el total de pulsos y la densidad de pulsos por segundo. Así puedes sacar la «huella» de los eventos de tu entorno y basar el umbral de alarma en medidas y no en suposiciones.

C++ (Arduino IDE)
1const byte VIB_PIN = 2;                   // SW-420 DO (INT0)
2const unsigned long QUIET_MS = 500;       // bu kadar sessizlik olayı bitirir / this much silence ends an event
3
4volatile unsigned long pulseCount = 0;
5volatile unsigned long lastPulseMs = 0;
6
7bool inEvent = false;
8unsigned long eventStart = 0;
9unsigned long eventStartCount = 0;
10
11void onVibration() {
12  pulseCount++;
13  lastPulseMs = millis();
14}
15
16void setup() {
17  pinMode(VIB_PIN, INPUT);
18  attachInterrupt(digitalPinToInterrupt(VIB_PIN), onVibration, RISING);
19  Serial.begin(9600);
20  Serial.println(F("Sure(ms)  Darbe/pulses  Darbe/sn  (pulses/s)"));
21}
22
23void loop() {
24  noInterrupts();
25  unsigned long count = pulseCount;
26  unsigned long last = lastPulseMs;
27  interrupts();
28
29  if (!inEvent && count != eventStartCount) {      // yeni olay başladı / a new event started
30    inEvent = true;
31    eventStart = last;
32  }
33  if (inEvent && millis() - last > QUIET_MS) {     // olay bitti / the event is over
34    unsigned long duration = last - eventStart;
35    unsigned long pulses = count - eventStartCount;
36    float density = duration > 0 ? pulses * 1000.0 / duration : pulses;
37    Serial.print(duration);
38    Serial.print(F("        "));
39    Serial.print(pulses);
40    Serial.print(F("           "));
41    Serial.println(density, 0);
42    eventStartCount = count;
43    inEvent = false;
44  }
45}

Ejecuta el código, golpea la mesa de distintas formas, abre un cajón, cierra la puerta y apunta los números. Con un golpe corto, la duración suele ser casi cero y los pulsos son de una cifra; una vibración larga hace crecer tanto la duración como el número de pulsos. Usar los dos valores juntos es mucho más potente que un simple «hay vibración o no»: por ejemplo, en un sensor montado en una caja fuerte, la regla «evento de al menos 300 ms con al menos 20 pulsos» puede descartar los pasos de alguien que pasa al lado y aun así detectar a quien intenta forzar la caja.

Alarma antirrobo con el SW-420 y cómo reducir las falsas alarmas

Un SW-420 colocado en el cristal de una ventana, una bici, un cajón o una caja fuerte puede ser el corazón de una alarma antirrobo sencilla. Lo que distingue una buena alarma de una mala no es tanto detectar como saber descartar las falsas alarmas. El código de abajo lo hace en tres capas: tras activarla da 10 segundos de salida, no salta con un solo golpe sino cuando ve al menos 5 pulsos en 1 segundo e ignora los pulsos nuevos durante los 15 segundos que suena la sirena. La alarma se activa y desactiva con el botón de D4, el zumbador activo está en D8 y el LED de estado en D13. Para un sistema más completo, mira la guía de sistema de alarma con Arduino.

C++ (Arduino IDE)
1const byte VIB_PIN = 2;                       // SW-420 DO (INT0)
2const byte BUTTON_PIN = 4;                    // kur / kapat butonu, D4 ile GND arası / arm-disarm button
3const byte BUZZER_PIN = 8;                    // aktif buzzer / active buzzer
4const byte LED_PIN = 13;                      // durum LED'i / status LED
5const unsigned int MIN_PULSES = 5;            // pencerede gereken darbe / pulses needed in the window
6const unsigned long WINDOW_MS = 1000;         // sayım penceresi / counting window
7const unsigned long EXIT_DELAY_MS = 10000;    // kurduktan sonra çıkış süresi / exit delay after arming
8const unsigned long ALARM_MS = 15000;         // siren süresi / siren duration
9
10enum AlarmState { DISARMED, ARMING, ARMED, ALARM };
11AlarmState state = DISARMED;
12
13volatile unsigned int pulses = 0;
14unsigned long stateTime = 0;
15unsigned long windowStart = 0;
16unsigned long lastPress = 0;
17bool lastButton = HIGH;
18
19void onVibration() {
20  pulses++;
21}
22
23void setState(AlarmState s) {
24  state = s;
25  stateTime = millis();
26  digitalWrite(BUZZER_PIN, LOW);
27  noInterrupts();
28  pulses = 0;                                 // eski darbeleri sil / discard old pulses
29  interrupts();
30  windowStart = millis();
31}
32
33void setup() {
34  pinMode(VIB_PIN, INPUT);
35  pinMode(BUTTON_PIN, INPUT_PULLUP);
36  pinMode(BUZZER_PIN, OUTPUT);
37  pinMode(LED_PIN, OUTPUT);
38  attachInterrupt(digitalPinToInterrupt(VIB_PIN), onVibration, RISING);
39  Serial.begin(9600);
40}
41
42void loop() {
43  bool button = digitalRead(BUTTON_PIN);
44  if (button == LOW && lastButton == HIGH && millis() - lastPress > 200) {
45    lastPress = millis();
46    setState(state == DISARMED ? ARMING : DISARMED);
47    Serial.println(state == ARMING ? F("Kuruluyor / arming") : F("Kapatildi / disarmed"));
48  }
49  lastButton = button;
50
51  if (millis() - windowStart >= WINDOW_MS) {  // her saniye darbe sayısına bak / check the pulse count every second
52    noInterrupts();
53    unsigned int n = pulses;
54    pulses = 0;
55    interrupts();
56    windowStart = millis();
57    if (state == ARMED && n >= MIN_PULSES) {
58      setState(ALARM);
59      Serial.print(F("ALARM! darbe / pulses: "));
60      Serial.println(n);
61    }
62  }
63
64  switch (state) {
65    case DISARMED:
66      digitalWrite(LED_PIN, LOW);
67      break;
68    case ARMING:                              // hızlı yanıp sönme: çıkış süresi / fast blink: exit delay
69      digitalWrite(LED_PIN, (millis() / 250) % 2);
70      if (millis() - stateTime >= EXIT_DELAY_MS) setState(ARMED);
71      break;
72    case ARMED:
73      digitalWrite(LED_PIN, HIGH);
74      break;
75    case ALARM:                               // kesik kesik siren / intermittent siren
76      digitalWrite(BUZZER_PIN, (millis() / 300) % 2);
77      if (millis() - stateTime >= ALARM_MS) setState(ARMED);
78      break;
79  }
80}

Además del código, puedes hacer mucho para reducir las falsas alarmas:

  • Montaje firme: Fija el módulo a la superficie con un tornillo M3 o un adhesivo rígido; una placa suelta vibra por sí sola.
  • Aleja el zumbador: Si la sirena va en la misma placa o caja que el sensor, su propia vibración puede volver a disparar la alarma.
  • Ajusta la sensibilidad en su sitio: Regula el potenciómetro en la superficie donde quedará el sensor, no en la mesa de trabajo.
  • Cables cortos y sujetos: Los cables largos que cuelgan recogen ruido; si hace falta, pon 100 nF entre DO y GND.
  • Usa dos sensores: En un punto importante, exigir que dos sensores se activen juntos en poco tiempo reduce mucho las falsas alarmas.
  • Confirma con otro sensor: Combinar la vibración con un sensor de movimiento PIR o un sensor de puerta aumenta la fiabilidad.

¿Se puede hacer un avisador de terremotos con el SW-420? Límites y MPU6050

El avisador de terremotos es una de las ideas de proyecto más populares con un sensor de vibración y es un proyecto didáctico; pero conviene conocer sus límites. El SW-420 solo dice «algo se ha movido»: no puede medir la aceleración, la dirección ni la frecuencia de la sacudida. Por eso reacciona igual a un portazo, a un camión que pasa, a una lavadora centrifugando o a un terremoto real. Y lo más importante: un solo sensor solo detecta la sacudida cuando ya ha llegado hasta él. Los sistemas oficiales de alerta sísmica temprana combinan las medidas de muchas estaciones cercanas al epicentro y avisan a las zonas lejanas antes de que llegue la sacudida; un Arduino en casa no puede sustituirlos y no debe usarse como dispositivo de seguridad vital.

Si quieres que un proyecto sísmico tenga más sentido, pasa al módulo acelerómetro y giroscopio MPU6050. El MPU6050 mide la aceleración en tres ejes con 16 bits de resolución y rangos seleccionables de ±2 g a ±16 g. Así puedes calcular la aceleración máxima del suelo (PGA), distinguir un portazo de un movimiento del suelo largo mirando cuántos segundos dura la aceleración y su frecuencia, y guardar los datos para estudiarlos después. También tiene sentido usar los dos sensores juntos: el SW-420 espera consumiendo muy poco y despierta al microcontrolador con la primera vibración, y el MPU6050 hace la medida detallada.

Módulo acelerómetro y giroscopio MPU-6050
MPU-6050: acelerómetro y giroscopio de tres ejes por I2C. Mucho más adecuado que el SW-420 para medir la fuerza y la dirección de una sacudida.
CaracterísticaSW-420MPU6050
¿Qué mide?Solo si hay vibración o noAceleración y velocidad de giro en 3 ejes
SalidaPulsos digitales (DO)I2C, datos digitales de 16 bits
SensibilidadCon potenciómetro, poco finaPor software, de ±2 g a ±16 g
DirecciónNoSí (X, Y, Z)
Proyecto sísmicoSolo un aviso de «se ha movido»Aceleración máxima, duración y análisis de frecuencia
CódigoPocas líneas, sin libreríaNecesita librería y filtrado
PrecioMuy baratoBarato

Aviso por Telegram desde un ESP32 al detectar vibración

Con un ESP32, el sensor de vibración puede avisar a tu móvil cuando le pasa algo a una caja fuerte, una bici o una máquina mientras estás fuera de casa. Para ello crea un bot con BotFather en Telegram, consigue el token y tu propio chat ID e instala en el Arduino IDE las librerías UniversalTelegramBot y ArduinoJson; explicamos estos pasos en detalle en la guía del bot de Telegram con ESP32. El código de abajo cuenta los pulsos con una interrupción, envía un mensaje cuando ve al menos 5 pulsos en 1 segundo y espera al menos 60 segundos entre dos mensajes para que el móvil no se llene con decenas de avisos por minuto. Como el ESP32 tiene dos núcleos, el contador se protege con un cerrojo portMUX.

C++ (Arduino IDE)
1#include <WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5
6const char* WIFI_SSID = "AgAdi";               // Wi-Fi adın (2,4 GHz) / your Wi-Fi name (2.4 GHz)
7const char* WIFI_PASS = "Sifre123";            // Wi-Fi şifren / your Wi-Fi password
8#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"   // BotFather'ın verdiği token / token from BotFather
9#define CHAT_ID   "123456789"                  // kendi Telegram ID'n / your own Telegram ID
10
11const int VIB_PIN = 27;                        // SW-420 DO (modül 3V3 ile) / module powered from 3V3
12const unsigned long MIN_PULSES = 5;            // 1 sn'de gereken darbe / pulses needed in 1 s
13const unsigned long WINDOW_MS = 1000;
14const unsigned long COOLDOWN_MS = 60000;       // iki mesaj arası en az 60 sn / at least 60 s between messages
15
16volatile unsigned long pulseCount = 0;
17portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;
18unsigned long windowStart = 0;
19unsigned long lastAlert = 0;
20bool alertSent = false;
21
22WiFiClientSecure client;
23UniversalTelegramBot bot(BOT_TOKEN, client);
24
25void IRAM_ATTR onVibration() {                 // kesme fonksiyonu RAM'de / interrupt handler in RAM
26  portENTER_CRITICAL_ISR(&mux);
27  pulseCount++;
28  portEXIT_CRITICAL_ISR(&mux);
29}
30
31void setup() {
32  Serial.begin(115200);
33  pinMode(VIB_PIN, INPUT);
34  attachInterrupt(digitalPinToInterrupt(VIB_PIN), onVibration, RISING);
35
36  WiFi.mode(WIFI_STA);
37  WiFi.begin(WIFI_SSID, WIFI_PASS);
38  while (WiFi.status() != WL_CONNECTED) {
39    delay(500);
40    Serial.print(".");
41  }
42  Serial.println();
43  client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // api.telegram.org kök sertifikası / root certificate
44  bot.sendMessage(CHAT_ID, "Titreşim alarmı hazır / vibration alarm ready", "");
45  windowStart = millis();
46}
47
48void loop() {
49  if (millis() - windowStart < WINDOW_MS) return;
50  windowStart = millis();
51
52  portENTER_CRITICAL(&mux);                    // sayacı güvenle oku ve sıfırla / read and reset safely
53  unsigned long n = pulseCount;
54  pulseCount = 0;
55  portEXIT_CRITICAL(&mux);
56
57  if (n >= MIN_PULSES && (!alertSent || millis() - lastAlert >= COOLDOWN_MS)) {
58    lastAlert = millis();
59    alertSent = true;
60    String msg = "Titreşim algılandı / vibration detected: " + String(n) + " darbe / pulses";
61    Serial.println(msg);
62    if (!bot.sendMessage(CHAT_ID, msg, "")) {
63      Serial.println("Mesaj gonderilemedi / message failed");
64    }
65  }
66}

Enviar un mensaje a Telegram puede tardar 1–2 segundos; durante ese tiempo el bucle espera, pero como la interrupción sigue funcionando, los pulsos que llegan se acumulan en el contador y no se pierden. Si quieres alimentar el sensor con pilas, pon el ESP32 en sueño profundo y convierte el pin DO del SW-420 en fuente de despertar con esp_sleep_enable_ext0_wakeup(); así el ESP32 solo se despierta con la vibración, envía el mensaje y vuelve a dormir. En ese caso elige como pin de despertar uno de los GPIO RTC; el GPIO 27 está en ese grupo.

SW-420 con la Raspberry Pi Pico (MicroPython)

En la Pico alimenta el módulo desde el pin 3V3(OUT) y conecta DO a GP15. El código de abajo usa la misma lógica de eventos que la versión de Arduino: cuenta los pulsos con una interrupción, enciende el LED integrado con el primer pulso y, tras 500 ms de silencio, muestra la duración y el número de pulsos del evento. El nombre Pin("LED") elige el LED integrado tanto en la Pico como en la Pico W.

MicroPython
1from machine import Pin, disable_irq, enable_irq
2import time
3
4vib = Pin(15, Pin.IN)                  # SW-420 DO (modül 3V3 ile) / module powered from 3V3
5led = Pin("LED", Pin.OUT)              # dahili LED / onboard LED
6QUIET_MS = 500                         # olayı bitiren sessizlik / silence that ends an event
7
8pulses = 0
9def on_vibration(pin):
10    global pulses
11    pulses += 1
12
13vib.irq(trigger=Pin.IRQ_RISING, handler=on_vibration)
14
15event_start = None
16event_pulses = 0
17last_pulse = 0
18while True:
19    state = disable_irq()              # sayacı güvenle oku / read the counter safely
20    n = pulses
21    pulses = 0
22    enable_irq(state)
23
24    now = time.ticks_ms()
25    if n:
26        if event_start is None:        # yeni olay / new event
27            event_start = now
28            event_pulses = 0
29            led.on()
30        event_pulses += n
31        last_pulse = now
32    elif event_start is not None and time.ticks_diff(now, last_pulse) > QUIET_MS:
33        duration = time.ticks_diff(last_pulse, event_start)
34        print("Titresim / vibration: %d ms, %d darbe / pulses" % (duration, event_pulses))
35        event_start = None
36        led.off()
37    time.sleep_ms(20)

Ideas de proyectos con un sensor de vibración

  • Alarma para bici y moto: Una cajita que suena cuando el vehículo aparcado se mueve y avisa al móvil mediante un ESP32.
  • Aviso de lavadora terminada: Un sensor que envía «lavado terminado» cuando la vibración lleva 5 minutos parada.
  • Detector de golpe secreto: Una cerradura que se abre cuando llamas con un ritmo concreto; se hace comparando los tiempos entre eventos.
  • Contador de horas de máquina: Un contador que registra cuántas horas al día funciona un compresor, una bomba o una impresora 3D.
  • Caja fuerte electrónica: Una protección que da la alarma si se fuerza la caja y trabaja junto a una cerradura con clave; combínala con la guía de cerradura con teclado.
  • Juego y mesa interactiva: Un tambor o un juego de reflejos que da luz y sonido al golpear la mesa.

Errores frecuentes y cómo solucionarlos

SíntomaCausa probableSolución
No se detectan las vibraciones suavesLos pulsos se leen con digitalRead() en loop() y se pierdenUsa una interrupción con attachInterrupt()
El sensor se dispara sin pararSensibilidad demasiado alta o placa sueltaAjusta el potenciómetro en su sitio y atornilla la placa
La alarma vuelve a sonar solaLa vibración del zumbador llega al sensorMonta el zumbador lejos del sensor, en otra superficie
La lógica funciona al revésLa salida DO del módulo clónico está invertidaPruébalo con el Monitor Serie y usa FALLING si hace falta
Pin del ESP32 dañado o inestableMódulo alimentado a 5 V, DO dio 5 VAlimenta el módulo a 3,3 V
Llegan decenas de mensajes al móvilNo hay tiempo de espera entre avisosUsa en el código una espera de al menos 60 segundos
Antes de fijar el umbral de alarma, deja funcionando el código que cuenta pulsos unas horas en el lugar donde irá el sensor y guarda la salida del Monitor Serie. Verás cuántos pulsos producen como máximo los eventos normales del día (pasos, puertas, tráfico); poner el umbral claramente por encima es la forma más segura de minimizar las falsas alarmas. Este enfoque es la base del filtrado; encontrarás los detalles en la guía filtrar datos de sensores.

El SW-420 es la forma más barata y sencilla de saber que una superficie se ha movido; su verdadera fuerza aparece cuando captas y cuentas los pulsos con una interrupción y lees los resultados junto con la duración y la densidad. Ajusta la sensibilidad en su sitio, filtra las falsas alarmas por software y pasa al MPU6050 cuando necesites la fuerza o la dirección de la sacudida. En la app BlueGrays encontrarás los proyectos Uso del zumbador, Detector de movimiento y Sistema de alarma con Telegram y ESP32, junto con la Caja fuerte electrónica inteligente, con esquemas y código paso a paso.

Preguntas frecuentes

¿Cómo funciona un sensor de vibración?

Los sensores de vibración como el SW-420 llevan dentro de una cápsula metálica un muelle y una pieza conductora. En reposo el contacto está cerrado; al sacudirse, el muelle oscila y el contacto se abre y se cierra en ráfagas muy cortas. El comparador LM393 del módulo convierte ese cambio en una señal digital limpia según el umbral ajustado con el potenciómetro.

¿Cómo se ajusta la sensibilidad del SW-420?

El potenciómetro del módulo cambia el umbral del comparador. Fija el sensor a la superficie donde lo usarás, gira el potenciómetro hasta que el LED de señal quede fijo en reposo pero reaccione a un golpecito suave y luego baja un poco la sensibilidad para dejar margen. Como el ajuste depende del material, hazlo en su sitio y no en la mesa.

¿Por qué el SW-420 pierde algunas vibraciones?

Durante la vibración, la salida del SW-420 solo produce pulsos muy cortos. Si tu código lee el pin con digitalRead() en loop() y en ese momento está ocupado con delay() o Serial.print(), el pulso se pierde. La solución es usar una interrupción con attachInterrupt() y contar los pulsos en la función de interrupción.

¿Se puede hacer un detector de terremotos con un sensor de vibración?

Se puede hacer un avisador de sacudidas sencillo para aprender, pero el SW-420 solo detecta que hay vibración; no mide su fuerza ni su dirección y no distingue un portazo de un terremoto. Un solo sensor solo nota la sacudida cuando llega hasta él. Para medidas con más sentido usa un acelerómetro como el MPU6050, y no uses nunca estos proyectos en lugar de los sistemas oficiales de alerta temprana.

¿Se puede usar el SW-420 con un ESP32?

Sí. Alimenta el módulo desde el pin 3V3 del ESP32 y conecta la salida DO a un pin digital como el GPIO 27. Si lo alimentas a 5 V, la salida DO también será de 5 V y puede dañar el pin del ESP32. En el ESP32 declara la función de interrupción con IRAM_ATTR y protege el contador compartido con un cerrojo portMUX.

¿Qué diferencia hay entre el SW-420 y el SW-18010P?

Los dos son interruptores de vibración de muelle, pero con distinto tipo de contacto. El SW-420 es normalmente cerrado: en reposo el contacto está cerrado y se abre con la vibración. Los normalmente abiertos, como el SW-18010P, están abiertos en reposo y se cierran un instante con la vibración. Si los usas como módulo, basta con comprobar el nivel de salida con el Monitor Serie.

Ver todos los proyectos
Uso del zumbador
#13Principiante

Uso del zumbador

¿Alguna vez te has preguntado cómo suena un timbre o una alarma? El Arduino hace pitar un pequeño zumbador a intervalos cortos: pip, silencio, pip, silencio. Ves cómo se crea sonido con electricidad y

4.7(89)
161
Encender un LED con pulsador (Push)
#9Principiante

Encender un LED con pulsador (Push)

Como un timbre: la luz se enciende mientras pulsas y se apaga cuando sueltas. El Arduino escucha el botón todo el rato; mientras está pulsado enciende el LED, y en cuanto levantas el dedo lo apaga. Co

4.8(113)
229
Detector de movimiento con sensor de movimiento
#24Principiante
Premium

Detector de movimiento con sensor de movimiento

Un vigilante sencillo que te avisa cuando alguien entra en la habitación. El sensor de movimiento capta el calor que desprende el cuerpo humano, y el Arduino mantiene el LED encendido mientras hay mov

4.6(47)
67
Timbre y luz con sensor de movimiento
#25Intermedio
Premium

Timbre y luz con sensor de movimiento

Cuando alguien se acerca a tu puerta, te enteras antes de que llame. En cuanto el sensor de movimiento detecta a alguien, se enciende el LED y el zumbador toca un timbre de tres notas de agudo a grave

4.7(54)
71
Sistema de Alarma de Movimiento ESP32 (PIR + Buzzer + LED + Telegram)
#145Avanzado
Premium

Sistema de Alarma de Movimiento ESP32 (PIR + Buzzer + LED + Telegram)

Un sistema inteligente de alarma de seguridad que activa el buzzer y el LED cuando el sensor PIR detecta movimiento, y envía simultáneamente una notificación instantánea al propietario vía Telegram. Cuenta con un tiempo de espera de 30 segundos para limitar la frecuencia de las alarmas repetidas; este mecanismo no comprueba la validez de las detecciones del sensor PIR ni elimina las falsas detecciones. Ideal para seguridad del hogar, vigilancia de garajes, almacenes o salas de trabajo. Con ESP32

0.0(0)
9
Caja fuerte electrónica inteligente
#92Avanzado
Premium

Caja fuerte electrónica inteligente

Una pequeña caja fuerte para tus cosas de valor que se abre con un código. Escribes tu código de cuatro cifras en el teclado; si es correcto, el servomotor abre el cierre, se enciende la luz verde y l

4.7(42)
63
Sistema de seguridad láser
#23Avanzado
Premium

Sistema de seguridad láser

Como las escenas de robos con láser de las películas: un rayo láser apunta a un sensor de luz, y en cuanto alguien se cruza y corta el rayo, se enciende el LED rojo y el zumbador empieza a sonar. La a

4.8(60)
77