Rileva il movimento, poi spaventa l'inferno di un intruso con suoni di allarme e luci intermittenti. Sembra divertente? Certo che lo fa. Questo è l'obiettivo del progetto Arduino di oggi, adatto ai principianti. Scriverò completamente da zero e testeremo mentre andiamo avanti, quindi si spera che tu possa avere un'idea di come si stia procedendo, invece di installare semplicemente qualcosa che ho già realizzato.
Disclaimer: questo non proteggerà la tua casa. Potrebbe dare a tua sorella un brutto colpo quando si intrufola nella tua stanza.
Avrai bisogno:
- Un Arduino
- Sensore "ping" ad ultrasuoni, sto usando HC-SR04 Un PIR sarebbe meglio, ma quelli sono costosi. Un sensore ping può essere posizionato di nascosto in una porta e serve ancora lo stesso lavoro di base, ed è solo $ 5
- Un cicalino piezo
- Striscia di luce a LED, con lo stesso cablaggio che abbiamo usato in questo progetto Costruisci la tua illuminazione d'ambiente dinamica per un centro multimediale Costruisci la tua illuminazione d'ambiente dinamica per un centro multimediale Se guardi un sacco di film sul tuo PC o media center, I ' sono sicuro che hai affrontato il dilemma dell'illuminazione; spegni completamente tutte le luci? Li tieni in piena esplosione? O ... Per saperne di più.
Mentre stai collegando questo progetto, non rimuovere ogni volta ogni cosa - continua semplicemente a costruire sull'ultimo blocco. Nel momento in cui si arriva alla sezione "Coding The Alarm System", dovresti avere tutti i bit e i pezzi cablati, con un aspetto simile a questo:
Luci lampeggianti
Usa lo schema elettrico di questo progetto Costruisci la tua illuminazione d'ambiente dinamica per un centro multimediale Costruisci la tua illuminazione d'ambiente dinamica per un centro multimediale Se guardi molti film sul tuo PC o sul tuo media center, sono sicuro che hai affrontato il problema dilemma dell'illuminazione; spegni completamente tutte le luci? Li tieni in piena esplosione? Oppure ... Leggi altro per collegare la tua striscia LED; non cambiare i pin, poiché abbiamo bisogno dell'uscita PWM. Utilizzare questo codice per testare rapidamente il cablaggio. Se tutto va bene, dovresti avere questo:
Sensore di distanza
Sul modulo SR04, troverai 4 pin. VCC e GND vanno rispettivamente a + 5V rail e ground; TRIG è il pin utilizzato per inviare un segnale sonar, mettere questo sul pin 6; ECHO è usato per leggere il segnale indietro (e quindi calcolare la distanza) - mettilo su 7.
Per rendere le cose incredibilmente semplici, c'è una libreria che possiamo usare chiamata NewPing. Scarica e posiziona nella cartella Libreria di Arduino e riavvia l'IDE prima di continuare. Test usando questo codice; aprire il monitor seriale e assicurarsi che la velocità sia impostata su 115200 baud. Con un po 'di fortuna, dovresti vedere alcune misurazioni della distanza che ti vengono inviate ad alta velocità. Potresti trovare una varianza di 1 o 2 centimetri, ma va bene. Prova a far scorrere la mano davanti al sensore, spostandolo su e giù per osservare le letture che cambiano.
Il codice dovrebbe essere abbastanza semplice da capire. Ci sono alcune dichiarazioni dei pin rilevanti all'inizio, compresa una distanza massima - questo può variare in base al sensore esatto che hai, ma finché sei in grado di ottenere letture con meno di 1 metro, dovresti stare bene.
Nel loop di questa app di test, usiamo la funzione ping () per inviare un ping di sonar, recuperando un valore in millisecondi di quanto tempo ci vuole per il valore da restituire. Per dare un senso a questo, usiamo le librerie NewPing costruite in costante di US_ROUNDTRIP_CM, che definisce quanti microsecondi ci vogliono per andare a un centimetro. C'è anche un ritardo di 50 ms tra i ping per evitare di sovraccaricare il sensore.
Allarme piezoelettrico
Il sensore piezo-cristallo è un cicalino semplice ed economico, e possiamo usare un pin 3 PWM per creare toni diversi. Collegare un cavo al pin 3, uno al rail di messa a terra: non importa quale.
Utilizzare questo codice per testare.
L'unico modo per uccidere l'allarme piuttosto odioso e rumoroso è tirare le spine. Il codice è un po 'complesso da spiegare, ma implica l'uso di onde sinusoidali per generare un suono distintivo. Modificare i numeri per suonare con toni diversi.
Codifica del sistema di allarme
Ora che abbiamo tutti i pezzi di questo puzzle, combiniamoli insieme.
Vai avanti e crea un nuovo schizzo, chiamato Allarme . Inizia combinando tutte le variabili e le definizioni dei pin che abbiamo negli esempi di test fino ad ora.
#include // Select which PWM-capable pins are to be used. #define RED_PIN 10 #define GREEN_PIN 11 #define BLUE_PIN 9 #define TRIGGER_PIN 6 // Arduino pin tied to trigger pin on the ultrasonic sensor. #define ECHO_PIN 7 // Arduino pin tied to echo pin on the ultrasonic sensor. #define MAX_DISTANCE 100 // Maximum distance we want to ping for (in centimeters). #define ALARM 3 float sinVal; int toneVal;
Inizia scrivendo una funzione di base di setup () - per ora ci occuperemo solo delle luci. Ho aggiunto un ritardo di 5 secondi prima che il ciclo principale venga avviato per darci un po 'di tempo per togliersi di mezzo, se necessario.
void setup(){ //set pinModes for RGB strip pinMode(RED_PIN, OUTPUT); pinMode(BLUE_PIN, OUTPUT); pinMode(GREEN_PIN, OUTPUT); //reset lights analogWrite(RED_PIN, 0); analogWrite(BLUE_PIN, 0); analogWrite(RED_PIN, 0); delay(5000); }
Usiamo una funzione di supporto che ci consente di scrivere rapidamente un singolo valore RGB nelle luci.
//helper function enabling us to send a colour in one command void color (unsigned char red, unsigned char green, unsigned char blue) // the color generating function { analogWrite(RED_PIN, red); analogWrite(BLUE_PIN, blue); analogWrite(GREEN_PIN, green); }
Infine, il nostro ciclo per ora consisterà in un semplice flash a colori tra rosso e giallo (o, qualunque cosa tu voglia che il tuo allarme sia - cambia semplicemente i valori RGB).
void loop(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yellow delay(100); }
Carica e prova questo per assicurarti di essere sulla strada giusta.
Ora, integriamo il sensore di distanza per attivare quelle luci solo quando qualcosa rientra, ad esempio, a 50 cm (appena meno della larghezza di un telaio della porta). Abbiamo già definito i pin giusti e importato la libreria, quindi prima che la funzione setup () aggiunga la seguente riga per istanziarla:
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
Al di sotto di questo, aggiungere una variabile per memorizzare lo stato dell'allarme che viene attivato o meno, in modo predefinito su falso, ovviamente.
boolean triggered = false;
Aggiungi una riga alla funzione setup () in modo che possiamo monitorare l'output su seriale e debug.
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
Successivamente, rinominiamo il loop corrente in alarm () - questo è ciò che verrà chiamato se l'allarme è stato attivato.
void alarm(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yelow delay(100); }
Ora creiamo una nuova funzione loop (), una in cui recuperiamo un nuovo ping, leggiamo i risultati e attiviamo l'allarme se qualcosa viene rilevato nell'intervallo del misuratore.
void loop(){ if(triggered == true){ alarm(); } else{ delay(50);// Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings. unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS). unsigned int distance = uS / US_ROUNDTRIP_CM; Serial.println(distance); if(distance< 100){ triggered = true; } } }
Lascia che ti spieghi brevemente il codice:
- Inizia controllando per vedere se l'allarme è stato attivato, e in tal caso, spegni la funzione di allarme (solo lampeggiando le luci al momento).
- Se non è ancora attivato, ottenere la lettura corrente dal sensore.
- Se il sensore sta leggendo <100 cm, qualcosa ha riempito il raggio (regolare questo valore se si sta attivando troppo presto per te, ovviamente).
Dagli una prova adesso, prima di aggiungere il fastidioso segnale acustico piezo.
Lavoro? Grande. Adesso aggiungiamo quel cicalino. Aggiungi pinMode alla routine setup () .
pinMode(ALARM, OUTPUT);
Quindi aggiungi il loop del buzzer piezoelettrico alla funzione alarm ():
for (int x=0; x<180; x++) { // convert degrees to radians then obtain sin value sinVal = (sin(x*(3.1412/180))); // generate a frequency from the sin value toneVal = 2000+(int(sinVal*1000)); tone(ALARM, toneVal); }
Se provi a compilare a questo punto, ti imbatterai in un errore: l'ho lasciato deliberatamente in modo da poter vedere alcuni problemi comuni. In questo caso, sia la libreria NewPing che quella standard usano gli stessi interrupt: sono sostanzialmente in conflitto e non c'è molto che puoi fare per risolverlo. Oh caro.
Nessuna preoccupazione però. È un problema comune e qualcuno ha già una soluzione: scarica e aggiungi questo NewTone alla tua cartella Librerie Arduino. Regola l'inizio del tuo programma per includere questo:
#include
E regola la linea:
tone(ALARM, toneVal);
a
NewTone(ALARM, toneVal);
anziché.
Questo è tutto. Imposta la sveglia sulla porta della tua camera da letto per il prossimo sfortunato aspirante ladro.
Oppure, un cane drogato, che sembrava completamente impassibile dall'allarme.
Hai problemi con il codice? Ecco l'app completa. Se ricevi errori casuali, prova a incollarli di seguito e vedrò se posso aiutarti.
Credito immagine: allarme antincendio via Flickr