Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

SMART CUBE:Cara Baru Mengontrol Rumah Anda

Komponen dan persediaan

Arduino 101
× 1
LED (generik)
1 biru - 1 kuning - 1 hijau - 2 merah
× 5
Resistor 221 ohm
× 5
Breadboard (generik)
Tidak wajib
× 1
Seed Base Shield V2
× 1
Lampu Latar RGB LCD Seeed Grove
× 1
Sensor Suara Seeed Grove
× 1
Seeed Grove Buzzer
× 1
Sensor Suhu Seed Grove
× 1
Keypad
× 1
Kabel jumper (generik)
× 1
Baterai 9V (generik)
× 1
Klip Baterai 9V
× 1
Serat kepadatan menengah (MDF) 20x30 cm
MDF 3mm atau bahan lain untuk pemotongan laser
× 1

Alat dan mesin yang diperlukan

Pemotong laser (generik)
Besi solder (generik)

Aplikasi dan layanan online

Arduino IDE
Nordic Semiconductor nRF Connect SDK
Tidak wajib

Tentang proyek ini

Apa itu SMART CUBE?

Smart Cube adalah pengontrol untuk perangkat Rumah Pintar Anda.

Saat ini mengelola dengan cara yang lebih cerdas semua perangkat di rumah kita menjadi urgensi . Kami membutuhkan sesuatu yang sederhana dan intuitif menggunakan. Kubus Pintar bisa menjadi solusi:ini adalah perangkat portabel yang berisi Arduino 101 papan dan beberapa sensor yang berkomunikasi dengan peralatan dan aktuator di Smart Home Anda.

Inovasi remote kontrol ini tidak terlepas dari inovasi board Arduino 101. Ini menggunakan Bluetooth (BLE) untuk mengontrol lampu, suhu, dan tv Anda dan Anda juga dapat menyinkronkannya dengan smartphone . Namun inovasi utama adalah cara Anda berinteraksi dengan Smart Cube dengan gerakan Anda menggunakan giroskop dan akselerometer. Kubus memiliki 6 wajah dan masing-masing mengontrol fungsi tertentu . Fungsi yang ingin Anda gunakan terdeteksi berkat giroskop yang mengenali wajah bagian atas. Misalnya Anda dapat membuka lampu ruangan tempat Anda berada hanya dengan memposisikan kubus dengan “wajah terang” di posisi atas . Jika Anda ingin mematikan lampu, Anda hanya perlu mengguncang kubus.

Jika sebuah wajah UP dan tidak bergerak selama lebih dari 2 detik diaktifkan fungsi terkait. penundaan This ini dibuat agar Anda memiliki waktu untuk memutar dan berinteraksi dengan kubus untuk menemukan wajah yang Anda butuhkan tanpa mengaktifkan fungsi lain secara tidak sengaja. Saat Anda mengocok kubus selama lebih dari 2 detik, fungsi terakhir yang diaktifkan akan ditutup.

Proyek ini bertujuan untuk membantu Anda membuat pengontrol cerdas . Perangkat ini membutuhkan penerima (smart centraline dalam gambar) yang menafsirkan data dan mengelola fungsi dari rumah pintar Anda. keluaran utama kubus adalah sinyal BLE yang dapat digunakan dalam banyak cara:misalnya Anda dapat menghubungkan kubus dengan aplikasi ponsel pintar (atau buat sendiri), atau Anda dapat membangun stasiun dengan Arduino lain yang mengumpulkan data BLE dan secara langsung mengontrol peralatan rumah Anda. Karena berbagai kasus, bagian ini tergantung pada urgensi Anda. Dalam panduan ini kita akan melihat cara membuat kubus pintar dan Anda akan mempelajari cara mempersonalisasikannya.

Fungsi:

Struktur kodenya mudah dipersonalisasi (kami menganalisis kodenya nanti) sehingga Anda dapat memutuskan fungsi mana yang akan dikontrol. Ini adalah fungsi yang saya putuskan untuk dikontrol:

Lampu :Wajah ini di UP posisi buka lampu dari ruangan di mana Anda berada. Jika Anda menggoyang kubus, lampu akan mati dan led kuning di wajah ini diaktifkan sehingga Anda dapat menemukan kubus dalam kegelapan. komunikasi dengan lampu Anda dibuat oleh BLE papan 101.

SUHU :Wajah ini NAIK aktifkan (melalui BLE) AC jika panas atau pemanasan jika dingin. Alat ini mendeteksi suhu menggunakan sensor termal dan buka led biru jika kondisioner menyala (snow flake) atau merah satu jika pemanas diaktifkan (matahari).

TIMER :Wajah ini NAIK mulai timer yang dapat Anda lihat di layar LCD. Ada buzzer yang berfungsi sebagai alarm saat hitungan mundur selesai. Jika Anda mengguncang Anda menghentikan timer dan Anda dapat melihat waktu yang tersisa. Saat hitungan mundur berakhir, warna LCD berubah dari biru menjadi merah dan bel berbunyi tiga kali.

TV :Wajah ini NAIK buka televisi. Kubus menjadi pengendali jarak jauh untuk TV Anda. Ada panel tombol dengan nomor yang diaktifkan hanya jika wajah ini UP sehingga untuk menghindari sentuhan yang tidak disengaja. Nomor yang Anda tekan dikirim melalui BLE ke pengontrol pusat yang terhubung ke TV Anda. Mengguncang kubus Anda menutup TV.

SUARA :Wajah ini NAIK aktifkan led yang kecerahannya berdasarkan tingkat kebisingan ruangan. Kebisingan terdeteksi berkat sensor suara. Jika Anda mengocok kubus Anda menutup fungsi ini. (Jika mau, Anda dapat mengaktifkan fungsi pribadi dengan bertepuk tangan).

NONAKTIF wajah:Jika Anda tidak menggoyang kubus wajah ini seperti posisi netral di mana tidak ada yang berubah. Jika Anda ingin menutup semuanya posisikan kubus dengan OFF menghadap ke ATAS dan kocok. Gestur ini seperti tombol home di smartphone yang Anda tekan jika ingin keluar dengan cepat. Ada led merah sehingga Anda dapat menemukan kubus jika gelap.

Perbedaan dari konsep:

Rencana awalnya adalah menggunakan juga komunikasi IR untuk menghubungkan TV Anda langsung ke kubus. Karena Arduino 101 tidak mendukung (untuk saat ini) perpustakaan yang mengelola sinyal IR, saya memutuskan untuk mengirim informasi melalui BLE ke stasiun yang dapat mengelola perpustakaan ini (seperti Arduino UNO). Karena masalah ini saya telah menghapus fungsi radio (sangat mirip dengan wajah TV), menggantinya dengan wajah sensor suara. Wajah ini bisa digunakan untuk mengenali suara keras (seperti tepuk tangan) untuk mengaktifkan sesuatu. Perubahan terbesar ada di materi dari kubus. Awalnya saya berpikir untuk membuatnya dengan printer 3D tapi kemudian saya memutuskan untuk menggunakan pemotong laser . Dengan cara ini lebih mudah untuk mengganti wajah jika Anda ingin mengubah fungsi. Misalnya Anda dapat menghapus wajah pengatur waktu dan mengubahnya dengan wajah yang secara otomatis mengisi mangkuk kucing Anda. Menjadi modular Anda tidak perlu membangun kembali seluruh struktur!

Mari kita membangunnya:

Ikuti petunjuk ini untuk membuat kubus pintar Anda sendiri. Kita akan mulai dari perangkat keras , merakit elektronik komponen pertama dan kemudian tubuh kubus yang dipotong laser yang terbuat dari MDF. Setelah operasi ini, saya akan menjelaskan cara kerja kode dan bagaimana Anda dapat mempersonalisasinya . Setelah Anda mengunggah kode di Arduino 101 Anda, Anda dapat mengunduh aplikasi untuk melihat output BLE dari kubus atau menghubungkannya langsung dengan rumah pintar Anda!

Perangkat keras - elektronik:

Mari kita mulai dari Arduino 101 Anda. Ini adalah fritzing skema untuk mengikuti:

Pasang perisai dasar Grove di papan Anda dan mulai dengan koneksi.

Keypad :Anda harus menghubungkan kabel ke pin:10, 8, 7, 6, 5, 4, 2.

Koneksi LED :

Pertama-tama kita harus menyiapkan led:

- sambungkan kaki panjang led (anoda) ke resistor 220 ohm lalu ke kabel merah (ini kabel untuk menyambung ke pin)

- sambungkan kaki pendek (katoda) ke kabel putih (ini akan menuju ke gnd)

- solder bagian dan tutup dengan pita listrik

- sambungkan semua kabel putih ke satu kabel putih (ini akan menuju ke gnd) dan solder semuanya menjadi satu

Sekarang sambungkan kabel merah ke Arduino Anda:led HIJAU ke pin 9, KUNING ke pin 11, MERAH ke pin 12, BIRU ke pin 13 dan yang terakhir MERAH ke pin A2.

Sensor hutan :

Hubungkan sensor grove ke pelindung (lihat skema pada lampiran).

Buzzer ke D3, LCD RGB ke I2C, Sensor suhu ke A0, Sensor suara ke A1.

Oke, sekarang kita telah menghubungkan semua listrik bagian. Sekarang Anda membutuhkan kasus .

Perangkat keras - kotak

Anda dapat mengunduh sketsa kubus untuk dipotong dengan laser. Garis merah di sketsa adalah simbol wajah, cukup mengukir mereka. Garis hitam harus dipotong. Dimensi dalam kubus adalah 9 cm . Sketsanya oke jika Anda menggunakan bahan 3mm , jika Anda menggunakan ketebalan yang berbeda, Anda harus memodifikasinya (Anda dapat menggunakan situs web ini:http://www.makercase.com/).

Bahan yang saya pilih adalah MDF (Serat Kepadatan Sedang) tetapi Anda dapat menggunakan apa yang Anda inginkan.

Berikut adalah beberapa gambar dari laser cut :

Sekarang kita harus memasangnya .

Saya menempel beberapa potong karton untuk membuat ketebalan untuk led. Dengan cara ini mereka akan sejajar dengan permukaan .

Sekarang kita memasang keypad . Masukkan ke dalam lubang dan lepaskan film perekat, lalu sambungkan kembali pin.

Sekarang LCD RGB . Ini sangat cocok dengan lubangnya.

Mari kita siapkan konektor baterai :

Saya telah memotong steker transformator lama dan menghubungkannya ke klip baterai. Dengan cara ini kami menghemat ruang di dalam kotak.

Pada titik inilah yang harus Anda miliki:

Sekarang Anda hanya perlu menghubungkan baterai , upload kodenya dan tutup kubus !

TIPS:pasang papan dan baterai dengan kasing sehingga ketika Anda mengocok kubus menjadi stabil.

Kode

Anda dapat menemukan kode di lampiran . Unggah di papan Anda dengan Arduino IDE (ingat untuk memperbarui perangkat lunak Anda untuk kompatibilitas Arduino 101).

Saya telah berkomentar hampir setiap baris kode untuk membuatnya lebih dimengerti yang saya bisa. Jangan takut dengan 500+ garis, strukturnya tidak terlalu rumit.

Pada awalnya ada perpustakaan dan semua variabel deklarasi .

Pada bagian ini juga terdapat definisi dari BLE services dan karakteristik . Saya menggunakan Automation IO melayani. Saya menggunakan Digital karakteristik untuk lampu dan suhu (ini menggunakan 2 bit , jadi 4 kemungkinan kasus untuk dikodifikasi) dan Analog untuk TV (untuk mengirim semua kode keypad).

Kemudian penyiapan . Pat ini dijalankan hanya satu kali pada awalnya. Di sini kita menginisialisasi komponen sebagai input atau output dan menginisialisasi BLE dan gyro board 101.

Bagian utamanya adalah loop . Ini dibagi menjadi empat bagian:

  • 1 Bagian pertama disalin dari tutorial situs Arduino:(https://www.arduino.cc/en/Tutorial/Genuino101CurieIMUAccelerometerOrientation ) bagian ini terus dieksekusi dan mengembalikan orientasi dewan.
  • 2 Bagian kedua kita mengaktifkan wajah hanya jika berada di posisi naik selama lebih dari dua detik . Kami menggunakan milis berfungsi untuk menghitung waktu. Saat posisinya berubah, ia mengingat nilai milis dan jika orientasinya tetap sama, setelah selang waktu (2 detik), kita masuk ke zona if di mana wajah yang dipilih menjadi benar (untuk bagian ke-4).
  • 3 Bagian ketiga diaktifkan hanya jika kubus diguncang dengan intensitas tertentu dan selama lebih dari 2 detik. terakhir diaktifkan fungsi wajah tertutup dan wajahnya ditetapkan sebagai salah . Kalo mukanya salah gak bisa masuk di part 4.
  • 4 Bagian keempat hanya untuk benar wajah. Ini dia inti dari fungsi kubus pintar. Di bagian ini secara konstan dieksekusi hanya wajah yang benar dalam loop.

Anda dapat memodifikasi fungsi wajah dengan beberapa modifikasi kode. Struktur utama harus seperti yang dijelaskan. Anda dapat mengubah bagian di dalam kondisi if dari setiap wajah.

if (face2 ==true) { // TEMPERATURE face //MULAI MENGUBAH DI SINI digitalWrite (LEDOFF, LOW); // jika wajah ini benar, led wajah OFF adalah RENDAH if (central.connected() ==true) { // jika kubus terhubung BLE // baca nilai suhu int val =analogRead(pinTemp); // dapatkan nilai analog resistance=(float)(1023-val)*10000/val; // dapatkan suhu resistansi=1/(log(resistansi/10000)/B+1/298.15)-273.15; // hitung suhu //kondisi aktivasi if (suhu> terlalu Panas) { // aktifkan AC digitalWrite(LEDhot, LOW); // tutup pemanasan led digitalWrite(LEDcold, HIGH); // buka AC yang dipimpin termoChar.setValue(1); // set melalui BLE kondisi 1 =dingin hidup - panas mati } if (suhu  terlaluDingin &&temperatur  

Anda harus mengkodekan bagian "benar" (seperti pada kode sebelumnya) dan juga bagian "salah" ketika kubus diguncang:

// TEMPERATURE deactivation if (lastFUNCTION ==2) { // TEMPERATURE face //MULAI MENGUBAH DI SINI // jika sebuah pusat terhubung ke periferal:if (central.connected() ==true) { digitalWrite (LEDhot, RENDAH); // tutup suhu led merah digitalWrite(LEDcold, LOW); // tutup suhu biru led termoChar.setValue(0); // suhu sinyal BLE:0 =mati dingin - mati panas //END HERE } Serial.println("TEMPERATURE false - CLOSE"); wajah2 =salah; // TEMPERATURE wajah menjadi salah } 

Ingatlah untuk menetapkan wajah sebagai palsu saat Anda mengocoknya.

Aplikasi:

Untuk melihat keluaran kubus BLE, Anda dapat mengunduh aplikasi ini:nRF Connect

https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=it

Saat Anda membukanya, cukup cari untuk perangkat dan hubungkan dengan "smartcubesketch". Kemudian Anda akan melihat tiga tab "Automation IO", klik di atasnya dan tekan pengumpul data berkelanjutan.

Menghubungkan kubus sangatlah penting karena beberapa fungsi (lampu, suhu dan tv) dijalankan hanya jika kubus terhubung.

Cara kerjanya:VIDEO

Unggah kode, masukkan baterai, tutup kotak dan...

...sekarang Anda memiliki SMART CUBE!

Saya membuat video untuk menunjukkan kepada Anda semua fungsi kubus dan cara menggunakannya.

Kesimpulan

Proyek ini hanyalah langkah pertama ke rumah pintar. Tujuan saya adalah menggunakan Arduino 101 potensi papan untuk membuat sesuatu yang baru . Menurut saya akselerometer dan giroskop memberikan peluang baru kepada dewan dalam hal mobilitas. Dengan BLE, selain portabel, juga mudah terhubung .

Ini adalah pertama kalinya saya menyadari secara konkret salah satu proyek saya (maksud saya dengan prototipe yang berfungsi). Itu sulit dan ada beberapa kesulitan selama jalan tetapi pada akhirnya saya telah belajar banyak dan saya senang dengan hasilnya. Saya berharap semua orang yang membaca panduan ini dapat belajar sesuatu dari pekerjaan saya dan juga memodifikasi proyek ini sesuai kebutuhan mereka . Saya minta maaf untuk bahasa Inggris saya yang buruk, tetapi saya harap gambarnya dapat membantu Anda.

Di masa depan dari proyek ini saya berharap untuk membuat centraline itu seperti jembatan antara kubus pintar dan aktuator (lampu, suhu, tv ...). Centraline ini akan menerima sinyal BLE dari kubus dan menggunakan informasi ini untuk melakukan hal-hal cerdas di rumah Anda.

Saya sangat senang memiliki kesempatan untuk menggunakan Arduino 101 dan perlengkapan Grove (kit ini sangat sederhana dan cepat untuk pembuatan prototipe).

Saya harap menggunakan papan dengan cara ini bisa menjadi inspirasi untuk proyek Anda. Anda dapat mempersonalisasikannya sesuai keinginan :Saya ingin tahu fungsi apa yang akan Anda buat dan dalam konteks berbeda apa Anda akan menggunakannya!

Mungkin ini bukan sebuah revolusi tetapi ini adalah cara baru untuk berinteraksi dengan rumah Anda .

Semoga Anda menyukai tutorial ini.

Sekarang giliran Anda :letakkan tanganmu di kubus dan retas!

Kode

  • SMART CUBE - kode lengkap dengan komentar
SMART CUBE - kode lengkap dengan komentarArduino
Ini adalah kode untuk diunggah ke Arduino 101 Anda. Anda dapat menggunakan kode ini apa adanya atau menyesuaikannya berdasarkan kebutuhan Anda. Ikuti komentar untuk memahami cara kerjanya.
// Libraries#include "CurieIMU.h" // Acelerometer &Gyroscope#include  // Bluetooth Low Energy#include #include "rgb_lcd .h" // LCD#include  // Keypadrgb_lcd lcd; // Inisialisasi LCD// Inisialisasi Bluetooth:BLEPeripheral blePeripheral; // Perangkat Periferal BLE (papan yang Anda programkan)// Layanan BLEBLELayanan lampuLayanan("1815"); // BLE Automation IO (1815) - menyalakan informasiBLEService termoService("1815"); // BLE Automation IO - informasi suhuBLEService TVService("1815"); // BLE Automation IO - informasi tv// BLE karakteristikBLEUnsignedCharCharacteristic lightsChar("2A56", // Karakteristik BLE Digital (2A56) - lampu BLERead | BLENotify);BLEUnsignedCharCharacteristic termoChar("2A56", // Karakteristik BLE Digital - suhu BLERead | BLENotify );BLEUnsignedCharCharacteristic TVChar("2A58", // Karakteristik BLE Analog (2A58) - tv BLERead | BLENotify);// Deklarasi konstanta dan variabel:// Orientasi wajah dan fungsi goyang:int lastOrientation =- 1; // orientasi sebelumnya (untuk perbandingan)unsigned long beforeMillis =0; // last time updateunsigned long interval =2000; // time to wait in up position before the face activationunsigned long SHAKEpreviousMillis =0; // last time updateunsigned long SHAKEinterval =2000; // time to wait during shaking for face deactivationboolean keep =false; // this is used to count only one time the face orientation changeint lastFUNCTION =-1; // this is used to know what is the previous rientation// Faces initilization:at the beginning every face is falseboolean face0 =false;boolean face1 =false;boolean face2 =false;boolean face3 =false;boolean face4 =false;boolean face5 =false;// LIGHTS faceconst int LEDlights =11; // pin 11:yellow led// TEMPERATURE faceconst int pinTemp =A0; // pin A0:temperature sensorconst int LEDhot =12; // pin 12:red ledconst int LEDcold =13; // pin 13:blue ledfloat temperature; // temperature value memorizationint B=3975; // B value of the thermistorfloat resistance; // resistance value memorizationfloat tooHot =26.0; // temperature at which the air conditioner is activated [SET]float tooCold =23.0; // temperature at which the heater is activated [SET]// TIMER faceint BUZZER =3; // pin 3:buzzerboolean KEEPtime =false; // this is used to count only one time the face orientation change (not restart while counting)int TIMERmillis =0; // the following are for the countdown determinationint prevSHOWsecond =0;int CountdownInMillis =0;int SHOWmillis =0; // millis value calculation resultint SHOWminute =0; // minutes value to show in the monitor for the countdownint SHOWseconds =0; // seconds value to show in the monitor for the countdownconst int SETminute =2; // set 2 minute timer [SET]const int SETsecond =30; // set 30 seconds timer [SET]// SOUND faceconst int soundLED =9; // pin 9:green led const int soundSENSOR =A1; // pin A0:sound sensorint brightness =0; // green led brightness initialization// TV faceconst byte ROWS =4; // four rows keypadconst byte COLS =3; // three columns keypadchar keys[ROWS][COLS] ={ {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'}}; // keypad button valuesbyte rowPins[ROWS] ={10,8,7,6}; // pin 10,8,7,6:connect to the row pinouts of the keypadbyte colPins[COLS] ={5,4,2}; // pin 5,4,2:connect to the column pinouts of the keypadKeypad keypad =Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // keypad initialization// OFF faceconst int LEDOFF =A2; // pin A2:red ledvoid setup() { pinMode(LEDlights, OUTPUT); // every led is set as an output pinMode(LEDhot, OUTPUT); pinMode(LEDcold, OUTPUT); pinMode(soundLED,OUTPUT); pinMode(LEDOFF, OUTPUT); Serial.begin(9600); // initialize Serial communication CountdownInMillis =(SETminute*60 + SETsecond)*1000; // this calculates the corrispondent value in millis from the minutes and seconds setting lcd.begin(16, 2); // LCD initialization lcd.setRGB(0, 0, 0); // LCD RGB is OFF at the beginning // initialize device Serial.println("Initializing IMU device..."); CurieIMU.begin(); // Set the accelerometer range to 2G CurieIMU.setAccelerometerRange(2); // Enable Shock Detection CurieIMU.setDetectionThreshold(CURIE_IMU_SHOCK, 7000); // 7.0g =7000 mg (this value set the intensity of the shock) CurieIMU.setDetectionDuration(CURIE_IMU_SHOCK, 2000); // 2000ms (this value set the duration of the shock) CurieIMU.interrupts(CURIE_IMU_SHOCK); // BLE setup initialization blePeripheral.setLocalName("SmartCubeSketch"); // the name of the project blePeripheral.setAdvertisedServiceUuid(lightsService.uuid()); // add the lights service UUID blePeripheral.addAttribute(lightsService); // add the BLE lights service blePeripheral.addAttribute(lightsChar); // add the BLE lights characteristic lightsChar.setValue(3); // initial value for this characteristic =3 //BLE lights value meaning:0 =lights off, 1 =lights on, 3 =initial state, 4 =not used blePeripheral.setAdvertisedServiceUuid(termoService.uuid()); // add the temperature service UUID blePeripheral.addAttribute(termoService); // add the BLE temperature service blePeripheral.addAttribute(termoChar); // add the BLE temperature characteristic termoChar.setValue(0); // initial value is 0:cold off - hot off //BLE termo value meaning:0 =cold off - hot off, 1 =cold on - hot off, 2 =cold off - hot on, 3 =not used blePeripheral.setAdvertisedServiceUuid(TVService.uuid()); // add the tv service UUID blePeripheral.addAttribute(TVService); // add the BLE tv service blePeripheral.addAttribute(TVChar); // add the tv characteristic TVChar.setValue('x'); // initial value for this characteristic (x means nothing) //BLE TV value meaning:#number corrispond to the pressed button, C:close TV, O:open TV, x:initial state blePeripheral.begin(); Serial.println("Bluetooth device active, waiting for connections..."); } // setup endvoid loop() { BLECentral central =blePeripheral.central(); // BLE connection unsigned long currentMillis =millis(); // current value of time in milliseconds // the following code comes from www.arduino.cc/en/Tutorial/Genuino101CurieIMUccelerometerOrientation // it is used to detect the orientation of the board int orientation =- 1; // the board's orientation String orientationString; // string for printing description of orientation // read accelerometer:int x =CurieIMU.readAccelerometer(X_AXIS); int y =CurieIMU.readAccelerometer(Y_AXIS); int z =CurieIMU.readAccelerometer(Z_AXIS); // calculate the absolute values, to determine the largest int absX =abs(x); int absY =abs(y); int absZ =abs(z); if ( (absZ> absX) &&(absZ> absY)) { // base orientation on Z if (z> 0) { orientationString ="up"; orientation =0; } else { orientationString ="down"; orientation =1; } } else if ( (absY> absX) &&(absY> absZ)) { // base orientation on Y if (y> 0) { orientationString ="digital pins up"; orientation =2; } else { orientationString ="analog pins up"; orientation =3; } } else { // base orientation on X if (x <0) { orientationString ="connector up"; orientation =4; } else { orientationString ="connector down"; orientation =5; } } // end of the tutorial code. // at this point you have the orientation value of the board constantly updated:/* The orientations of the board:0:flat, processor facing up (TIMER) 1:flat, processor facing down (TV) 2:landscape, analog pins down (TEMPERATURE) 3:landscape, analog pins up (OFF) 4:portrait, USB connector up (LIGHTS) 5:portrait, USB connector down (SOUND) */ // for this project you need to know if the face has changed from the previous face function [lastFUNCTION !=orientation] // but this information is printed only if the face is in the UP position for more than [interval] time // and only for one time [keep] (you don't nedd to constantly activate the face, you just need it one time) // because the orientation value is constantly updated you need to start counting time when the orientation change [orientation !=lastOrientation] if (orientation !=lastOrientation) { // if the orientation has changed, start to count time lastOrientation =orientation; // memorize the current orientation of the face previousMillis =currentMillis; // memorize the time when the face has changed keep =false; } else if (currentMillis - previousMillis> interval &&keep ==false &&lastFUNCTION !=orientation) { //this condition print the orientation only if the face is up for an interval //and only for one time (keep) //and only if the face is different from the previous loop Serial.println(orientationString); // print the orientation // the current face [orientation] is set as true (that means that the face function is set as activated) if (orientation ==1) { // TV face face1 =true; // TV face becomes true lastFUNCTION =orientation; // memorize this activation in [lastFUNCTION] Serial.println("TV true"); // print the activated face TVChar.setValue('O'); // O:open the tv signal (BLE):tv is open only one time } if (orientation ==4) { // LIGHTS face face4 =true; lastFUNCTION =orientation; Serial.println("LIGHTS true"); } if (orientation ==3) { // OFF face face3 =true; lastFUNCTION =orientation; Serial.println("OFF true"); } if (orientation ==5) { // SOUND face face5 =true; lastFUNCTION =orientation; Serial.println("SOUND true"); } if (orientation ==2) { // TEMPERATURE face face2 =true; lastFUNCTION =orientation; Serial.println("TEMPERATURE true"); } if (orientation ==0) { // TIMER face face0 =true; lastFUNCTION =orientation; Serial.println("TIMER true"); if (KEEPtime ==false) { // timer is activated only if it is the 1st cycle or has been stopped TIMERmillis =currentMillis; // start counting time } } keep =true; // [keep] change value so that, in the next loop, you can't enter in this condition if the face don't change (avoid to activate another time the same face) } // this condition is for the shake function:if you shake for more than [SHAKEinterval] time, the face is deactivated if (CurieIMU.getInterruptStatus(CURIE_IMU_SHOCK) &¤tMillis - SHAKEpreviousMillis> SHAKEinterval) { Serial.println("SHAKE"); // print "SHAKE" if shake is detected // the last activated face [lastFUNCTION] is set as false (that means that the face function is deactivated) //TV deactivation if (lastFUNCTION ==1) { // TV face TVChar.setValue('C'); // C:close the tv BLE signal Serial.println("TV false - CLOSE"); // print the closed face face1 =false; // TV face becomes false } //LIGHTS deactivation if (lastFUNCTION ==4) { // LIGHTS face if (central.connected() ==true) { // if a central is connected to peripheral:lightsChar.setValue(0); // lights OFF BLE signal digitalWrite (LEDlights, HIGH); // open the yellow led to see the cube in the dark } Serial.println("LIGHTS false - CLOSE"); face4 =false; // LIGHTS face become false } // OFF if (lastFUNCTION ==3) { // OFF face // OFF face shaked:everything is closed and red led OFF is open digitalWrite (LEDOFF, HIGH); // red led OFF is on when cube is closed // now close all the activated functions:// CLOSE TV TVChar.setValue('C'); // C:close the tv BLE signal Serial.println("TV false - CLOSE"); face1 =false; // CLOSE LIGHTS Serial.println("LIGHTS false - CLOSE"); if (central.connected() ==true) { lightsChar.setValue(0); digitalWrite (LEDlights, LOW); // lights led is closed if OFF face is shaked } face4 =false; // CLOSE SOUND analogWrite(soundLED, LOW); // close the sound led Serial.println("SOUND false - CLOSE"); face5 =false; //CLOSE TEMPERATURE if (central.connected() ==true) { digitalWrite(LEDhot, LOW); digitalWrite(LEDcold, LOW); termoChar.setValue(0); // temperature BLE signal:0 =cold off - hot off } Serial.println("TEMPERATURE false - CLOSE"); face2 =false; // CLOSE TIMER Serial.println("TIMER false - CLOSE"); lcd.setRGB(0, 0, 0); // the LCD RGB is closed lcd.clear(); KEEPtime =false; face0 =false; // The cube is inactive, only OFF led is active Serial.println("OFF false - CLOSE"); face3 =false; // OFF face becomes false } // SOUND deactivation if (lastFUNCTION ==5) { // SOUND face analogWrite(soundLED, LOW); // close the sound led Serial.println("SOUND false - CLOSE"); face5 =false; // SOUND face becomes false } // TEMPERATURE deactivation if (lastFUNCTION ==2) { // TEMPERATURE face // if a central is connected to peripheral:if (central.connected() ==true) { digitalWrite(LEDhot, LOW); // close temperature red led digitalWrite(LEDcold, LOW); // close temperature blue led termoChar.setValue(0); // temperature BLE signal:0 =cold off - hot off } Serial.println("TEMPERATURE false - CLOSE"); face2 =false; // TEMPERATURE face became false } // TIMER deactivation if (lastFUNCTION ==0) { // TIMER face Serial.println("TIMER false - CLOSE"); face0 =false; // TIMER face became false // if you shake the cube when the time is running, the LCD became red and show the remaining time to countdown lcd.setRGB(180, 40, 0); // the RGB backlight become red lcd.clear(); // lcd is cleared lcd.setCursor(0, 0); lcd.print("STOP AT "); lcd.setCursor(8, 0); lcd.print(SHOWminute); // indicates the minutes when you shake the cube lcd.setCursor(9, 0); lcd.print(":"); lcd.setCursor(10, 0); lcd.print(SHOWseconds); // indicates the seconds when you shake the cube tone(BUZZER,1000,1000); // it make a short sound delay(2000); lcd.clear(); // clear the LCD lcd.setRGB(0, 0, 0); // LCD RGB backlight is closed KEEPtime =false; // TIMER face became false } SHAKEpreviousMillis =currentMillis; // memorize the value for the [SHAKEinterval] calculation } // the following instructions are executed in loop only if the face is activated if (face1 ==true) { // TV face digitalWrite (LEDOFF, LOW); // if this face is true the OFF face led is LOW if (central.connected() ==true) { // if the cube is BLE connected char key =keypad.getKey(); // read the value from the keypad if (key &&orientation ==1){ // if something is pressed and only when the tv face is up (avoid involuntary keypad pression) if (key =='0') { // if the pressed key is 0 TVChar.setValue(key); // send the [key] value via BLE Serial.println(key); // print the pressed button (comment if you don't want to show this information) } if (key =='1'){ TVChar.setValue(key); Serial.println(key); } if (key =='2'){ TVChar.setValue(key); Serial.println(key); } if (key =='3'){ TVChar.setValue(key); Serial.println(key); } if (key =='4'){ TVChar.setValue(key); Serial.println(key); } if (key =='5'){ TVChar.setValue(key); Serial.println(key); } if (key =='6'){ TVChar.setValue(key); Serial.println(key); } if (key =='7'){ TVChar.setValue(key); Serial.println(key); } if (key =='8'){ TVChar.setValue(key); Serial.println(key); } if (key =='9'){ TVChar.setValue(key); Serial.println(key); } if (key =='*'){ TVChar.setValue(key); Serial.println(key); } if (key =='#'){ TVChar.setValue(key); Serial.println(key); } } } } if (face4 ==true) { // LIGHTS face digitalWrite (LEDOFF, LOW); // if this face is true the OFF face led is LOW if (central.connected() ==true) { // if a central is connected to peripheral:lightsChar.setValue(1); // LIGHTS activated BLE signal digitalWrite (LEDlights, LOW); // yellow led is closed because the home lights are on } } if (face3 ==true) { // OFF face // when OFF face is up nothing is done digitalWrite (LEDOFF, LOW); // led OFF is activated only when the cube is shaked, so now is LOW } if (face5 ==true) { // SOUND face digitalWrite (LEDOFF, LOW); // if this face is true the OFF face led is LOW // sound sensor is activated, led brightness regulated by the sond // this code comes from brightness regulation example long sum =0; for (int i=0; i<32; i++) { sum +=analogRead(soundSENSOR); } sum>>=5; brightness =(sum*255)/1024; // calculate the brightness value analogWrite(soundLED,brightness); // green led brightness intensity is regulated by the noise delay(50); //end brightness example } if (face2 ==true) { // TEMPERATURE face digitalWrite (LEDOFF, LOW); // if this face is true the OFF face led is LOW if (central.connected() ==true) { // if the cube is BLE connected // read temperature value int val =analogRead(pinTemp); // get analog value resistance=(float)(1023-val)*10000/val; // get resistance temperature=1/(log(resistance/10000)/B+1/298.15)-273.15; // calculate temperature //conditions of activation if (temperature> tooHot) { // activate air conditioning digitalWrite(LEDhot, LOW); // close heating led digitalWrite(LEDcold, HIGH); // open air conditioner led termoChar.setValue(1); // set via BLE the condition 1 =cold on - hot off } if (temperature  tooCold &&temperature   

Suku cadang dan penutup khusus

This is the file (.dxf) that you can upload on your laser cutter. I used a medium density fiberboard (MDF) of 3mm. Cut the black lines and engrave red lines. Important:if your material thickness is different you have to modify this sketch. smart_cube_8sVCflFmhM.dxfThe same file of the box but in a different format:.pdf

Skema

This is a .jpeg of the Fritzing scheme (yellow wires are connected to Grove components) This is a scheme of the connections in the Grove Shield _cI0IwUsPVZ.Base%20shield%20connections

Proses manufaktur

  1. Mengapa Panel Surya Merupakan Investasi Cerdas untuk Rumah Anda
  2. Jadilah Besar atau Pulang dengan Desain Produk Baru Anda
  3. Aplikasi Otomasi Rumah
  4. Membangun Jaringan Sensor Nirkabel di Rumah Anda
  5. Pantau suhu rumah Anda menggunakan Raspberry Pi
  6. Kesenjangan keterampilan rumah pintar
  7. Jadilah cerdas:Masa depan rumah Anda
  8. Keamanan pintar:Cara melindungi perangkat rumah pintar Anda dari peretas
  9. Cara Meningkatkan Keamanan Rumah Pintar Anda
  10. Smart Plant IoT