Membuat Kotak Teka-Teki IoT Aman dengan Arduino MKR Bundle – Panduan Langkah demi Langkah
Komponen dan Perlengkapan
Komponen
Keterangan
Jumlah
Arduino MKR IoT Bundle
×
1
Aplikasi dan Layanan Online
Aplikasi
Keterangan
Blynk
Tentang Proyek Ini
Catatan: Tutorial ini mungkin sudah usang, silakan pergi di sini untuk versi yang lebih baru.
Menjaga barang berharga Anda dari mata yang ingin tahu kadang-kadang sulit, kecuali Anda menaruhnya di dalam lemari besar atau semacamnya... tapi siapa yang punya ruang untuk itu?
Alih-alih, buat kotak teka-teki Anda sendiri menggunakan komponen dari MKR IoT Bundle dan beberapa kardus! Kami tidak dapat menjamin keamanan barang Anda, tetapi setidaknya itu akan menjadi cara menghindari yang menyenangkan bagi pencuri yang berminat.
Tentu saja, kami menyarankan Anda untuk menyimpan permen di dalamnya... bukan barang berharga asli.
Dalam Kesesingkatnya
Untuk membuka kotak, yang ditutup dengan motor servo, Anda harus memutar potensiometer sampai mendapatkan kombinasi yang benar. Kombinasi dapat diatur melalui aplikasi online Blynk. Seorang LED akan membantu Anda menebak, memberikan umpan balik warna: semakin dekat Anda semakin hangat warnanya.
Ketika kombinasi yang benar ditebak buzzer akan mulai memutar lagu sementara servo akan membuka kotak.
Untuk membuat kotak teka-teki kami akan membutuhkan komponen berikut:
Buzzer
LED RGB
3 potensiometer
Layar LCD
Motor servo
Tujuan Pembelajaran
Mengenalkan platform internet Blynk
Mengkabel dan menggunakan layar LCD
Memutar lagu Star Wars dengan buzzer
Ingin Tahu Lebih Banyak?
Tutorial ini adalah bagian dari serangkaian eksperimen yang mempelajari Anda dengan MKR1000 dan IoT. Semua eksperimen dapat dibangun menggunakan komponen yang terkandung dalam MKR IoT Bundle.
I Love You Pillow
Puzzle Box
Pavlov's Cat
The Nerd
Plant communicator
Mengenalkan Blynk
Blynk adalah aplikasi seluler populer untuk Internet of Things, ini memungkinkan kami untuk dengan mudah mengontrol Arduino yang terhubung internet dari mana saja, kapan saja.
Ini didirikan di Kickstarter dan dengan cepat menjadi salah satu aplikasi yang paling banyak digunakan di bidang ini, berkat dokumentasi yang luar biasa dan kesederhanaannya.
Memulai dengan Blynk
Membuat proyek baru sangat mudah, ikuti langkah-langkah sederhana ini atau lihat getting started resmi dari Blynk.
Setelah Anda berhasil membuat proyek baru Anda juga akan menerima melalui email Auth Token. Ini adalah pengidentifikasi unik yang diperlukan untuk menghubungkan hardware Anda ke ponsel Anda. Setiap proyek baru yang Anda buat akan memiliki Auth Token sendiri.
Untuk menghubungkan Arduino ke aplikasi kita perlu menginstal library Blynk. Jika Anda menggunakan Arduino Web Editor library akan secara otomatis diunduh saat Anda menyertakannya dalam sketch, jika tidak Anda dapat mengunduhnya dari library manager.
Sekarang kita siap. Unggah sketch ini dan bermain dengan slider untuk melihat hasilnya:
#include <WiFi101.h> #include <BlynkSimpleWiFiShield101.h> const char* ssid = SECRET_SSID; // your network SSID (name) const char* password = SECRET_PSWD; // your network password char auth[] = SECRET_TOKEN; // your Blynk API token // Variables to store the combination value // Set the intitial combination to ( 1 1 1 ) int SliderValueOne = 1; int SliderValueTwo = 1; int SliderValueThree = 1; // Blynk functions to retrive values BLYNK_WRITE(V1) { SliderValueOne = param.asInt(); // assigning incoming value from pin V1 to a variable } BLYNK_WRITE(V2) { SliderValueTwo = param.asInt(); // assigning incoming value from pin V1 to a variable } BLYNK_WRITE(V3) { SliderValueThree = param.asInt(); // assigning incoming value from pin V1 to a variable } void setup() { Serial.begin(9600); Blynk.begin(auth, ssid, password); // start Blynk functionalities and connect to WiFi } void loop() { // Variambles to temporarily store the combination int Temp_Slider_One_value = SliderValueOne; int Temp_Slider_Two_value = SliderValueTwo; int Temp_Slider_Three_value = SliderValueThree; Blynk.run(); // poll new combination values from the online app // check if combination values are changed and print them on the console if(Temp_Slider_One_value != SliderValueOne || Temp_Slider_Two_value != SliderValueTwo || Temp_Slider_Three_value != SliderValueThree){ Serial.print("New combination: "); Serial.print(SliderValueOne); Serial.print(" "); Serial.print(SliderValueTwo); Serial.print(" "); Serial.println(SliderValueThree); } }
Menggunakan Layar LCD
Waktu untuk menghubungkan layar!
Layar LCD mudah digunakan tetapi membutuhkan banyak kabel, jadi siapkanlah untuk membuktikan kesabaran Anda.
Perhatikan bahwa kami menggunakan pasokan daya 5V dan resistor 220 Ohm.
Kecerahan dapat diatur mengubah nilai output dari pin Analog 3 dari 0 hingga 255 dengan 0 adalah nilai maksimum.
analogWrite(A3, 0);
Sekarang kita dapat mengunggah sketch contoh dan melihat apakah semuanya berjalan dengan baik.
// include the library code: #include <LiquidCrystal.h> // initialize the library by associating any needed LCD interface pin // with the arduino pin number it is connected to const int rs = 12, en = 11, d4 = 2, d5 = 3, d6 = 4, d7 = 5; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); void setup() { analogWrite(A3, 0); // Set the brightness to its maximum value // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. lcd.print("hello, world!"); } void loop() { // set the cursor to column 0, line 1 // (note: line 1 is the second row, since counting begins with 0): lcd.setCursor(0, 1); // print the number of seconds since reset: lcd.print(millis() / 1000); }
Menambahkan Potensiometer
Untuk membaca nilai potensiometer kita hanya membutuhkan analogRead() pada pin yang benar. Kami menghubungkannya ke pin Analog 0 , 1 , 2.
Perhatikan bahwa nilai potensiometer berkisar dari 0 hingga 1023 sehingga kombinasi tidak mungkin ditebak. Untuk memetakan nilai tersebut dari 0 hingga 9 kita akan menggunakan fungsi map(),
int PotOne = map(analogRead(A0), 0, 1023, 0, 9);
Anda dapat menggunakan kode contoh ini untuk mencetak nilai potensiometer pada layar LCD.
#include <LiquidCrystal.h> // LCD screen pins const int rs = 12, en = 11, d4 = 2, d5 = 3, d6 = 4, d7 = 5; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); void setup() { analogWrite(A3, 0); // set the brightness of the LCD screen to the maximum value Serial.begin(9600); lcd.begin(16, 2); // begin LCD screen with 16 columns and 2 rows } void loop() { int PotOne = map(analogRead(A0), 0, 1023, 0, 9); int PotTwo = map(analogRead(A1), 0, 1023, 0, 9); int PotThree = map(analogRead(A2), 0, 1023, 0, 9); lcd.setCursor(0, 0); lcd.print(PotOne); lcd.setCursor(2, 0); lcd.print(PotTwo); lcd.setCursor(4, 0); lcd.print(PotThree); }
Menambahkan LED RGB
Kami akan menggunakan LED RGB sebagai umpan balik untuk membantu orang menebak kombinasi, semakin dekat mereka ke nilai yang benar semakin hangat warna LED, berkisar dari biru, aqua, kuning dan merah.
Anda dapat menggunakan sketch contoh ini untuk melihat LED RGB dalam aksi!
// RGB LED pins int redPin = 6; int greenPin = 8; int bluePin = 7; void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); Serial.begin(9600); } void loop() { setColor(0, 0, 255); // blue delay(1000); setColor(0, 255, 255); // aqua delay(1000); setColor(255, 255, 0); // yellow delay(1000); setColor(255, 0, 0); // Red delay(1000); } // Send RGB values to the LED pins void setColor(int red, int green, int blue){ analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); }
Menghubungkannya ke Blynk
Sekarang kita siap untuk menyatukan semuanya: menghubungkan papan ke Blynk, potensiometer ke layar LCD dan membuat LED berkedip hijau ketika kombinasi benar.
Perhatikan bahwa kami akan menggunakan fungsi giveColorFeedback() untuk mengatur warna LED ketika nilai absolut dari setiap potensiometer lebih dekat dari ambang tertentu ke kombinasi yang benar.
void giveColorFeedback(int PotOne, int PotTwo, int PotThree){...}
Kami juga akan menggunakan variabel ini untuk menyimpan nilai yang dikirim dari aplikasi dan oleh karena itu kombinasi.
int SliderValueOne = 1; int SliderValueTwo = 1; int SliderValueThree = 1;
Perhatikan bahwa nilai awal diatur ke 1, itu akan berubah hanya jika Anda mengubah nilai slider di aplikasi. Jika Anda mereset papan kombinasi akan kembali ke nilai default.
Variabel boolean bool start = true; digunakan untuk mendeteksi ketika kombinasi telah ditebak, untuk menghindari membuka kotak setiap loop.
Unggah sketch contoh ini untuk melihatnya dalam aksi:
#include <LiquidCrystal.h> #include <SPI.h> #include <WiFi101.h> #include <BlynkSimpleWiFiShield101.h> // RGB LED pins int redPin = 6; int greenPin = 8; int bluePin = 7; const char* ssid = SECRET_SSID; // your network SSID (name) const char* password = SECRET_PSWD; // your network password char auth[] = SECRET_TOKEN; // your Blynk API token // LCD screen pins const int rs = 12, en = 11, d4 = 2, d5 = 3, d6 = 4, d7 = 5; bool start = true; // Variables to store the combination value // Set the intitial combination to ( 1 1 1 ) int SliderValueOne = 1; int SliderValueTwo = 1; int SliderValueThree = 1; // Blynk functions to retrive values BLYNK_WRITE(V1) { SliderValueOne = param.asInt(); // assigning incoming value from pin V1 to a variable } BLYNK_WRITE(V2) { SliderValueTwo = param.asInt(); // assigning incoming value from pin V1 to a variable } BLYNK_WRITE(V3) { SliderValueThree = param.asInt(); // assigning incoming value from pin V1 to a variable } LiquidCrystal lcd(rs, en, d4, d5, d6, d7); void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); analogWrite(A3, 0); // set the brightness of the LCD screen to the maximum value Serial.begin(9600); lcd.begin(16, 2); // begin LCD screen with 16 columns and 2 rows Blynk.begin(auth, ssid, password); // start Blynk functionalities } void loop() { // Variambles to temporarily store the combination int Temp_Slider_One_value = SliderValueOne; int Temp_Slider_Two_value = SliderValueTwo; int Temp_Slider_Three_value = SliderValueThree; Blynk.run(); // poll new combination values from the online app // check if combination values are changed and print them on the console if(Temp_Slider_One_value != SliderValueOne || Temp_Slider_Two_value != SliderValueTwo || Temp_Slider_Three_value != SliderValueThree){ Serial.print("New combination: "); Serial.print(SliderValueOne); Serial.print(" "); Serial.print(SliderValueTwo); Serial.print(" "); Serial.println(SliderValueThree); } int PotOne = map(analogRead(A0), 0, 1023, 0, 9); int PotTwo = map(analogRead(A1), 0, 1023, 0, 9); int PotThree = map(analogRead(A2), 0, 1023, 0, 9); lcd.setCursor(0, 0); lcd.print(PotOne); lcd.setCursor(2, 0); lcd.print(PotTwo); lcd.setCursor(4, 0); lcd.print(PotThree); if (start) { giveColorFeedback(PotOne, PotTwo, PotThree); if (PotOne == SliderValueOne && PotTwo == SliderValueTwo && PotThree == SliderValueThree) { blinkGreenLed(); start = false; } } if(!start) { if(PotOne == 0 && PotTwo == 0 && PotThree == 0){ start = true; } } } // Give feedback based on how close the potentiometer are to the combination value // The more it's close the warmer is the color of the LED void giveColorFeedback(int PotOne, int PotTwo, int PotThree) { if (abs(PotOne - SliderValueOne) <= 1 && abs(PotTwo - SliderValueTwo) <= 1 && abs(PotThree - SliderValueThree) <= 1 ) { // Red setColor(255, 0, 0); } else if (abs(PotOne - SliderValueOne) <= 3 && abs(PotTwo - SliderValueTwo) <= 3 && abs(PotThree - SliderValueThree) <= 3 ) { // yellow setColor(255, 255, 0); } else if (abs(PotOne - SliderValueOne) <= 4 && abs(PotTwo - SliderValueTwo) <= 4 && abs(PotThree - SliderValueThree) <= 4 ) { // aqua setColor(0, 255, 255); } else { // blue setColor(0, 0, 255); } } void blinkGreenLed() { for (int a = 0; a < 2; a++) { for (int b = 0; b <= 255; b += 5) { setColor(0, b, 0); delay(5); } for (int b = 255; b >= 0; b -= 5) { setColor(0, b, 0); delay(5); } } for (int b = 0; b <= 255; b += 5) { setColor(0, b, 0); delay(5); } } // Send RGB values to the LED pins void setColor(int red, int green, int blue){ analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); }
Menambahkan Buzzer
Kami akan menggunakan buzzer untuk memutar melodi ketika kotak dibuka. Lebih tepatnya kami akan memutar lagu tema Star Wars!
Menghubungkan buzzer sangat sederhana:
Unggah kode contoh ini dan dengarkan:
const int c = 261; const int d = 294; const int e = 329; const int f = 349; const int g = 391; const int gS = 415; const int a = 440; const int aS = 455; const int b = 466; const int cH = 523; const int cSH = 554; const int dH = 587; const int dSH = 622; const int eH = 659; const int fH = 698; const int fSH = 740; const int gH = 784; const int gSH = 830; const int aH = 880; int counter = 0; #define buzzerPin 1 void setup() { pinMode(buzzerPin, OUTPUT); Serial.begin(9600); } void loop() { play_jingle(); delay(3000); } void play_jingle() { beep(a, 500); beep(a, 500); beep(a, 500); beep(f, 350); beep(cH, 150); beep(a, 500); beep(f, 350); beep(cH, 150); beep(a, 650); delay(500); beep(eH, 500); beep(eH, 500); beep(eH, 500); beep(fH, 350); beep(cH, 150); beep(gS, 500); beep(f, 350); beep(cH, 150); beep(a, 650); delay(500); } void beep(int note, int duration) { //Play tone on buzzerPin tone(buzzerPin, note, duration); //Stop tone on buzzerPin noTone(buzzerPin); delay(50); //Increment counter counter++; }
Menambahkan Motor Servo
Motor servo adalah kunci kotak kami, kita akan membutuhkannya untuk berputar 90 derajat ketika kombinasi benar, sehingga kotak akan terbuka.
Menghubungkan servo hanya membutuhkan tiga kabel.
Untuk memutarnya 90 derajat kita akan menggunakan fungsi berikut:
#include <Servo.h> int pos = 0; // variable to store the servo position Servo myservo; // create servo object to control a servo void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object myservo.write(pos); // set the servo in position 0 } void loop() { open_the_box(); delay(2000); close_the_box(); delay(2000); } void open_the_box(){ for (pos = 0; pos <= 90; pos += 1) { // goes from 0 degrees to 90 degrees myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } } void close_the_box(){ for (pos = 90; pos >= 0; pos -= 1) { // goes from 90 degrees to 0 degrees myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } }
Perhatikan bahwa untuk memutar servo kembali dan menutup kotak yang perlu Anda lakukan adalah memutar semua potensiometer ke 0.
Bangun Kotak Teka-Teki Anda
Itu tidak akan menjadi kotak tanpa kotak, jadi unduh file kotak di bawah ini dan gunakan sebagai panduan untuk membuat kotak Anda sendiri.