In questo articolo vedremo come realizzare un sistema di allarme antintrusione basato sul sensore infrarosso PIR tipo HC-SR501 in grado di rilevare un corpo caldo in movimento e che utilizza il Multi test Shield per il collegamento delle varie parti
Indice
Sensore infrarosso HC-SR501
Il sensore infrarosso passivo piroelettrico (PIR) tipo HC-SR501 è basato sul chip BISS0001, integrato U4 (datasheet) per l’interfaccia, l’alimentazione è regolata al valore di 3,3V tramite apposito regolatore (IC1), ed è presente un diodo (D1) a protezione dell’inversione di polarità.
Vedete anche l’articolo Cos’è un sensore infrarosso passivo PIR
Sulla scheda del sensore HC-SR501 sono presenti due trimmer, uno regola la sensibilità e l’altro tempi di uscita.
![]() |
![]() |
![]() |
Per quanto riguarda la sensibilità avremo che ruotando in senso orario => Alta sensibilità, mentre in senso antiorario => bassa sensibilità (intervallo compreso tra 3-7 m).
Per i tempi di uscita, in senso orario => lungo, antiorario => corto (intervallo compreso tra 3-300 sec)
Sul connettore d’uscita, abbiamo il polo di alimentazione Vcc (+ 5-20V), quello centrale è il pin d’uscita del segnale, mentre l’ultimo rappresenta il terminale di massa.
L’uscita è alta (3,3 V) o bassa (0 V)
Caratteristiche del sensore
- Tensione di alimentazione: da 4,5Vdc a 20Vdc
- Tensione di uscita: 0-3,3V
- Corrente di uscita: 10mA
- Angolo di visione: <140°
- Distanza di rilevamento: da 3 a 7 mt
Il sensore di movimento PIR HC-SR501 è uno dei più facili da collegarsi ad un Arduino o a qualsiasi altro microcontrollore, tra l’altro può essere utilizzato anche come un rilevatore di movimento autonomo.
Si possono trovare due versioni della scheda. Uno con un jumper a 3 poli ed uno con piazzole di saldatura.
- Con il ponticello messo nella sua posizione inferiore (con la scheda ancora di fronte, come descritto) non vi è alcun ripristino. No reset
- Ponticello nella sua posizione superiore (H) è in modalità ripristino automatico. Auto-reset
Quando impostato su No reset sensore di rilevamento si ferma una volta che ha innescato, e l’uscita rimane alta per il periodo di tempo prestabilito.
Se è impostato su auto-reset il segnale del sensore rimarrà alto fino a quando il movimento si arresta. Dopo, se non viene rilevato un movimento l’uscita diminuirà.
Per scegliere una di queste impostazioni, è sufficiente creare una saldatura-ponte tra il pad con l’etichetta e il pad in mezzo. il default è ‘L’
Progetto sistema di allarme
Componenti utilizzati
Scheda Arduino UNO | Multi test Shield con Display OLED | Sensore PIR HC-SR501 |
![]() |
![]() |
![]() |
KY-006 Small passive buzzer | KY-011 2 color LED module | KY-019 5V relay module |
![]() |
![]() |
![]() |
Nota: è possibile sostituire il sensore HC-SR501 con la versione compatta AM312
Multi test Shield
Il Multi Test Shield è uno shield auto costruito realizzato per testare la serie di sensori contenuti nella confezione “37 in 1 Sensor Module Board Set” compatibile con la scheda Arduino UNO R3 originale e relativi cloni.
Sulla scheda sono disponibili molti connettori che risultano già opportunamente collegati con le porte digitali o analogiche di Arduino.
In realtà, la scheda, oltre ai sensori presenti nel kit “37 in 1 Sensor Module Board Set” permette di testare altri sensori, servo, ecc per un totale di oltre 50 tipi, la presenza di un connettore bus I2C espande ulteriormente la tipologia di dispositivi che lo shield permette.
Sulla scheda è anche presente un connettore per il collegamento di un piccolo Display OLED da 0.95″risoluzione 96×64 pixel, 65536 Colori, su di esso potranno essere mostrati dei messaggio o i valori misurati dai sensori.
Collegamento dei modulo sullo Shield
Per collegare il Multi test Shield al sensore HC-SR501 occorrerà semplicemente posizionare i vari componenti e in particolare
Modulo | Connettore |
Display OLED da 0.95″risoluzione 96×64 pixel, 65536 Colori | DISP1 |
Sensore PIR HC-SR501 | JP4 |
KY-006 Small passive buzzer module | JP8 |
KY-011 2 color LED module | JP6 |
KY-019 5V relay module | JP1 |
Programma
Il programma accenderà in sequenza i tre led interni rosso, blu, verde in sequenza e poi simultaneamente per l’emissione della luce bianca. Mostrerà sul display OLED le varie fasi di esecuzione del programma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
// Definizione dei pin di collegamento #define sclk 13 #define mosi 11 #define cs 10 #define rst 9 #define dc 8 //Definizione dei PIN #define pirPin 17 // pin per il sensore HC-SR501 #define pinRele 2 // pin per il mudulo KY-019 5V relay module #define greenpin 5 // pin per il LED verde KY-011 2 color LED module #define redpin 6 // pin per il LED rosso KY-011 2 color LED module #define buzzerPin 4 // Pin per il KY-006 Small passive buzzer module // Tempo di calibrazione del sensore int calibrationTime = 10; //Il tempo in cui l'uscita sia bassa long unsigned int lowIn; // valore di millisecondi, per cui si ritiene che ci sia "quiete" long unsigned int pause = 3000; boolean lockLow = true; boolean takeLowTime; // Definizione dei colori #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #include <Adafruit_GFX.h> #include <Adafruit_SSD1331.h> #include <SPI.h> Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, rst); // Impostazione del sensore void setup() { Serial.begin(9600); display.begin(); pinMode(pirPin, INPUT); pinMode (pinRele, OUTPUT); pinMode(greenpin, OUTPUT); pinMode(redpin, OUTPUT); pinMode(buzzerPin, OUTPUT); digitalWrite(pirPin, LOW); // Messaggio iniziale display.fillScreen(BLACK); display.setTextSize(1); display.setTextColor(BLUE); display.setRotation(2); //Ruota display display.setCursor(0, 0); display.println("www.adrirobot.it"); display.println(""); display.setTextColor(GREEN); display.println("Multitest shield"); display.println(""); display.println("Allarme con PIR"); display.println("Sensore HC-SR501"); delay(2000); //Fase di calibrazione Serial.print("Calibrazione del sensore "); display.fillScreen(BLACK); display.setTextColor(BLUE); display.setCursor(0, 0); display.println("CALIBRAZIONE"); for (int i = 0; i < calibrationTime; i++) { Serial.print("."); delay(1000); } Serial.println(" Fatto"); Serial.println("SENSORE ATTIVO"); display.fillScreen(BLACK); display.setTextColor(BLUE); display.setCursor(0, 0); display.print("SENSORE ATTIVO"); tone(buzzerPin, 1000, 500); //suona una nota alla frequenza di 1000Hz delay(1000); digitalWrite (redpin, LOW); // spegne led rosso digitalWrite (greenpin, HIGH); // accende led verde display.fillScreen(BLACK); display.setTextColor(YELLOW); display.setCursor(0, 0); display.println("STATO ALLARME"); delay(50); } void loop() { // Questo IF permette di stabilre se il sensore rileva un oggetto in movimento if (digitalRead(pirPin) == HIGH) { digitalWrite (redpin, HIGH); // accende led rosso digitalWrite (greenpin, LOW); // spegne led digitalWrite(pinRele, HIGH); if (lockLow) { lockLow = false; Serial.println("---"); Serial.print("Movimento rilevato a "); digitalWrite (redpin, HIGH); // accende led rosso digitalWrite (greenpin, LOW); // spegne led display.fillRect(0, 45, 96, 15, BLACK); display.fillRect(0, 45, 96, 15, BLACK); display.setCursor(0, 45); display.setTextColor(RED); display.print("ALLARME"); tone(buzzerPin, 500, 500); //suona una nota alla frequenza di 1000Hz digitalWrite(pinRele, HIGH); Serial.print(millis() / 1000); Serial.println(" sec"); delay(50); } takeLowTime = true; } // Questo IF permette di stabilire se non c'è più nessun movimento if (digitalRead(pirPin) == LOW) { digitalWrite (redpin, LOW); // spegne led rosso digitalWrite (greenpin, HIGH); // accende led verde display.fillRect(0, 45, 96, 15, BLACK); display.setCursor(0, 45); display.setTextColor(GREEN); display.print("NESSUNO"); digitalWrite(pinRele, LOW); if (takeLowTime) { lowIn = millis(); takeLowTime = false; } if (!lockLow && millis() - lowIn > pause) { lockLow = true; Serial.print("Movimento terminato a "); //output Serial.print((millis() - pause) / 1000); Serial.println(" sec"); delay(50); } } } |
Messaggi mostrati dal display

Accensione led verde – Impianto non in allarme

Accensione led rosso – Impianto in allarme