Cum se face un sistem simplu de alarmă Arduino

Cum se face un sistem simplu de alarmă Arduino / DIY

Detectați mișcarea, apoi speriți-vă de un intrus cu o sunete de alarmă ridicată și lumini intermitente. Suna distractiv? Bineînțeles. Acesta este scopul proiectului de astăzi Arduino, potrivit pentru începători. Vom scrie complet de la zero și de testare pe măsură ce vom merge, astfel încât să puteți avea o idee despre cum se face totul, mai degrabă decât pur și simplu instalarea ceva ce am făcut deja.

Renunțare: acest lucru nu vă va proteja casa. Aceasta ar putea da sora ta un șoc urât atunci când ea furiș în camera dvs., totuși.

O să ai nevoie:

  • Un Arduino
  • cu ultrasunete “ping” senzor, eu sunt folosind HC-SR04 Un PIR ar fi mai bine, dar acestea sunt scumpe. Un senzor de ping poate fi plasat în secret într-o ușă și încă mai servește aceeași slujbă de bază și este de numai 5 USD
  • Un buzzer piezo
  • LED-ul de lumină, cu aceleași cabluri am folosit înapoi în acest proiect Construiți-vă propria dvs. dinamică de iluminat ambiental pentru un centru de mass-media Construiți-vă propria lumină ambientală de iluminat pentru un centru de mass-media Dacă urmăriți o mulțime de filme pe PC-ul dvs. sau centru media, sigur că te-ai confruntat cu dilema de iluminare; opriți complet toate luminile? Îi păstrezi în plină explozie? Sau ... Citiți mai mult .

Pe măsură ce conectați acest proiect, nu eliminați totul de fiecare dată - continuați să construiți pe ultimul bloc. Până când ajungi “Codarea sistemului de alarmă” secțiune, ar trebui să aveți toate bucățile de bucăți în sus, arătând ceva de genul:

Lumini intermitente

Utilizați schema de conexiuni din acest proiect Construiți-vă propria lumină dinamică pentru un centru media Construiți-vă propria lumină dinamică pentru un centru media Dacă vizionați o mulțime de filme pe PC-ul dvs. sau în centrul media, sunteți sigur că v-ați confruntat cu iluminare dilemă; opriți complet toate luminile? Îi păstrezi în plină explozie? Sau ... Citiți mai multe pentru a vă conecta benzile LED; nu schimbați pinii, deoarece avem nevoie de ieșire PWM. Utilizați acest cod pentru a vă testa rapid cablajul. Dacă totul merge bine, ar trebui să aveți acest lucru:

Distanță senzor

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

Pentru a face lucrurile incredibil de simple, există o bibliotecă pe care o putem folosi numită NewPing. Descărcați și puneți-vă în arduino-urile voastre Bibliotecă și reinițializați IDE înainte de a continua. Testați utilizând 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 că unele măsurători de distanță sunt trimise înapoi la tine la o viteză destul de mare. Puteți găsi o varianță de 1 sau 2 centimetri, dar acest lucru este bine. Încercați să rulați mâna în fața senzorului, deplasându-l în sus și în jos pentru a observa schimbările citite.

Codul ar trebui să fie destul de simplu de înțeles. Există puține declarații despre pinii relevanți la început, inclusiv o distanță maximă - acest lucru poate varia în funcție de senzorul exact pe care îl aveți, dar atâta timp cât puteți obține cu precizie mai puțin de 1 metru, trebuie să fiți bine.

În bucla acestei aplicații de testare, folosim ping () funcția de a trimite un sonar ping, obținându-și înapoi o valoare în milisecunde din timpul necesar pentru ca valoarea să revină. Pentru a înțelege acest lucru, folosim bibliotecile NewPing construite în constanta US_ROUNDTRIP_CM, care definește câte microsecunde este nevoie pentru a ajunge la un singur centimetru. Există, de asemenea, o întârziere de 50 ms între ping-uri pentru a evita supraîncărcarea senzorului.

Piezo Alarm

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

Utilizați acest cod pentru a testa.

Singura modalitate de a ucide alarmarea destul de neplăcută și tare este să scoateți dopurile. Codul este puțin complex pentru a explica, dar implică utilizarea undelor sine pentru a genera un sunet distinctiv. Ajustați cifrele pentru a juca cu tonuri diferite.

Codarea sistemului de alarmă

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

Mergeți și faceți o nouă schiță, numită Alarma. Începeți prin combinarea tuturor variabilelor și a definițiilor PIN-urilor pe care le avem în exemplele de testare până acum.

#include  // Selectați ce pini capabili să utilizeze PWM. #define RED_PIN 10 #define GREEN_PIN 11 #define BLUE_PIN 9 #definare TRIGGER_PIN 6 / / Pivotul Arduino legat de pinul de declanșare al senzorului cu ultrasunete. #definiti ECHO_PIN 7 / / Arduino pin legat de pinul ecou pe senzorul cu ultrasunete. #define MAX_DISTANCE 100 // Distanța maximă pe care dorim să o pingem (în centimetri). #define ALARM 3 float sinVal; int toneVal; 

Începeți prin a scrie un element de bază înființat() funcționează - vom rezolva doar luminile pentru moment. Am adăugat o întârziere de 5 secunde înainte ca bucla principală să înceapă să ne dea ceva timp pentru a ieși din drum dacă este necesar.

void setup () // set pinModuri pentru pinul RGB (pinul RED_PIN, OUTPUT); pinMode (BLUE_PIN, OUTPUT); pinMode (GREEN_PIN, OUTPUT); // resetează lumini 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 o singură valoare RGB pe luminile.

// funcția helper care ne permite să trimitem o culoare într-o singură comandă void color (caracterele nesemnate, roșu nesignificat, caractere nesemnate char negru, nesemnate char albastru) // funcția de generare a culorilor analogWrite (RED_PIN, roșu); analogWrite (BLUE_PIN, albastru); analogWrite (GREEN_PIN, verde); 

În cele din urmă, bucla noastră pentru moment va consta într-o simplă aprindere a culorii între roșu și galben (sau, indiferent de ce doriți ca alarma dvs. să fie - modificați doar valorile RGB).

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

Încărcați și testați-le pentru a vă asigura că sunteți pe drumul cel bun.

Acum, să integrăm senzorul de distanță pentru a declanșa acele lumini doar atunci când ceva se află în interiorul, de exemplu, 50 cm (doar mai puțin decât lățimea unui cadru al ușii). Deja am definit pinii potriviți și am importat biblioteca, deci înainte de dvs. înființat() adăugați următoarea linie pentru ao instanți:

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 alarmei care este declanșată sau nu, implicit la falsă, desigur.

boolean declanșat = fals; 

Adăugați o linie la înființat() astfel încât să putem monitoriza rezultatele pe seriale și depanare.

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

Apoi, redenumiți bucla curentă la alarma() - aceasta este ceea ce va fi numit dacă alarma a fost declanșată.

void alarm () culoare (255,0,0); // întârziere roșie (100); culoare (255,255,0); // întârziere yelow (100); 

Acum creați un nou buclă() funcția în care se aduce un nou ping, se citesc rezultatele și se declanșează alarma dacă se detectează ceva în intervalul de măsurare.

void loop () if (declanșat == true) alarm ();  altceva delay (50); // Așteptați 50ms între ping-uri (aproximativ 20 pings / sec). 29ms ar trebui să fie cea mai scurtă întârziere dintre ping-uri. nesemnate int uS = sonar.ping (); // Trimiteți ping, obțineți timpul ping în microsecunde (uS). distanța nesemnată int = uS / US_ROUNDTRIP_CM; Serial.println (distanța); dacă (distanța < 100) triggered = true;    

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

  • Începeți prin a verifica dacă a fost declanșată alarma și, dacă da, opriți funcția de alarmă (doar clipește lumina în momentul respectiv).
  • Dacă nu a fost declanșat încă, obțineți citirea curentă de la senzor.
  • Dacă senzorul citește <100 cm, something has padded the beam (adjust this value if it's triggering too early for you, obviously).

Dați-i o încercare acum, înainte de a adăuga buzzerul piezo enervant.

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

pinMode (ALARMĂ, IEȘIRE); 

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

pentru (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);  

Dacă încercați să compilați în acest moment, veți întâlni o eroare - am lăsat acest lucru în mod deliberat, pentru a putea vedea câteva probleme frecvente. În acest caz, atât biblioteca NewPing, cât și biblioteca standard de tonuri utilizează aceleași întreruperi - sunt în principiu conflictuale și nu puteți face prea multe pentru ao rezolva. Aoleu.

Fără grijă, totuși. Este o problemă obișnuită și cineva are deja o soluție - descărcați și adăugați acest NewTone în dosarul Arduino Libraries. Ajustați începutul programului pentru a include acest lucru:

#include  

Și ajustați linia:

 ton (ALARM, tonVal); 

la

 NewTone (ALARM, tonVal); 

in schimb.

Asta e. Pune-ți alarma în pragul dormitorului tău pentru următorul nefericit șmecher.

Sau, un câine dulce, care părea complet neliniștit de alarmă.

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

Credit de imagine: Alarmă de incendiu prin Flickr

Explorați mai multe despre: Arduino.