Daftar Isi:

Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 Langkah (dengan Gambar)
Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 Langkah (dengan Gambar)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 Langkah (dengan Gambar)

Video: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 Langkah (dengan Gambar)
Video: Arduino & Neopixel Coke Bottle Party Light 2024, Desember
Anonim
Image
Image

Jadi anak saya Doon melihat lampu pesta yang sangat keren yang terbuat dari botol coke tua dan jeroan Glow Sticks yang lengket, dan bertanya apakah kami bisa membuatnya untuk Ujian Sekolahnya yang akan datang Sudah Berakhir Blowout PartAYYY!!! Saya katakan pasti, tapi tidakkah Anda lebih suka memiliki beberapa Cincin Neopixel Adafruit keren yang telah kita baca … Dia memberi saya tatapan kosong. Karena faktanya adalah dia tidak tahu apa yang saya bicarakan, tetapi Ayah telah melihat kesempatan untuk bermain dengan cincin Neopixel yang telah dia baca, dan kita semua tahu salah satu dari 10 alasan utama ayah geek beranak adalah untuk memiliki alasan untuk bermain dengan gadget keren yang mereka katakan kepada semua orang untuk anak-anak mereka.

Ini adalah proyek super sederhana yang terlihat sangat bagus. Kami membuat 3 botol coke tua, piring kayu, dan braket tiang taman bermain -- barang-barang tergeletak di ruang bawah tanah -- dikombinasikan dengan Arduino (Leonardo dalam kasus kami, tetapi papan Genuino apa pun bisa!) dan tiga cincin Neopixel. Saya memesan cincin 9-LED, tetapi berakhir dengan cincin 12-LED dengan harga yang sama. Yang manis, tetapi berarti perbaikan di lubang sumur - cincin 12-LED memiliki lebar 35mm, berbeda dengan 23mm. Yang Anda perlukan:

  • Papan Genuino/Arduino (Kami menggunakan Leonardo, tetapi hampir semua papan bisa digunakan)
  • 3 cincin Neopixel (masing-masing 12 LED): dapatkan dari Adafruit, dan dukung orang-orang baik itu
  • 1000 f 6.3v atau kapasitor yang lebih baik
  • resistor 300-500 ohm
  • Piring kayu, atau kotak kayu bekas, atau apa pun yang dapat Anda atur neopikselnya dan letakkan botol coke di atasnya
  • Beberapa bentuk dudukan untuk pelat -- braket tiang taman bermain sangat cocok untuk kami
  • kutil dinding 9v
  • Penggerek lubang 40mm
  • Baut, Mur, Washer, Spacer
  • Kawat inti padat
  • Besi solder dan solder
  • Papan tempat memotong roti
  • Kasing plastik untuk Arduino. Anda dapat keluar dan membeli kotak plastik yang sangat bagus dan pas yang terbuat dari minyak bumi berusia jutaan tahun yang dibor dari tanah di beberapa lingkungan yang rapuh dan diproduksi di sisi lain planet ini dan dikirim dalam wadah ke gudang di dekat Anda dengan semua port dipotong dalam keselarasan sempurna dan mengirimkannya ke pintu Anda dengan van yang memuntahkan karbon dioksida ke atmosfer. Atau Anda dapat melakukan apa yang saya lakukan dan menggunakan kotak plastik bekas.. dalam hal ini kotak bantuan pita Madagaskar tergeletak di lemari obat… dan bor beberapa lubang di dalamnya. Di sini berakhir kuliah. Ayo buat…

Langkah 1: Buat Basisnya

Membuat Basis
Membuat Basis
Membuat Basis
Membuat Basis

Anda dapat mengimprovisasi pangkalan Anda dari sampah apa pun yang Anda miliki di ruang bawah tanah Anda sendiri, atau bahkan hanya menggunakan kotak kayu atau apa pun yang akan menyembunyikan barang elektronik Anda.

Pertama kami mengebor tiga lubang, dengan jarak yang sama pada pelat kayu, cukup besar untuk cincin Neopixel. Dalam gambar, lubang dibor dengan bor sekop. Pada akhirnya, karena ukuran cincin 12-LED yang lebih besar, kami harus mengebor lubang dengan mata bor. Ini berarti melewati seluruh pelat, dan alih-alih memasang cincin dengan baik ke dalam sumur kecil sedalam 2 mm yang dibuat dengan baik dengan lubang tengah untuk rangkaian kawat yang rapi, saya akhirnya mengamankan cincin dengan… ahem… Lakban di bagian bawah dari piring. Jangan menghakimi. Anda tidak dapat melihat bagian bawah pelat dalam desain saya. Dan gelap saat menyala. Dan selain itu -- apa yang salah dengan lakban?

Saya membutuhkan jarak antara pelat dan braket untuk papan tempat memotong roti di bagian bawah pelat dan satu komponen -- kapasitor, dan untuk kabel yang harus berpindah dari papan tempat memotong roti ke Arduino, yang saya rencanakan untuk dimasukkan ke dalam braket. Jadi saya meletakkan satu set spacer darurat pada poros baut untuk memberikan jarak yang cukup -- sekitar 3cm, tinggi papan tempat memotong roti dan sedikit sehingga Anda tidak menghancurkan kabelnya. Saya menggunakan dua baut jangkar kayu di setiap sudut karena tingginya yang tepat dan tergeletak di sekitar laci… kotak berisi sekrup lepas, baut, paku, rantai berkarat, sambungan selang, koin tua, benda tajam yang tak terduga, dan segala macam bit dan bobs yang ajaib dapat menghemat perjalanan Anda ke toko perangkat keras dengan menawarkan, jika bukan hal yang tepat yang Anda butuhkan, sesuatu yang akan baik-baik saja.

Kecelakaan bahagia tentang pos taman bermain yang saya temukan di ruang bawah tanah sudah memiliki lubang yang menembus pelat. Tidak perlu mengebor besi! Basisnya memiliki empat lubang baut, dan kami mengebor empat lubang counter-sunk di pelat kayu agar sesuai.

Kami kemudian mengecat semuanya dengan cat Gotik Hitam.

Langkah 2: Mempersiapkan Cincin Neopixel

Mempersiapkan Cincin Neopiksel
Mempersiapkan Cincin Neopiksel

Anda harus menyolder kabel ke cincin neopiksel Anda: kabel Data-In untuk semuanya, kabel Data-Out untuk dua, dan daya dan ground untuk masing-masing. Berapa pun panjang yang Anda butuhkan, tambahkan beberapa. Anda selalu dapat memotong kelebihan kawat, Anda tidak dapat meregangkan yang terlalu pendek. Dan perhatikan peringatan dari Adafruit:

Saat menyolder kabel ke cincin ini, Anda harus ekstra waspada terhadap gumpalan solder dan korsleting. Jarak antar komponen sangat ketat! Seringkali paling mudah untuk memasukkan kawat dari depan dan menyolder di belakang.

Saya berharap saya membacanya sebelum saya menyolder ke depan. Saya berhasil tidak membakar LED saya, tetapi saya membakar ujungnya dengan cara yang membuat saya berkeringat sampai saya menyalakannya. Juga, jika saya membaca manual yang bagus, saya juga akan membaca peringatan untuk tidak memasang klip buaya pada LED. Biarkan bangkai kapal saya yang dekat menjadi mercusuar Anda.

Cincin neopixel daisy-chain, yang berarti Anda dapat mengontrol semua LED mereka secara bersamaan dari Arduino dengan menghubungkan kabel dari OUT satu cincin ke IN lainnya. Setiap cincin membutuhkan kabel daya dan ground juga.

Langkah 3: Pengkabelan

Pengkabelan
Pengkabelan

Hubungkan seperti pada Fritzing di atas -- pin 6 dari Arduino membawa data ke ring pertama, Data-keluar dari ring itu menuju Data-in berikutnya, Data-keluar dari ring itu menuju ring Data-in dari dering terakhir. Anda tidak memerlukan kabel data-out dari cincin terakhir.

Kapasitas 1000 f berada di antara rel positif dan negatif dari papan tempat memotong roti. Tutup ini melindungi cincin dari lonjakan daya dan direkomendasikan oleh bagian praktik terbaik Adafruit NeoPixel Uberguide. Resistor pada Data ke neopiksel pertama juga direkomendasikan oleh Adafruit -- 1K di Fritzing tetapi resistansi yang disarankan adalah 300-500 ohm.

Dalam build saya, saya menjalankan kabel dari Neopiksel di bagian belakang pelat ke papan tempat memotong roti yang dipasang di tengah. Dengan begitu Anda hanya perlu menjalankan tiga kabel panjang ke unit dasar: daya, arde, dan data. Saya membuat kabel ini sangat panjang -- ada banyak ruang penyimpanan di dasarnya, dan memudahkan untuk menarik papan keluar untuk memprogram ulang.

Langkah 4: Kode

"loading="malas" menyebutkan bahwa anak saya menginginkan versi musik-reaktif ini. Butuh waktu hingga ulang tahunnya yang ke-18 untuk melakukannya, tapi ini dia!

Perlengkapan tambahan:

1 Kutub tunggal, Sakelar Lempar Ganda1 Mikrofon Kontrol Penguatan Otomatis (Saya menggunakan MAX9184 AdaFruit) 1 kapasitor 1uF-100uF (Nilai apa pun)

Mikrofon benar-benar harus memiliki Kontrol Penguatan Otomatis agar ini berfungsi dengan baik. AGC akan terus-menerus mengambil sampel kebisingan sekitar dan menaikkan dan menurunkan ambang batas yang dianggapnya sebagai latar belakang, sehingga cahaya Anda akan merespons lonjakan terhadap latar belakang itu. Mikrofon AdaFruit sangat brilian: Anda dapat beralih dari ruang sunyi di mana suara satu suara akan memicunya ke mode pesta penuh dengan ruangan yang penuh dengan remaja dan musik menggelegar, dan itu akan mengambil ketukan musik hanya bagus. Alternatifnya, Mikrofon Penguatan yang Dapat Disesuaikan, memiliki potensiometer kecil di papan yang sangat halus dan fiddly. Tidak perlu banyak perubahan dalam suara sekitar untuk membuat unit tidak berguna: menyala terus-menerus atau gelap terus-menerus. AGC bekerja seperti sulap.

Saya ingin opsi untuk menggunakan pola uji pusaran atau musik, jadi saya menyambungkan kabel tengah sakelar ke VIN dan satu kabel ke pin 4 yang lain ke pin 8 Leonardo. Dengan menguji pin tersebut untuk TINGGI atau RENDAH, kita dapat mengetahui status sakelar, dan kode cabang yang sesuai.

Langkah 7: Menghubungkan Mikrofon

Menghubungkan Mikrofon
Menghubungkan Mikrofon

Umpankan input Mic, melalui kapasitor 1-100µF itu, ke Pin Analog 0. Jika kapasitor Anda terpolarisasi, pin keluar menuju ke sisi positif (Kabel hijau).

Terima kasih kepada CodeGirlJP untuk rutinitas Trinket-Color-by-Sound-nya, yang saya adaptasikan di bawah ini:

// Suara LED yang diaktifkan dengan Arduino dan NeoPixels

#termasuk

#define MIC_PIN A0 // Mikrofon terpasang ke pin a0 pada Leonardo

#define LED_PIN 6 // Untaian LED NeoPixel terpasang pada pin 6 pada Leonardo #define N_PIXELS 36 // jumlah piksel pada untaian LED !!!!!! Sesuaikan dengan jumlah piksel dalam pengaturan Anda. Ini benar untuk 3 cincin Neopixel !!!!!! #define N 100 // Jumlah sampel yang diambil setiap kali dibacaSampel disebut #define fadeDelay 5 // waktu tunda untuk setiap jumlah fade #define noiseLevel 30 // tingkat kemiringan rata-rata noise mic tanpa suara

//Inisialisasi strip NeoPixel dengan nilai yang ditentukan di atas:

Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

int sampel[N]; // penyimpanan untuk kumpulan koleksi sampel

int faktor periode = 0; // melacak jumlah ms untuk perhitungan periode int t1 = -1; // kali kemiringan > 100 terdeteksi. int T; // periode antara waktu yang diskalakan ke kemiringan int milidetik; // kemiringan dua titik sampel data yang dikumpulkan byte periodChanged = 0; const int SwitchPinMusic = 4; // Pin untuk posisi sakelar sensitivitas musik const int SwitchPinSwirl = 8; // Pin untuk posisi switch Test Pattern (swirl) int MusicbuttonState = 0; // Variabel logika aktif untuk sensitivitas musik

// Metode pengaturan Arduino

batalkan pengaturan() {

strip.mulai();

ledsOff(); penundaan (500); tampilanWarna(Roda(100)); strip.tampilkan(); penundaan (500); anehWheel(Roda(100)); strip.tampilkan(); penundaan (500); pinMode(SwitchPinMusic, INPUT); pinMode(SwitchPinSwirl, INPUT); //attachInterrupt(4, Beralih, JATUH);

}

// Metode loop Arduino

void loop() { SwirlbuttonState = digitalRead(SwitchPinSwirl); //HIGH jika sakelar disetel ke Sensitivitas Musik MusicbuttonState = digitalRead(SwitchPinMusic); //TINGGI jika sakelar disetel ke Pola uji while (SwirlbuttonState == LOW) { readSamples(); //Jalankan rutinitas pengambilan sampel musik SwirlbuttonState = digitalRead(SwitchPinSwirl); //Periksa apakah sakelar telah diubah } SwirlbuttonState = digitalRead(SwitchPinSwirl); MusicbuttonState = digitalRead(SwitchPinMusic); while (SwirlbuttonState == HIGH) { Dance(); //Jalankan rutin pola uji berputar SwirlbuttonState = digitalRead(SwitchPinSwirl); //Periksa apakah sakelar telah diubah

}

}

batal Tari() {

while (SwirlbuttonState == HIGH) { colorWipe(strip. Color(255, 0, 0), 50); // Status Tombol Putar Merah = digitalRead(SwitchPinSwirl); colorWipe(strip. Color(0, 255, 0), 50); // Status Tombol Putar Hijau = digitalRead(SwitchPinSwirl); colorWipe(strip. Color(0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead(SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // RGBW Putih // Kirim pengejaran piksel teater di… SwirlbuttonState = digitalRead(SwitchPinSwirl); theaterChase(strip. Color(127, 127, 127), 50); // Status Tombol Putar Putih = digitalRead(SwitchPinSwirl); theaterChase(strip. Color(127, 0, 0), 50); // Status Tombol Putar Merah = digitalRead(SwitchPinSwirl); theaterChase(strip. Color(0, 0, 127), 50); // Blue SwirlbuttonState = digitalRead(SwitchPinSwirl); pelangi (20); SwirlbuttonState = digitalRead(SwitchPinSwirl); siklus pelangi(20); SwirlbuttonState = digitalRead(SwitchPinSwirl); teaterChaseRainbow(50); SwirlbuttonState = digitalRead(SwitchPinSwirl); } } // Membaca dan Memproses Data Sampel dari Mikrofon void readSamples() { for(int i=0; i0) { kemiringan = sampel - sampel[i-1]; } else { kemiringan = sampel - sampel[N-1]; } // Periksa apakah Slope lebih besar dari noiseLevel - suara yang tidak terdeteksi pada tingkat kebisingan if(abs(slope) > noiseLevel) { if(slope < 0) { countPeriod(i); if(periodChanged == 1) { displayColor(getColor(T)); } } } else { ledsOff(); // theaterChaseRainbow(50); } faktor periode += 1; penundaan (1); } }

batal menghitungPeriod(int i)

{ if(t1 == -1) { // t1 belum disetel t1 = i; } else { // t1 diset jadi hitung periode int periode = periodFactor*(i - t1); periodChanged = T==period ? 0: 1; T = periode; //Serial.println(T); // reset t1 ke nilai i baru t1 = i; faktor periode = 0; } }

uint32_t getColor(titik int)

{ if(period == -1) mengembalikan Roda(0); lain jika (periode > 400) mengembalikan Roda (5); lain kembalikan Roda(peta(-1*periode, -400, -1, 50, 255); }

batalkan fadeOut()

{ untuk(int i=0; i<5; i++) { strip.setBrightness(110 - i*20); strip.tampilkan(); // Perbarui penundaan strip(fadeDelay); periodFactor +=fadeDelay; } }

batalkan fadeIn()

{ strip.setBrightness(100); strip.tampilkan(); // Perbarui strip // warna pudar di for(int i=0; i<5; i++) { //strip.setBrightness(20*i + 30); //strip.tampilkan(); // Perbarui penundaan strip(fadeDelay); periodFactor+=fadeDelay; } }

batalkan ledsOff()

{ fadeOut(); untuk(int i=0; i

void displayColor (warna uint32_t)

{ untuk(int i=0; i

batalkan oddWheel (warna uint32_t)

{ for (int j=0; j < 256; j++) { // putar semua 256 warna dalam roda for (int q=0; q < 3; q++) { for (uint16_t i=24; i < 36; i =i+3) { strip.setPixelColor(i+q, Roda((i+j) % 255); //mengaktifkan setiap piksel ketiga } strip.show();

penundaan (1);

for (uint16_t i=24; i < 36; i=i+3) { strip.setPixelColor(i+q, 0); //matikan setiap piksel ketiga } } } fadeIn(); }

// Isi titik-titik satu demi satu dengan warna

void colorWipe(uint32_t c, uint8_t tunggu) { for(uint16_t i=0; i

void pelangi(uint8_t tunggu) {

uint16_t i, j;

untuk(j=0; j<256; j++) { untuk(i=0; i

// Sedikit berbeda, ini membuat pelangi merata di seluruh

void rainbowCycle(uint8_t tunggu) { uint16_t i, j;

for(j=0; j<256*5; j++) { // 5 siklus semua warna pada roda for(i=0; i< strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255); } strip.tampilkan(); tunda (tunggu); } }

//Lampu merangkak bergaya teater.

void theaterChase(uint32_t c, uint8_t wait) { for (int j=0; j<10; j++) { //lakukan 10 siklus pengejaran untuk (int q=0; q < 3; q++) { for (uint16_t i= 0; i < strip.numPixel(); i=i+3) { strip.setPixelColor(i+q, c); //mengaktifkan setiap piksel ketiga } strip.show();

tunda (tunggu);

for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); //matikan setiap piksel ketiga } } } }

//Lampu merangkak bergaya teater dengan efek pelangi

void theaterChaseRainbow(uint8_t wait) { for (int j=0; j < 256; j++) { // putar semua 256 warna dalam roda for (int q=0; q < 3; q++) { for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, Roda((i+j) % 255); //mengaktifkan setiap piksel ketiga } strip.show();

tunda (tunggu);

for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); //matikan setiap piksel ketiga } } } }

// Masukkan nilai 0 hingga 255 untuk mendapatkan nilai warna.

// Warna adalah transisi r - g - b - kembali ke r. uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(WheelPos < 85) { kembali strip. Warna(255 - WheelPos * 3, 0, WheelPos * 3); } if(WheelPos < 170) { WheelPos -= 85; kembali strip. Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; kembali strip. Warna(WheelPos * 3, 255 - WheelPos * 3, 0); }

batal Beralih(){

strip.tampilkan(); bacaContoh(); }

Sebelum saya dibantai di komentar (ingat kebijakan Be Nice!!) Saya menyadari setelah saya mengunggah ini betapa cerobohnya beberapa kode saya. Tidak perlu terus-menerus menguji Pin 4 dan Pin 8 untuk TINGGI. Karena sakelarnya adalah lemparan ganda kutub tunggal, nilai satu dapat disimpulkan dari yang lain: Anda hanya perlu menguji satu. Jadi, Anda dapat menelusuri dan menghapus setiap referensi untuk membaca dan menulis MusicButtonState dan menjalankan semuanya secara lebih efisien dengan menguji SwirlButtonState, jika Anda kekurangan memori atau memperpanjang dengan rutinitas lain. Tetapi kode di atas berfungsi.

Dan jika ada yang ingin mengubah rutinitas audio tersebut untuk merasakan tidak hanya tingkat kebisingan tetapi juga frekuensi, dan menulis beberapa kode halus untuk menggeser ke atas dan ke bawah spektrum cahaya sebagai respons terhadap pergerakan di sepanjang spektrum audio, berikan tautan di komentar ke bagaimana Anda melakukannya.

Menikmati!

Direkomendasikan: