Publicitate

Detectați mișcarea, apoi speriați-l pe un intrus cu sunete de alarmă înalte și lumini intermitente. Sună amuzant? Desigur, da. Acesta este obiectivul proiectului Arduino de astăzi, potrivit pentru începători. Vom scrie complet de la zero și vom face teste pe măsură ce mergem de-a lungul, astfel încât să puteți să vă faceți o idee despre cum se face totul, decât să instalați ceva ce am făcut deja.

Disclaimer: aceasta nu va proteja casa în realitate. Aceasta ar putea dă-i surorii tale un șoc urât când se strecoară în camera ta totuși.

O să ai nevoie:

  • Un Arduino
  • Folosesc senzorul cu ultrasunete „ping” HC-SR04 Un PIR ar fi mai bun, dar acestea sunt scumpe. Un senzor de ping poate fi plasat în mod ascendent într-o ușă și servește în continuare același loc de muncă de bază, și are doar 5 dolari
  • Un zumzet piezo
  • Lampa cu bandă LED, cu același cablu pe care l-am folosit în acest proiect Construiți-vă propriul iluminat ambiental dinamic pentru un centru mediaDacă vizionați o mulțime de filme pe computer sau media center, sunt sigur că v-ați confruntat cu dilema de iluminare; stingeți complet toate luminile? Îi țineți în plină explozie? Sau...
    instagram viewer
    Citeste mai mult
    .

Pe măsură ce câștigați acest proiect, nu eliminați totul de fiecare dată - continuați să construiți pe ultimul bloc. În momentul în care ajungeți la secțiunea „Codarea sistemului de alarmă”, ar trebui să aveți toate bițiile și piesele conectate, arătând astfel:

terminat-cabluri

Lumini intermitente

Folosiți diagrama de cablare din acest proiect Construiți-vă propriul iluminat ambiental dinamic pentru un centru mediaDacă vizionați o mulțime de filme pe computer sau media center, sunt sigur că v-ați confruntat cu dilema de iluminare; stingeți complet toate luminile? Îi țineți în plină explozie? Sau... Citeste mai mult să vă conectați banda LED; nu schimbați pini, deoarece avem nevoie de ieșire PWM. Utilizare acest cod pentru a testa rapid cablarea. Dacă totul merge bine, ar trebui să aveți acest lucru:

conduse de rgb-test

Senzor la distanță

În modulul SR04, veți găsi 4 pini. VCC și GND mergeți la șină + 5 V, respectiv la sol; Trig este pinul folosit pentru a trimite un semnal sonar, puneți acest lucru pe pinul 6; ECOU este folosit pentru a citi semnalul înapoi (și, prin urmare, pentru a calcula distanța) - puneți acest lucru pe 7.

SR04

Pentru a face lucrurile incredibil de simple, există o bibliotecă la care putem folosi NewPing. Descărcați și locați în Arduino Bibliotecă folderul și reporniți IDE-ul înainte de a continua. Testează folosind acest cod; deschideți monitorul serial și asigurați-vă că viteza este setată la 115200 baud. Cu orice noroc, ar trebui să vedeți unele măsurători ale distanței care vă sunt trimise înapoi la o viteză destul de mare. Puteți găsi o variație de 1 sau 2 centimetri, dar acest lucru este în regulă. Încercați să rulați mâna în fața senzorului, mișcând-o în sus și în jos pentru a observa citirile care se schimbă.

ping-ieșire

Codul ar trebui să fie destul de simplu de înțeles. La început sunt câteva declarații de ace relevante, inclusiv o distanță maximă - poate varia în funcție de senzorul exact pe care îl aveți, dar atâta timp cât veți reuși să obțineți o precizie mai mică de 1 metru, ar trebui să fiți amenda.

În bucla acestei aplicații de testare, utilizăm funcția ping () funcție pentru a trimite un sonar ping, obținând înapoi o valoare în milisecunde de cât a durat pentru a reveni valoarea. Pentru a înțelege acest lucru, folosim bibliotecile NewPing construite constant US_ROUNDTRIP_CM, care definește câte microsecunde este nevoie pentru a merge un singur centimetru. Există, de asemenea, o întârziere de 50 ms între pings pentru a evita supraîncărcarea senzorului.

Piezo Alarm

Senzorul de cristal Piezo este un sonor simplu și ieftin și putem folosi un pin PWM 3 pentru a face tonuri diferite. Conectați un fir la pinul 3, unul la șina de la sol - nu contează care.

Utilizare acest cod a testa.

Singura modalitate de a ucide alarma destul de neobișnuită și puternică este de a trage dopurile. Codul este puțin complex de explicat, dar implică utilizarea undelor sinusoidale pentru a genera un sunet distinctiv. Tweak numerele pentru a juca cu tonuri diferite.

Codarea sistemului de alarmă

Acum că avem toate piesele acestui puzzle, să le combinăm.

Mergeți înainte și faceți o nouă schiță, numită Alarma. Începeți prin combinarea tuturor variabilelor și definițiilor pinului pe care le găsim în exemplele de testare până acum.

#include  // Selectați care ace de capacitate PWM vor fi utilizate. #define RED_PIN 10. #define GREEN_PIN 11. #define BLUE_PIN 9 #define TRIGGER_PIN 6 // Pinul Arduino legat pentru a activa pinul senzorului cu ultrasunete. #define ECHO_PIN 7 // Pinul Arduino legat de pinul ecou pe senzorul ultrasonic. #define MAX_DISTANCE 100 // Distanța maximă pentru care dorim să facem ping (pentru centimetri). #define ALARM 3 float sinVal; int toneVal; 

Începeți prin a scrie un element de bază înființat() funcție - ne vom ocupa doar de lumini deocamdată. Am adăugat o întârziere de 5 secunde înainte de începerea buclei principale pentru a ne oferi ceva timp să ieșim din drum, dacă este nevoie.

void setup () {// set pinModes pentru RGB strip pinMode (RED_PIN, OUTPUT); pinMode (BLUE_PIN, OUTPUT); pinMode (GREEN_PIN, OUTPUT); // resetează luminile analogWrite (RED_PIN, 0); analogWrite (BLUE_PIN, 0); analogWrite (RED_PIN, 0); întârziere (5000); }

Să folosim o funcție de ajutor care ne permite să scriem rapid pe o singură valoare RGB.

// funcția helper care ne permite să trimitem o culoare într-o singură comandă. void color (nesemnat roșu char, verde nesemnat, albastru char nesemnat) // funcția de generare a culorii. {analogWrite (RED_PIN, roșu); analogWrite (BLUE_PIN, albastru); analogWrite (GREEN_PIN, verde); }

În cele din urmă, bucla noastră de acum va consta într-un simplu bliț color între roșu și galben (sau, orice doriți să fie alarma dvs. - schimbați doar valorile RGB).

void loop () {color (255,0,0); // întârziere roșie (100); culoare (255.255,0); // întârziere galbenă (100); }

Încărcați și testați asta pentru a vă asigura că sunteți pe calea cea bună.

Acum, să integrăm senzorul de distanță pentru a declanșa acele lumini doar atunci când ceva vine în interior, să zicem, 50 cm (doar mai puțin decât lățimea cadrului ușii). Deja am definit pinii potriviți și am importat biblioteca, înainte de dvs. înființat() funcție adăugați următoarea linie pentru a o instantana:

Sonar NewPing (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Setarea NewPing a pinilor și distanța maximă. 

Sub aceasta, adăugați o variabilă pentru a stoca starea de alarmă declanșată sau nu, implicit la fals, desigur.

boolean declanșat = fals; 

Adăugați o linie la înființat() funcție, astfel încât să putem monitoriza ieșirea în serie și depanare.

Serial.begin (115200); // Deschideți monitorul serial la 115200 baud pentru a vedea rezultatele ping. 

În continuare, să redenumim bucla curentă la alarma() - așa se numește dacă alarma a fost declanșată.

void alarm () {color (255,0,0); // întârziere roșie (100); culoare (255.255,0); // întârziere de gâsc (100); }

Acum creați o nouă buclă() funcție, una în care obținem un nou ping, citim rezultatele și declanșăm alarma dacă se detectează ceva în intervalul contorului.

void loop () {if (declanșat == true) {alarmă (); } else {întârziere (50); // Așteptați 50ms între pings (aproximativ 20 pings / sec). 29ms ar trebui să fie cea mai scurtă întârziere între pings. unsigned int uS = sonar.ping (); // Trimiteți ping, obțineți timp ping în microsecunde (uS). unsigned int distance = uS / US_ROUNDTRIP_CM; Serial.println (distanță); if (distanta <100) {declansat = true; } } }

Permiteți-mi să explic codul pe scurt:

  • Începeți prin a verifica pentru a vedea dacă alarma a fost declanșată și, dacă da, opriți funcția de alarmă (doar clipește luminile în acest moment).
  • Dacă încă nu este declanșat, obțineți citirea curentă de la senzor.
  • Dacă senzorul citeste <100 cm, ceva a umplut fasciculul (ajustați această valoare dacă se declanșează prea devreme pentru dvs., evident).

Dă-i un proces de rulare acum, înainte de a adăuga soneria piezo-enervantă.

Lucru? Grozav. Acum să adăugăm acel sunet înapoi. Adăuga pinMode la înființat() rutină.

pinMode (ALARM, OUTPUT); 

Apoi, adăugați bucla piezo sonor la funcția de alarmă ():

for (int x = 0; x <180; x ++) {// convertiți grade în radiani apoi obțineți valoarea păcatului sinVal = (sin (x * (3.1412 / 180))); // generează o frecvență din tonul valorii sinVal = 2000+ (int (sinVal * 1000)); ton (ALARM, toneVal); }

Dacă încercați să compilați în acest moment, veți confrunta cu o eroare - am lăsat acest lucru în mod deliberat, astfel încât să puteți vedea unele probleme comune. În acest caz, atât NewPing-ul, cât și biblioteca standard de tonuri utilizează aceleași întreruperi - în principiu sunt conflictuale și nu prea puteți face pentru a remedia problema. Aoleu.

Nu există griji. Este o problemă comună și cineva are deja o soluție - descărcați și adăugați asta Newtone la folderul dvs. Arduino Libraries. Ajustați începutul programului pentru a include acest lucru:

#include 

Și ajustați linia:

 ton (ALARM, toneVal); 

la

 NewTone (ALARM, tonVal); 

in schimb.

Asta e. Setați-vă alarma în ușa dormitorului dvs. pentru ca următorul nefericit să fie un furt.

Sau, un câine dopey, care părea complet dezavantat de alarmă.

Aveți probleme cu codul? Iată aplicație completă. Dacă primiți erori aleatorii, încercați să le lipiți mai jos și voi vedea dacă pot să vă ajut.

Credit imagine: Alarma de incendiu prin Flickr

James are licență în inteligență artificială și este certificat CompTIA A + și Network +. Este dezvoltatorul principal al MakeUseOf și își petrece timpul liber jucând VR paintball și boardgames. Construiește calculatoare de când era mic.