Sensor de vibração SW-420 com Arduino: detecção de impacto e alarme
Sensor de vibração SW-420 com Arduino: como funciona, sensibilidade, contagem de pulsos e duração dos impactos, alarme antifurto, limites do alarme de terremoto vs MPU6050 e ESP32 com Telegram.
Em projetos com sensor de vibração no Arduino, a peça mais usada é o módulo SW-420, barato e simples. Com um único pino digital, ele avisa que uma superfície foi sacudida, que alguém bateu em uma porta, que uma gaveta foi aberta ou que uma máquina começou a funcionar. O módulo traz uma chave de vibração com mola, um chip comparador LM393 e um pequeno potenciômetro que ajusta a sensibilidade. É fácil de usar, mas na primeira tentativa a maioria das pessoas esbarra nos mesmos dois problemas: o sensor deixa passar algumas vibrações e às vezes dispara o alarme sem motivo nenhum.
Neste guia você vai aprender como funciona o contato de mola dentro do SW-420, por que a saída chega em pulsos curtos e como ajustar a sensibilidade corretamente. Depois vamos contar os pulsos com uma interrupção, medir quanto tempo dura e quão forte é um impacto e montar um alarme antifurto que reduz os alarmes falsos. Também vamos falar sobre por que a ideia do alarme de terremoto não é tão simples quanto parece e o que um acelerômetro MPU6050 acrescenta a essa tarefa. Por fim, vamos enviar uma mensagem do Telegram para o seu celular com um ESP32 quando houver vibração e escrever o código em MicroPython para o Raspberry Pi Pico.

O que é o sensor de vibração SW-420 e como ele funciona?
O verdadeiro elemento sensor do módulo é uma chave de vibração normalmente fechada (NF) dentro de um pequeno invólucro metálico cilíndrico. Dentro dele há uma mola e uma peça condutora; com o sensor parado, as duas se tocam e o contato fica fechado. Quando o sensor é sacudido, a mola oscila e o contato abre e fecha em rajadas muito curtas, cada uma durando menos de um milissegundo. A chave em si não tem direção, então reage à vibração vinda de qualquer lado. O LM393 do módulo compara a tensão produzida por essa chave com um limiar definido pelo potenciômetro e gera uma saída digital limpa (DO). Na maioria dos módulos, DO fica em LOW com o sensor parado e em HIGH durante a vibração, e o LED de sinal da placa apaga ou pisca junto com a vibração; em algumas placas clones a lógica pode ser invertida, então teste primeiro o seu módulo com o Monitor Serial.
| Característica | Valor |
|---|---|
| Elemento sensor | SW-420, chave de vibração com mola normalmente fechada |
| Alimentação | 3,3–5 V |
| Saída | Digital (DO), por meio de um comparador LM393 |
| Ajuste de sensibilidade | Potenciômetro na placa |
| Direção | Sem direção, reage à vibração vinda de qualquer lado |
| Sinal de saída | Rajadas de pulsos curtos durante a vibração |
| Pinos | VCC, GND, DO |
| Tamanho da placa | Cerca de 32 × 14 mm, um furo de fixação M3 |
Ligação do SW-420 no Arduino
| Pino do módulo | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | 5V | 3V3 | 3V3(OUT) |
| GND | GND | GND | GND |
| DO | D2 (pino de interrupção INT0) | GPIO 27 | GP15 |
Sensibilidade: como ajustar o potenciômetro?
O potenciômetro define o limiar do comparador. Se estiver sensível demais, o sensor capta um copo sendo colocado na mesa, um caminhão passando ou até a vibração do próprio buzzer; se estiver grosseiro demais, só reage a uma batida forte. Para acertar o ajuste, parafuse o módulo na superfície onde ele será usado e observe o LED de sinal da placa. Gire o potenciômetro até o ponto em que o LED fica estável em repouso, mas reage quando você bate de leve na superfície com o dedo; depois reduza um pouquinho a sensibilidade para deixar uma margem de segurança. Esse ajuste depende do material da superfície: o mesmo ajuste pode ser muito sensível em uma mesa de madeira e surdo em uma parede de concreto.
Primeiro teste: detectar vibração e capturar pulsos curtos
O primeiro código de quem está começando costuma ler o pino com digitalRead() no loop() e acender um LED quando vê HIGH. Isso funciona com uma batida forte, mas com vibrações leves quase sempre nada acontece, porque a saída do SW-420 pode ficar em HIGH por apenas algumas centenas de microssegundos e, se o loop() estiver ocupado com Serial.print() ou delay() nesse momento, o pulso se perde. A solução é capturar o pulso com uma interrupção e anotar o tempo até o próximo. O código abaixo registra o instante de cada pulso e mantém o LED aceso por 1 segundo depois do último pulso, para que seu olho consiga ver até uma vibração muito breve.
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}A interrupção é executada a cada borda em que o pino passa de LOW para HIGH; no Uno, só D2 e D3 oferecem esse tipo de interrupção externa. Se a lógica do seu módulo for invertida, escreva FALLING em vez de RISING; como as rajadas de pulsos têm bordas de subida e de descida, a contagem não muda. A função de interrupção é mantida o mais curta possível e não usa Serial; a impressão é feita no loop(). Desativar as interrupções por um instante enquanto as variáveis são lidas no loop() impede que uma variável de vários bytes mude no meio da leitura e seja lida corrompida.
Contagem de pulsos e duração: quanto tempo durou e quão forte foi o impacto?
O SW-420 não mede aceleração, mas o número de pulsos que ele gera dá uma boa ideia da força de um impacto: uma batidinha leve produz poucos pulsos, uma porta batendo dezenas e a vibração de uma furadeira centenas por segundo. O código abaixo conta os pulsos com uma interrupção e os agrupa em eventos: o primeiro pulso inicia um evento e, se nenhum pulso novo chegar em 500 ms, o evento termina. Ao fim de cada evento, ele imprime a duração, o total de pulsos e a densidade de pulsos por segundo. Assim você consegue montar uma “impressão digital” dos eventos do seu próprio ambiente e basear o limite do alarme em medição, não em chute.
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}Rode o código e depois bata na mesa de jeitos diferentes, abra uma gaveta, feche a porta e anote os números que aparecem. Em uma única batida curta, a duração costuma ficar perto de zero e a contagem de pulsos tem um dígito só; uma vibração longa faz crescer tanto a duração quanto a contagem de pulsos. Usar esses dois valores juntos é muito mais eficaz do que um simples “vibrou ou não vibrou”: por exemplo, em um sensor instalado em um cofre, uma regra como “evento com pelo menos 300 ms de duração e pelo menos 20 pulsos” consegue filtrar os passos de alguém passando ao lado e ainda pegar quem estiver forçando o cofre.
Alarme antifurto com o SW-420 e como reduzir alarmes falsos
Um SW-420 instalado em um vidro de janela, em uma bicicleta, em uma gaveta ou em um cofre pode ser o coração de um alarme antifurto simples. O que separa um alarme bom de um ruim tem menos a ver com a detecção e mais com a forma como ele filtra os alarmes falsos. O código abaixo faz isso em três camadas: depois de armado, dá 10 segundos de tempo de saída; dispara não com uma única batida, mas quando vê pelo menos 5 pulsos em 1 segundo; e ignora pulsos novos durante os 15 segundos em que a sirene toca. O alarme é armado e desarmado pelo botão em D4, o buzzer ativo fica em D8 e o LED de status em D13. Para um sistema mais completo, veja o guia Sistema de alarme com Arduino.
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}Há muita coisa que você pode fazer além do código para reduzir alarmes falsos:
- Fixação firme: prenda o módulo na superfície com um parafuso M3 ou um adesivo rígido; uma placa solta, balançando, vibra sozinha.
- Afaste o buzzer: se a sirene estiver montada na mesma placa ou na mesma caixa do sensor, a própria vibração dela pode disparar o alarme de novo.
- Ajuste a sensibilidade no local: regule o potenciômetro na superfície onde o sensor vai ficar de vez, não na sua bancada.
- Cabos curtos e fixos: cabos longos balançando no ar captam ruído; se precisar, coloque 100 nF entre DO e GND.
- Use dois sensores: em um ponto importante, exigir que dois sensores disparem juntos em pouco tempo reduz muito os alarmes falsos.
- Confirme com outro sensor: combinar a vibração com um sensor de movimento PIR ou um sensor de porta aumenta a confiabilidade.
Dá para fazer um alarme de terremoto com o SW-420? Limites e o MPU6050
O alarme de terremoto é uma das ideias de projeto mais populares com sensor de vibração, e é um projeto didático; mas é importante conhecer os limites dele. O SW-420 só diz “algo sacudiu”: ele não consegue medir a aceleração, a direção nem a frequência do tremor. Por isso, reage do mesmo jeito a uma porta batendo, a um caminhão passando, a uma máquina de lavar centrifugando ou a um terremoto de verdade. Mais importante ainda: um único sensor só detecta o tremor quando o tremor já chegou até onde ele está. Os sistemas oficiais de alerta antecipado de terremotos combinam medições de muitas estações próximas ao epicentro e levam o alerta a regiões distantes antes de o tremor chegar; um Arduino em casa não substitui isso e não deve ser usado como dispositivo de segurança de vida.
Se quiser dar mais sentido a um projeto de terremoto, passe para o módulo acelerômetro e giroscópio MPU6050. O MPU6050 mede a aceleração em três eixos com resolução de 16 bits e faixas selecionáveis de ±2 g a ±16 g. Com isso você pode calcular a aceleração de pico do solo (PGA) de um tremor, diferenciar uma porta batendo de um movimento longo do solo olhando por quantos segundos a aceleração dura e qual é a frequência dela, e registrar os dados para analisar depois. Usar os dois sensores juntos também faz sentido: o SW-420 fica esperando com pouquíssimo consumo e acorda o microcontrolador na primeira vibração, enquanto o MPU6050 faz a medição detalhada.

| Característica | SW-420 | MPU6050 |
|---|---|---|
| O que ele mede? | Se há vibração ou não | Aceleração e velocidade de rotação em 3 eixos |
| Saída | Pulsos digitais (DO) | I2C, dados digitais de 16 bits |
| Sensibilidade | Potenciômetro, ajuste grosseiro | Por software, de ±2 g a ±16 g |
| Direção | Nenhuma | Sim (X, Y, Z) |
| Projeto de terremoto | Só um alerta de “algo sacudiu” | Análise de aceleração de pico, duração e frequência |
| Código | Poucas linhas, sem biblioteca | Precisa de biblioteca e filtragem |
| Preço | Muito barato | Barato |
Notificação no Telegram pelo ESP32 quando houver vibração
Com um ESP32, o sensor de vibração pode avisar o seu celular quando algo acontecer com um cofre, uma bicicleta ou uma máquina enquanto você está fora de casa. Para isso, você precisa criar um bot com o BotFather no Telegram, obter o token e o seu chat ID e instalar as bibliotecas UniversalTelegramBot e ArduinoJson no Arduino IDE; explicamos esses passos em detalhes no guia Bot do Telegram com ESP32. O código abaixo conta os pulsos com uma interrupção, envia uma mensagem quando vê pelo menos 5 pulsos em 1 segundo e espera pelo menos 60 segundos entre duas mensagens, para que o seu celular não se encha de dezenas de notificações por minuto. Como o ESP32 tem dois núcleos, o contador é protegido com uma trava portMUX.
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 uma mensagem ao Telegram pode levar 1–2 segundos; o loop fica esperando nesse tempo, mas como a interrupção continua funcionando, os pulsos que chegam se acumulam no contador e não se perdem. Se quiser rodar o sensor com bateria, coloque o ESP32 em deep sleep e transforme o pino DO do SW-420 em fonte de despertar com esp_sleep_enable_ext0_wakeup(); assim o ESP32 só acorda com vibração, envia a mensagem e volta a dormir. Nesse caso, escolha um dos GPIOs RTC como pino de despertar; o GPIO 27 faz parte desse grupo.
SW-420 com o Raspberry Pi Pico (MicroPython)
No Pico, alimente o módulo pelo pino 3V3(OUT) e ligue o DO ao GP15. O código abaixo usa a mesma lógica de eventos da versão para Arduino: conta os pulsos com uma interrupção, acende o LED integrado da placa no primeiro pulso e, depois de 500 ms de silêncio, imprime a duração do evento e a contagem de pulsos. O nome Pin("LED") seleciona o LED integrado tanto no Pico quanto no Pico W.
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)Ideias de projetos com sensor de vibração
- Alarme para bicicleta e moto: uma caixinha que apita quando o veículo estacionado é sacudido e avisa o seu celular via ESP32.
- Aviso de máquina de lavar pronta: um sensor que envia a mensagem “lavagem concluída” quando a vibração para por 5 minutos.
- Detector de batida secreta: uma fechadura que abre quando alguém bate em um certo ritmo; funciona comparando os intervalos entre os eventos de impacto.
- Contador de horas de máquina: um contador que registra quantas horas por dia um compressor, uma bomba ou uma impressora 3D funciona.
- Cofre eletrônico: uma proteção que dispara o alarme quando o cofre é forçado, funcionando junto com uma fechadura com senha; combine com o guia fechadura com senha usando teclado matricial.
- Jogo e mesa interativa: uma bateria ou um jogo de reflexo que acende luzes e faz som quando você bate na mesa.
Erros comuns e como resolvê-los
| Sintoma | Causa provável | Solução |
|---|---|---|
| Vibrações leves não são detectadas | Os pulsos são lidos com digitalRead() no loop() e se perdem | Use uma interrupção com attachInterrupt() |
| O sensor dispara o tempo todo | Sensibilidade alta demais ou a placa está solta | Ajuste o potenciômetro no local e parafuse a placa |
| O alarme volta a tocar sozinho | A vibração do buzzer chega ao sensor | Monte o buzzer longe do sensor, em outra superfície |
| A lógica funciona ao contrário | A saída DO é invertida em um módulo clone | Teste com o Monitor Serial e use FALLING se necessário |
| Pino do ESP32 danificado ou instável | Módulo alimentado com 5 V, então DO entregou 5 V | Alimente o módulo com 3,3 V |
| Chegam dezenas de mensagens no celular | Não há tempo de espera entre as notificações | Use no código um tempo de espera de pelo menos 60 segundos |
O SW-420 é o jeito mais barato e fácil de saber que uma superfície foi sacudida; a força dele aparece quando você captura e conta os pulsos com uma interrupção e interpreta os resultados junto com a duração e a densidade. Ajuste a sensibilidade no local, filtre os alarmes falsos no software e passe para o MPU6050 quando precisar da força ou da direção do tremor. No app BlueGrays você encontra os projetos Uso do buzzer, Detector de movimento e Sistema de alarme de movimento com ESP32 e Telegram, junto com o Cofre eletrônico inteligente, com esquemas do circuito e códigos passo a passo.
Perguntas frequentes
Como funciona um sensor de vibração?
Sensores de vibração como o SW-420 têm uma mola e uma peça condutora dentro de um invólucro metálico. Com o sensor parado, o contato fica fechado; quando ele é sacudido, a mola oscila e o contato abre e fecha em rajadas muito curtas. O comparador LM393 do módulo transforma essa mudança em um sinal digital limpo, com base em um limiar ajustado pelo potenciômetro.
Como ajustar a sensibilidade do SW-420?
O potenciômetro do módulo altera o limiar do comparador. Fixe o sensor na superfície onde ele será usado, gire o potenciômetro até o ponto em que o LED de sinal fica estável em repouso, mas reage a uma batida leve, e depois reduza um pouco a sensibilidade para deixar uma margem de segurança. Como o ajuste depende do material da superfície, faça isso no local, não na sua bancada.
Por que o SW-420 deixa passar algumas vibrações?
Durante a vibração, a saída do SW-420 produz apenas pulsos muito curtos. Se o seu código lê o pino com digitalRead() no loop() e está ocupado com delay() ou Serial.print() nesse momento, o pulso se perde. A solução é usar uma interrupção com attachInterrupt() e contar os pulsos na função de interrupção.
Dá para fazer um detector de terremoto com um sensor de vibração?
Dá para montar um alarme de tremor simples para aprender, mas o SW-420 só detecta que existe vibração; ele não mede a força nem a direção e não consegue diferenciar eventos como uma porta batendo de um terremoto. Um único sensor só percebe o tremor quando ele chega até o sensor. Para medições mais significativas, use um acelerômetro como o MPU6050 e nunca trate esse tipo de projeto como substituto dos sistemas oficiais de alerta antecipado.
Dá para usar o SW-420 com o ESP32?
Sim. Alimente o módulo pelo pino 3V3 do ESP32 e ligue a saída DO a um pino digital, como o GPIO 27. Se você alimentar o módulo com 5 V, a saída DO também fica em 5 V e pode danificar o pino do ESP32. No ESP32, declare a função de interrupção com IRAM_ATTR e proteja o contador compartilhado com uma trava portMUX.
Qual é a diferença entre o SW-420 e o SW-18010P?
Os dois são chaves de vibração com mola, mas o arranjo do contato é diferente. O SW-420 é normalmente fechado, ou seja, o contato fica fechado em repouso e abre com a vibração. Tipos normalmente abertos, como o SW-18010P, ficam abertos em repouso e fecham por um instante com a vibração. Quando você os usa como módulos, basta conferir o nível da saída com o Monitor Serial.
Projetos para montar depois desta leitura
Ver todos os projetos
Uso do buzzer
Já se perguntou como uma campainha ou um alarme produz som? O Arduino faz um pequeno buzzer emitir bipes em intervalos curtos: bipe, pausa, bipe, pausa. Você vê como a eletricidade produz som e dá o p

Controle de LED com botão (momentâneo)
É como uma campainha: a luz fica acesa enquanto você pressiona o botão e apaga quando você solta. O Arduino monitora o botão continuamente; enquanto ele está pressionado, o LED fica aceso e apaga assi

Detector de movimento com sensor de movimento
Um vigia simples que avisa quando alguém entra no cômodo. O sensor de movimento detecta o calor emitido pelo corpo humano, e o Arduino mantém o LED aceso enquanto há movimento e o apaga quando ele par

Campainha e luz com sensor de movimento
Quando alguém se aproxima da sua porta, você fica sabendo antes mesmo de a pessoa tocar a campainha. Assim que o sensor detecta alguém, o LED acende e o buzzer toca uma melodia de três notas, da mais

Alarme de movimento com ESP32 (PIR + buzzer + LED + Telegram)
Um sistema de alarme de segurança inteligente que aciona o buzzer e o LED quando o sensor PIR detecta movimento e, ao mesmo tempo, envia uma notificação instantânea ao proprietário pelo Telegram. Inclui um intervalo de espera de 30 segundos para limitar a frequência dos alarmes repetidos; esse mecanismo não valida as detecções do PIR nem elimina disparos falsos. Pode ser usado na segurança de casas, no monitoramento de garagens, depósitos ou salas de trabalho.

Cofre eletrônico inteligente
Um pequeno cofre para guardar seus objetos de valor, que abre com uma senha. Você digita sua senha de quatro dígitos no teclado; se estiver correta, o servo motor abre a trava, a luz verde acende e o

Sistema de segurança com laser
Como nas cenas de roubo com lasers dos filmes: um feixe de laser atinge um sensor de luz e, assim que alguém passa e interrompe o feixe, o LED vermelho acende e o buzzer começa a soar. O alarme não pa
Mais artigos
App BlueGrays
Monte este circuito passo a passo pelo celular
Esquema do circuito, código e lista de componentes em uma só tela. Mais de 200 projetos com Arduino, ESP32 e Pico prontos para montar.
Escaneie com seu celular
Aponte a câmera para o código para abrir a loja de aplicativos do seu celular.
ou abrir a loja

