Εντοπίστε την κίνηση και, στη συνέχεια, τρομάξτε τον εαυτό σας από έναν εισβολέα με έναν ψηλό ήχο συναγερμού και φώτα που αναβοσβήνουν. Μήπως διασκέδαζε αυτό; Φυσικά το κάνει. Αυτός είναι ο στόχος του σημερινού έργου Arduino, κατάλληλο για αρχάριους. Θα γράψουμε εντελώς από το μηδέν και τις δοκιμές καθώς θα συνεχίσουμε, ώστε να έχετε την ελπίδα να έχετε κάποια ιδέα για το πώς γίνεται όλο αυτό παρά να εγκαταστήσετε απλά κάτι που έχω ήδη κάνει.
Αποποίηση: αυτό δεν πρόκειται να προστατεύσει πραγματικά το σπίτι σας. Θα μπορούσε να δώσει την αδελφή σας ένα δυσάρεστο σοκ, όταν γλιστρά στο δωμάτιό σας όμως.
Θα χρειαστείς:
- Ένα Arduino
- Υπερηχητικός αισθητήρας "ping", χρησιμοποιώ HC-SR04 Ένα PIR θα ήταν καλύτερο, αλλά αυτά είναι ακριβά. Ένας αισθητήρας ping μπορεί να τοποθετηθεί κρυφά σε μια πόρτα και εξακολουθεί να εξυπηρετεί την ίδια βασική εργασία και είναι μόνο $ 5
- Ένας πιεζοηλεκτρικός βομβητής
- LED λυχνία φως, με την ίδια καλωδίωση που χρησιμοποιήσαμε πίσω σε αυτό το έργο Δημιουργήστε το δικό σας δυναμικό φωτισμό περιβάλλοντος για ένα κέντρο πολυμέσων Δημιουργήστε το δικό σας δυναμικό φωτισμό περιβάλλοντος για ένα κέντρο πολυμέσων Αν παρακολουθήσετε πολλές ταινίες στον υπολογιστή σας ή το κέντρο μέσων ενημέρωσης, Σίγουρα έχετε αντιμετωπίσει το δίλημμα φωτισμού. απενεργοποιείτε εντελώς όλα τα φώτα; Τους κρατάτε σε πλήρη έκρηξη; Ή ... Διαβάστε περισσότερα.
Καθώς συνδέετε αυτό το έργο, μην αφαιρείτε τα πάντα κάθε φορά - απλά κρατήστε το κτίριο στο τελευταίο μπλοκ. Μέχρι να φτάσετε στην ενότητα "Κωδικοποίηση του Συναγερμού", θα πρέπει να έχετε όλα τα κομμάτια καλωδιωμένα επάνω, ψάχνοντας κάτι τέτοιο:
Φώτα που αναβοσβήνουν
Χρησιμοποιήστε το διάγραμμα συνδεσμολογίας αυτού του έργου Δημιουργήστε τη δική σας δυναμική ατμόσφαιρα φωτισμού για ένα κέντρο πολυμέσων Δημιουργήστε τη δική σας δυναμική ατμόσφαιρα φωτισμού για ένα κέντρο πολυμέσων Αν παρακολουθήσετε πολλές ταινίες στον υπολογιστή ή το κέντρο πολυμέσων σας, είμαι βέβαιος ότι αντιμετωπίζετε φωτισμό δίλημμα? απενεργοποιείτε εντελώς όλα τα φώτα; Τους κρατάτε σε πλήρη έκρηξη; Ή ... Διαβάστε περισσότερα για να συνδέσετε τη λωρίδα LED σας? μην αλλάζετε τις ακίδες, καθώς χρειαζόμαστε έξοδο PWM. Χρησιμοποιήστε αυτόν τον κώδικα για να δοκιμάσετε γρήγορα την καλωδίωση σας. Εάν όλα πάνε καλά, θα πρέπει να έχετε το εξής:
Αισθητήρας απόστασης
Στη μονάδα SR04 θα βρείτε 4 ακίδες. Το VCC και το GND φτάνουν σε + 5V σιδηροτροχιά και έδαφος αντίστοιχα. Το TRIG είναι ο ακροδέκτης που χρησιμοποιείται για την αποστολή ενός σήματος σόναρ, το βάλτε στο πείρο 6. Η ECHO χρησιμοποιείται για να διαβάσει το σήμα πίσω (και ως εκ τούτου να υπολογίσει την απόσταση) - το θέσει σε 7.
Για να κάνουμε τα πράγματα απίστευτα απλά, υπάρχει μια βιβλιοθήκη που μπορούμε να χρησιμοποιήσουμε, που ονομάζεται NewPing. Κάντε λήψη και τοποθετήστε το στο φάκελο της βιβλιοθήκης του Arduino και επανεκκινήστε το IDE πριν συνεχίσετε. Δοκιμάστε να χρησιμοποιήσετε αυτόν τον κωδικό. ανοίξτε τη σειριακή οθόνη και βεβαιωθείτε ότι η ταχύτητα είναι ρυθμισμένη στα 115200 baud. Με λίγη τύχη, θα πρέπει να δείτε κάποιες μετρήσεις απόστασης να σας στέλνουν πίσω σε αρκετά μεγάλη ταχύτητα. Μπορεί να βρείτε διακύμανση 1 ή 2 εκατοστών, αλλά αυτό είναι καλό. Δοκιμάστε να τρέξετε το χέρι σας μπροστά από τον αισθητήρα, μετακινώντας το προς τα πάνω και προς τα κάτω για να παρατηρήσετε τις μεταβαλλόμενες ενδείξεις.
Ο κώδικας πρέπει να είναι αρκετά απλός για να καταλάβει κανείς. Υπάρχουν μερικές δηλώσεις σχετικών ακίδων στην αρχή, συμπεριλαμβανομένης μίας μέγιστης απόστασης - αυτό μπορεί να ποικίλει ανάλογα με τον ακριβή αισθητήρα που έχετε, αλλά εφ 'όσον είστε σε θέση να πάρετε με ακρίβεια λιγότερο από 1 μέτρηση, θα πρέπει να είστε εντάξει.
Στον βρόχο αυτής της εφαρμογής δοκιμής, χρησιμοποιούμε τη λειτουργία ping () για να στείλουμε ένα ping σόναρ, παίρνοντας πίσω μια τιμή σε χιλιοστά του δευτερολέπτου για πόσο καιρό χρειαζόταν η αξία για να επιστρέψει. Για να το κατανοήσουμε αυτό, χρησιμοποιούμε τις βιβλιοθήκες NewPing που είναι ενσωματωμένες στο σταθερό του US_ROUNDTRIP_CM, το οποίο καθορίζει πόσες μικροδευτερότητες χρειάζεται για να φτάσουμε ένα εκατοστό. Υπάρχει επίσης μια καθυστέρηση 50 ms μεταξύ pings για να αποφευχθεί η υπερφόρτωση του αισθητήρα.
Piezo Alarm
Ο αισθητήρας Piezo crystal είναι ένας απλός και φτηνός βομβητής και μπορούμε να χρησιμοποιήσουμε έναν ακροδέκτη PWM 3 για να κάνουμε διαφορετικούς τόνους. Συνδέστε ένα καλώδιο στον ακροδέκτη 3, ένα στη γείωση - δεν έχει σημασία ποια.
Χρησιμοποιήστε αυτόν τον κώδικα για να δοκιμάσετε.
Ο μόνος τρόπος για να σκοτώσετε το μάλλον ενοχλητικό και δυνατά συναγερμό είναι να τραβήξετε τα βύσματα. Ο κώδικας είναι λίγο περίπλοκος για να εξηγήσει, αλλά περιλαμβάνει τη χρήση ημιτονοειδών κυμάτων για να δημιουργήσει ένα χαρακτηριστικό ήχο. Εξασφαλίστε τους αριθμούς που θέλετε να παίξετε με διαφορετικούς τόνους.
Κωδικοποίηση του συστήματος συναγερμού
Τώρα που έχουμε όλα τα κομμάτια αυτού του παζλ, ας τα συνδυάσουμε.
Προχωρήστε και κάντε ένα νέο σκίτσο, που ονομάζεται Συναγερμός . Ξεκινήστε συνδυάζοντας όλες τις μεταβλητές και τους ορισμούς των ακίδων που έχουμε στα παραδείγματα δοκιμών μέχρι τώρα.
#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;
Ξεκινήστε γράφοντας μια βασική λειτουργία setup () - θα ασχοληθούμε μόνο με τα φώτα για τώρα. Έχω προσθέσει μια καθυστέρηση 5 δευτερολέπτων πριν αρχίσει ο κύριος βρόχος να μας δώσει κάποιο χρόνο για να βγούμε από το δρόμο αν χρειαστεί.
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); }
Ας χρησιμοποιήσουμε μια λειτουργία βοηθού που μας επιτρέπει να γράφουμε γρήγορα μια μοναδική τιμή RGB στα φώτα.
//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); }
Τέλος, ο βρόχος μας για τώρα πρόκειται να αποτελείται από ένα απλό έγχρωμο φλας μεταξύ κόκκινου και κίτρινου χρώματος (ή ό, τι θέλετε να είναι ο συναγερμός σας - αλλάξτε μόνο τις τιμές RGB).
void loop(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yellow delay(100); }
Μεταφορτώστε και δοκιμάστε αυτό για να βεβαιωθείτε ότι βρίσκεστε στο σωστό δρόμο.
Τώρα, ας ενσωματώσουμε τον αισθητήρα απόστασης για να ενεργοποιήσουμε αυτά τα φώτα μόνο όταν κάτι έρχεται μέσα, ας πούμε, 50 cm (λίγο λιγότερο από το πλάτος ενός πλαισίου πόρτας). Έχουμε ήδη ορίσει τις σωστές καρφίτσες και εισήγαγε τη βιβλιοθήκη, οπότε πριν τη συνάρτηση setup () προσθέσετε την ακόλουθη γραμμή για να την εμφανίσετε:
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
Κάτω από αυτό, προσθέστε μια μεταβλητή για να αποθηκεύσετε την κατάσταση του ξυπνητηριού που ενεργοποιείται ή όχι, προεπιλογή σε ψευδή, φυσικά.
boolean triggered = false;
Προσθέστε μια γραμμή στη συνάρτηση setup () για να μπορέσουμε να παρακολουθήσουμε την έξοδο στη σειριακή και την αποσφαλμάτωση.
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
Στη συνέχεια, ας μετονομάσουμε τον τρέχοντα βρόχο σε συναγερμό () - αυτό θα λέγεται αν έχει ενεργοποιηθεί ο συναγερμός.
void alarm(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yelow delay(100); }
Τώρα δημιουργήστε μια νέα λειτουργία βρόχου (), στην οποία θα φέρουμε ένα νέο ping, θα διαβάσουμε τα αποτελέσματα και θα ενεργοποιήσουμε τον συναγερμό εάν ανιχνευτεί κάτι μέσα στο εύρος του μετρητή.
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; } } }
Επιτρέψτε μου να εξηγήσω σύντομα τον κώδικα:
- Ξεκινήστε ελέγχοντας για να δείτε αν έχει ενεργοποιηθεί ο συναγερμός και αν ναι, πυρπολίστε τη λειτουργία συναγερμού (μόλις αναβοσβήνουν τα φώτα αυτή τη στιγμή).
- Αν δεν έχει ενεργοποιηθεί ακόμα, πάρτε την τρέχουσα ανάγνωση από τον αισθητήρα.
- Εάν ο αισθητήρας διαβάζει <100 cm, κάτι έχει γεμίσει τη δέσμη (προσαρμόστε αυτήν την τιμή αν ξεκινά πολύ προωθώντας για εσάς, προφανώς).
Δοκιμάστε τώρα, πριν προσθέσετε τον ενοχλητικό πιεζοηλεκτρικό βομβητή.
Εργαζόμενος? Εξαιρετική. Τώρα ας προσθέσουμε αυτό το βομβητή πίσω. Προσθέστε pinMode στη ρουτίνα setup () .
pinMode(ALARM, OUTPUT);
Στη συνέχεια, προσθέστε το piezo buzzer loop στη λειτουργία συναγερμού ():
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); }
Αν προσπαθήσετε να μεταγλωττίσετε σε αυτό το σημείο, θα πάρετε ένα λάθος - έχω αφήσει αυτό σε σκόπιμα, ώστε να μπορείτε να δείτε μερικά κοινά θέματα. Σε αυτή την περίπτωση, τόσο η βιβλιοθήκη NewPing όσο και η τυποποιημένη βιβλιοθήκη τόνου χρησιμοποιούν τις ίδιες διακοπές - είναι βασικά αντιφατικές και δεν μπορείτε να κάνετε πολλά για να το διορθώσετε. Ω αγαπητό.
Δεν υπάρχουν ανησυχίες όμως. Είναι ένα κοινό πρόβλημα, και κάποιος έχει ήδη μια λύση - κατεβάστε και προσθέστε αυτό το NewTone στο φάκελό σας Arduino Libraries. Ρυθμίστε την αρχή του προγράμματος σας για να συμπεριλάβετε αυτό:
#include
Και προσαρμόστε τη γραμμή:
tone(ALARM, toneVal);
προς την
NewTone(ALARM, toneVal);
αντι αυτου.
Αυτό είναι. Ρυθμίστε τον συναγερμό σας στην πόρτα της κρεβατοκάμαράς σας για τον επόμενο άτυχο θα είναι διαρρήκτης.
Ή, ένα σκυλάκι, που φαινόταν εντελώς άβολο από τον συναγερμό.
Έχετε πρόβλημα με τον κώδικα; Εδώ είναι η πλήρης εφαρμογή. Αν παίρνετε τυχαία σφάλματα, δοκιμάστε να τα τοποθετήσετε παρακάτω και θα δούμε αν μπορώ να βοηθήσω.
Πιστοποίηση εικόνας: Συναγερμός πυρκαγιάς μέσω Flickr