Erkennen Sie Bewegung, dann erschrecken Sie einen Eindringling mit einem hohen Alarmton und blinkenden Lichtern. Klingt das lustig? Natürlich tut es das. Das ist das Ziel des heutigen Arduino-Projekts, das für Anfänger geeignet ist. Wir werden komplett von Grund auf schreiben und testen, während wir weitermachen, damit Sie hoffentlich eine Vorstellung davon bekommen, wie alles gemacht wird, anstatt einfach etwas zu installieren, was ich bereits gemacht habe.
Haftungsausschluss: Dies wird Ihr Haus nicht wirklich schützen. Es könnte Ihrer Schwester einen bösen Schock bereiten, wenn sie in Ihr Zimmer schleicht.
Du brauchst:
- Ein Arduino
- Ultraschall "Ping" Sensor, ich benutze HC-SR04 Ein PIR wäre besser, aber diese sind teuer. Ein Ping-Sensor kann unauffällig in einer Türöffnung platziert werden und immer noch denselben grundlegenden Job erfüllen und kostet nur 5 US-Dollar
- Ein Piezo-Summer
- LED-Lichtleiste, mit der gleichen Verkabelung, die wir in diesem Projekt verwendet haben Bauen Sie Ihre eigene dynamische Ambientebeleuchtung für ein Media Center Erstellen Sie Ihre eigene dynamische Ambientebeleuchtung für ein Media Center Wenn Sie eine Menge Filme auf Ihrem PC oder Media Center ansehen, Ich bin sicher, dass du dem Beleuchtungsdilemma gegenüberstehst; Schalte du alle Lichter aus? Halten Sie sie auf Hochtouren? Oder ... Lesen Sie mehr.
Während Sie dieses Projekt zusammenführen, entfernen Sie nicht jedes Mal alles - bauen Sie einfach weiter auf dem letzten Block. Zu dem Zeitpunkt, zu dem Sie zum Abschnitt "Coding The Alarm System" kommen, sollten Sie alle Bits und Teile verdrahtet haben, die ungefähr so aussehen:
Blinkende Lichter
Verwenden Sie den Schaltplan aus diesem Projekt Erstellen Sie Ihre eigene dynamische Ambient Beleuchtung für ein Media Center Erstellen Sie Ihre eigene dynamische Ambient Beleuchtung für ein Media Center Wenn Sie viele Filme auf Ihrem PC oder Media Center sehen, bin ich sicher, dass Sie die konfrontiert haben Beleuchtungsdilemma; Schalte du alle Lichter aus? Halten Sie sie auf Hochtouren? Oder ... Lesen Sie mehr, um Ihren LED-Streifen anzuschließen; Ändern Sie nicht die Pins, da wir PWM-Ausgang benötigen. Verwenden Sie diesen Code, um Ihre Verkabelung schnell zu testen. Wenn alles gut geht, solltest du folgendes haben:
Abstandssensor
Auf dem SR04-Modul finden Sie 4 Pins. VCC und GND gehen auf +5 V Schiene bzw. Masse; TRIG ist der Pin, der zum Senden eines Sonar-Signals verwendet wird, setzen Sie diesen auf Pin 6; ECHO wird verwendet, um das Signal zurück zu lesen (und daher den Abstand zu berechnen) - setze dies auf 7.
Um die Dinge unglaublich einfach zu machen, gibt es eine Bibliothek namens NewPing. Downloaden und in Ihrem Arduino- Bibliotheksordner platzieren und die IDE neu starten, bevor Sie fortfahren. Test mit diesem Code; Öffnen Sie den seriellen Monitor und stellen Sie sicher, dass die Geschwindigkeit auf 115200 Baud eingestellt ist. Mit etwas Glück sollten Sie sehen, dass einige Entfernungsmessungen mit ziemlich hoher Geschwindigkeit an Sie gesendet werden. Sie können eine Abweichung von 1 oder 2 Zentimetern finden, aber das ist in Ordnung. Versuchen Sie, Ihre Hand vor den Sensor zu führen und bewegen Sie ihn nach oben und unten, um die wechselnden Messwerte zu beobachten.
Der Code sollte ziemlich einfach zu verstehen sein. Es gibt ein paar Deklarationen der relevanten Pins am Start, einschließlich einer maximalen Entfernung - dies kann je nach dem genauen Sensor variieren, aber solange Sie weniger als 1 Meter genau messen können, sollten Sie in Ordnung sein.
In der Schleife dieser Test-App verwenden wir die Funktion ping (), um einen Sonar-Ping zu senden, der einen Wert in Millisekunden zurückgibt, wie lange es dauerte, bis der Wert zurückgegeben wurde. Um dies zu verstehen, verwenden wir die NewPing-Bibliotheken, die in der Konstanten US_ROUNDTRIP_CM eingebaut sind, die definiert, wie viele Mikrosekunden es dauert, um einen Zentimeter zu messen . Es gibt auch eine Verzögerung von 50 ms zwischen den Pings, um eine Überlastung des Sensors zu vermeiden.
Piezo-Alarm
Der Piezokristallsensor ist ein einfacher und preiswerter Summer und wir können einen PWM-Pin 3 verwenden, um verschiedene Töne zu erzeugen. Verbinden Sie eine Leitung mit Pin 3, eine mit der Erdungsschiene - egal welche.
Verwenden Sie diesen Code zum Testen.
Die einzige Möglichkeit, den ziemlich widerlichen und lauten Alarm zu töten, ist es, die Stecker zu ziehen. Der Code ist ein wenig komplex zu erklären, aber es beinhaltet die Verwendung von Sinuswellen, um einen unverwechselbaren Klang zu erzeugen. Tweak die Zahlen, um mit verschiedenen Tönen zu spielen.
Codierung des Alarmsystems
Nun, da wir alle Teile dieses Puzzles haben, kombinieren wir sie zusammen.
Machen Sie eine neue Skizze namens Alarm . Beginnen Sie damit, alle Variablen und Pin-Definitionen zu kombinieren, die wir in den Testbeispielen bisher hatten.
#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;
Beginnen Sie mit dem Schreiben einer grundlegenden setup () Funktion - wir werden uns nur mit den Lichtern beschäftigen. Ich habe eine Verzögerung von 5 Sekunden hinzugefügt, bevor die Hauptschleife gestartet wird, um uns etwas Zeit zu geben, um bei Bedarf aus dem Weg zu gehen.
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); }
Verwenden wir eine Hilfsfunktion, mit der wir schnell einen einzelnen RGB-Wert in die Lichter schreiben können.
//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); }
Schließlich wird unsere Schleife für den Moment aus einem einfachen Farbblitz zwischen rot und gelb bestehen (oder, was auch immer Ihr Alarm sein soll - ändern Sie einfach die RGB-Werte).
void loop(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yellow delay(100); }
Laden und testen Sie das, um sicherzustellen, dass Sie auf dem richtigen Weg sind.
Lassen Sie uns jetzt den Abstandssensor integrieren, um diese Lichter nur dann auszulösen, wenn etwas in den Raum kommt, sagen wir 50 cm (etwas weniger als die Breite eines Türrahmens). Wir haben bereits die richtigen Pins definiert und die Bibliothek importiert. Fügen Sie daher vor der Funktion setup () die folgende Zeile hinzu, um sie zu instanziieren:
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
Darunter fügen Sie eine Variable hinzu, um den Status des Alarms zu speichern, der ausgelöst wird oder nicht, natürlich mit dem Wert false.
boolean triggered = false;
Fügen Sie der Funktion setup () eine Zeile hinzu, damit wir die Ausgabe auf serial und debug überwachen können.
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
Als nächstes benennen wir die aktuelle Schleife in Alarm () um - dies wird aufgerufen, wenn der Alarm ausgelöst wurde.
void alarm(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yelow delay(100); }
Erstellen Sie nun eine neue loop () - Funktion, in der wir einen neuen Ping holen, die Ergebnisse lesen und den Alarm auslösen, wenn innerhalb des Messbereichs etwas entdeckt wird.
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; } } }
Lass mich den Code kurz erklären:
- Überprüfen Sie zunächst, ob der Alarm ausgelöst wurde, und falls ja, schalten Sie die Alarmfunktion aus (blinken Sie gerade).
- Wenn es noch nicht ausgelöst wurde, erhalten Sie den aktuellen Messwert vom Sensor.
- Wenn der Sensor <100 cm liest, hat etwas den Balken gepolstert (stellen Sie diesen Wert ein, wenn er zu früh für Sie auslöst).
Probieren Sie es aus, bevor wir den lästigen Piezo-Summer hinzufügen.
Arbeiten? Groß. Jetzt fügen wir diesen Summer zurück. Fügen Sie pinMode zur Routine setup () hinzu .
pinMode(ALARM, OUTPUT);
Fügen Sie dann die Piezo-Summerschleife zur Alarm () Funktion hinzu:
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); }
Wenn Sie versuchen, zu diesem Zeitpunkt zu kompilieren, werden Sie einen Fehler bekommen - ich habe das absichtlich vergessen, damit Sie einige allgemeine Probleme sehen können. In diesem Fall verwenden sowohl die NewPing- als auch die Standard-Tonbibliothek die gleichen Interrupts - sie sind im Grunde widersprüchlich und es gibt nicht viel, was Sie tun können, um das Problem zu beheben. Ach je.
Keine Sorgen, obwohl. Es ist ein häufiges Problem, und jemand hat bereits eine Lösung - laden Sie dieses NewTone herunter und fügen Sie es Ihrem Arduino Libraries-Ordner hinzu. Passen Sie den Anfang Ihres Programms an, um Folgendes einzuschließen:
#include
Und justiere die Linie:
tone(ALARM, toneVal);
zu
NewTone(ALARM, toneVal);
stattdessen.
Das ist es. Stellen Sie Ihren Alarm in der Tür Ihres Schlafzimmers für den nächsten glücklosen Möchtegern-Einbrecher auf.
Oder ein dämlicher Hund, der vom Alarm völlig unbeeindruckt schien.
Haben Sie Probleme mit dem Code? Hier ist die komplette App. Wenn du zufällige Fehler bekommst, versuche sie unten einzufügen und ich werde sehen, ob ich dir helfen kann.
Bildnachweis: Feueralarm via Flickr