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

FHT Audio Spectrum Visualizer

Komponen dan persediaan

Arduino Nano R3
× 1
WS2812B 8X32 RGB LED MATRIX
× 1
Resistor 4.75k ohm
× 3
Resistor 100k ohm
× 2
Resistor 10k ohm
× 2
Melalui Resistor Lubang, 390 ohm
× 1
1N4007 – Tegangan Tinggi, Dioda Nilai Arus Tinggi
Bahkan 1N4004 akan baik-baik saja
× 1
Kapasitor 100 nF
× 2
Kapasitor 1000 F
× 1
Sakelar Tombol Tekan SparkFun 12mm
Atau dua tombol panel jika Anda berencana memasukkan sirkuit ke dalam kotak
× 2
Papan prototipe generik 4x6 cm
× 1
Plug Perempuan RCA Stereo PCB
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)
Kabel Jack Audio 3,5 mm ke Konektor RCA Stereo

Tentang proyek ini

Pustaka FHT Arduino

FHT melakukan pekerjaan yang sama persis dengan FFT yang lebih terkenal, tetapi tidak seperti ini, FHT hanya menggunakan data nyata, sedangkan FFT bekerja pada data yang kompleks, oleh karena itu FHT menggunakan setengah daya pemrosesan dan setengah memori sistem.

Pustaka ini menggunakan larik tunggal untuk pengambilan sampel data alih-alih dua, satu untuk nilai nyata dan satu untuk nilai imajiner, digunakan oleh FFT lib, juga menyederhanakan perhitungan matematika yang kompleks menghindari loop dengan perhitungan logaritma floating point yang kompleks dan sebagai gantinya menggunakan beberapa tabel numerik .

Kelemahannya adalah selalu mengembalikan setengah dari nilai ukuran array yang digunakan untuk melakukan pengambilan sampel, ini menyebabkan hilangnya resolusi dan presisi tertentu di kedua ujung rentang audio. Namun, dalam kasus tertentu kita tidak harus mengembangkan alat ukur tetapi gadget sederhana, kita tidak perlu presisi ekstrim, kita hanya perlu menyalakan beberapa LED dalam irama musik.

Tentu saja ini bukan tempat yang tepat untuk membahas pengoperasian modalitas perpustakaan FHT, siapa pun yang ingin mempelajari lebih lanjut dapat merujuk ke situs web Open Music Lab di mana mereka akan menemukan semua dokumentasi yang diperlukan untuk memahami trik yang digunakan, penjelasan rinci tentang berbagai fungsi dan beberapa contoh umum yang sudah ditulis untuk Arduino.

Pustaka FFT cepat, sangat cepat sehingga perlu menyisipkan penundaan dalam kode untuk mengurangi kedipan. Anda akan langsung melihat hasil akhirnya, tampilan yang jauh lebih cepat dan responsif dibandingkan versi yang menggunakan library FFT yang seringkali terkesan tertinggal dengan musik. Lebih sedikit penggunaan sumber daya sistem memungkinkan kami menambahkan beberapa baris kode untuk mengelola fungsi tambahan.

Versi Baru

Proyek ini identik dengan versi sebelumnya, jadi mereka yang telah membuat yang sebelumnya hanya perlu menambahkan tombol dan resistor 10K dan memperbarui kode.

Selain implementasi perpustakaan FHT, versi ini memiliki fungsi tambahan berikut:

  • memiliki tombol tambahan untuk penyesuaian kecerahan;
  • memungkinkan menyimpan pengaturan warna dan kecerahan di EEPROM untuk memuatnya kembali saat dihidupkan lagi;
  • menampilkan tingkat pengaturan warna dan kecerahan saat tombol ditekan dan saat dihidupkan (dapat dinonaktifkan).

Kode

  • Versi Kode FHT
Versi Kode FHTArduino
/* Hak Cipta (c) 2020 Janux Izin dengan ini diberikan, gratis, kepada siapa pun yang memperoleh salinan perangkat lunak ini dan file dokumentasi terkait ("Perangkat Lunak"), untuk menangani Perangkat Lunak tanpa batasan, termasuk tanpa pembatasan hak untuk menggunakan, menyalin, memodifikasi, menggabungkan, menerbitkan, mendistribusikan, mensublisensikan, dan/atau menjual salinan Perangkat Lunak, dan untuk mengizinkan orang yang diberikan Perangkat Lunak untuk melakukannya, dengan tunduk pada ketentuan berikut:Hak cipta di atas pemberitahuan dan pemberitahuan izin ini harus disertakan dalam semua salinan atau bagian substansial dari Perangkat Lunak. PERANGKAT LUNAK INI DISEDIAKAN "SEBAGAIMANA ADANYA", TANPA JAMINAN DALAM BENTUK APA PUN, TERSURAT MAUPUN TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN DIPERDAGANGKAN, KESESUAIAN UNTUK TUJUAN TERTENTU DAN TANPA PELANGGARAN. DALAM KEADAAN APA PUN PENULIS ATAU PEMEGANG HAK CIPTA TIDAK BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN ATAU TANGGUNG JAWAB LAINNYA, BAIK DALAM TINDAKAN KONTRAK, KERUSAKAN ATAU LAINNYA, TIMBUL DARI, DARI ATAU SEHUBUNGAN DENGAN PERANGKAT LUNAK ATAU DALAM DEALING LAINNYA PERANGKAT LUNAK. Berdasarkan proyek asli untuk matriks LED MAX72xx dan lib FFT yang dibuat dari Shajeeb. Bagian pengaturan konfigurasi berdasarkan karya Ragnar Ranøyen Homb dari Norvegian Creation.*/#define LIN_OUT 1 //FHT linear output magnitude#define FHT_N 128 //set SAMPLES untuk FHT, Harus berupa pangkat 2#include  #define xres 32 //Jumlah total kolom pada tampilan, harus <=SAMPEL/2#define thn 8 //Total jumlah baris dalam tampilan#define ledPIN 6 //out pint untuk mengontrol Led#define NUM_LEDS (xres * thn) //total led dalam Matrix#include #define colorPIN 5 //pin untuk mengubah ledcolor#define brightnessPIN 10 //pin untuk mengubah brightnessbyte displaycolor =0; //warna default nilai byte kecerahan =1; //tingkat kecerahan default#include #define CONFIG_START 32 //Lokasi awal memori#define CONFIG_VERSION "VER01" //Konfigurasi versi konfigurasitypedef struct { versi char[6]; warna tampilan byte; byte brightness;} configuration_type;configuration_type CONFIGURATION ={ CONFIG_VERSION, warna tampilan, kecerahan};byte yvalue;int peaks[xres];byte state =HIGH; // pembacaan saat ini dari pinbyte input sebelumnyaState =LOW; // pembacaan sebelumnya dari input pinunsigned long lastDebounceTime =0; // terakhir kali pin output di-toggledunsigned long debounceDelay =100; // waktu debounce; meningkat jika output flickersbyte data_avgs[xres]; //Array untuk samplig// Parameter 1 =jumlah led dalam matriks// Parameter 2 =nomor pin// Parameter 3 =flag tipe piksel, tambahkan sesuai kebutuhan:// NEO_KHZ800 800 KHz bitstream (sebagian besar produk NeoPixel dengan LED WS2812 )// NEO_KHZ400 400 KHz (klasik 'v1' (bukan v2) piksel FLORA, driver WS2811)// NEO_GRB Piksel disambungkan untuk GRB bitstream (sebagian besar produk NeoPixel)// NEO_RGB Piksel disambungkan untuk bitstream RGB (piksel FLORA v1, tidak v2)Adafruit_NeoPixel pixel =Adafruit_NeoPixel(NUM_LEDS, ledPIN, NEO_GRB + NEO_KHZ800);// EQ filterbyte eq[32] ={ 60, 65, 70, 75, 80, 85, 90, 95, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 115, 125, 140, 160, 185, 200, 200, 200};bool EQ_ON =true; // setel ke false untuk menonaktifkan eq//Tentukan 5 set warna untuk led, 0 untuk warna byte kustom tunggal[][8] ={ {170, 160, 150, 140, 130, 120, 1, 1}, { 1, 5, 10, 15, 20, 25, 90, 90}, {90, 85, 80, 75, 70, 65, 1, 1}, {90, 90, 90, 30, 30, 30, 1, 1}, {170, 160, 150, 140, 130, 120, 110, 0}};//Tentukan karakter untuk tampilan settingsbyte charBitmap[] ={ 0x1C, 0x10, 0x10, 0x10, 0x10, 0x1C, 0x08, 0x18, 0x08, 0x08, 0x08, 0x1C, 0x0C, 0x12, 0x04, 0x08, 0x10, 0x1E, 0x0C, 0x12, 0x02, 0x06, 0x12, 0x0C, 0x10, 0x10, 0x10, 0x14, 0x1E, 0x1E, 0x1E, 0x1 0x02, 0x12, 0x0C, 0x1E, 0x10, 0x10, 0x1E, 0x12, 0x1E, 0x1E, 0x02, 0x04, 0x08, 0x08, 0x08, 0x0C, 0x12, 0x0C, 0x12, 0x12, 0x0C, 0x1C, 0x1C 0x12, 0x1C};pengaturan batal() { pixel.begin(); //inisialisasi Matriks Led //Mulai operasi FFT ADCSRA =0b11100101; // setel ADC ke mode lari bebas dan setel pra-scaler ke 32 (0xe5) ADMUX =0b00000000; // gunakan pin A0 dan referensi tegangan eksternal // Baca data konfigurasi dari EEPROM if (loadConfig()) { displaycolor =CONFIGURATION.displaycolor; kecerahan =KONFIGURASI.kecerahan; } //Mengatur kecerahan yang dimuat dari piksel EEPROM.setBrightness(brightness * 24 + 8); //Tampilkan konfigurasi saat ini di awal //ubah true menjadi false jika Anda tidak menginginkan showSettings(3, true);}void loop() { while (1) { // mengurangi jitter Sampling(); // FHT Library hanya menggunakan satu data array RearrangeFHT(); // atur ulang hasil FHT agar sesuai dengan no. kolom tampilan SendToDisplay(); // kirim untuk ditampilkan sesuai dengan nilai terukur colorChange(); // periksa apakah tombol ditekan untuk mengubah kecerahan warnaChange(); // periksa apakah tombol ditekan untuk mengubah penundaan kecerahan (10); // delay untuk mengurangi kedipan (FHT terlalu cepat :D) }}void Sampling() { for (int i =0; i  puncak[i]) puncak[i] =nilai; // simpan puncak jika> sebelumnya nilai puncak =puncak[i]; // pilih puncak untuk menampilkan setColumn(i, yvalue); // menggambar kolom } pixel.show(); // tampilkan kolom}// Nyalakan led kolom x sesuai dengan nilai yvoid setColumn(byte x, byte y) { int led, i; for (i =0; i  i) { switch (displaycolor) { case 4:if (colors[displaycolor][i] ==0) { // tampilkan warna kustom dengan nilai nol dalam array pixel.setPixelColor(dipimpin, 255, 255, 255); //withe } else { // warna standar yang didefinisikan dalam array warna pixel.setPixelColor(led, Wheel(colors[displaycolor][i])); } merusak; case 5://ubah warna menurut kolom pixel.setPixelColor(led, Wheel(x * 16)); merusak; case 6://ubah warna menurut baris pixel.setPixelColor(led, Wheel(i * y * 3)); merusak; case 7://ubah warna menurut... negara :D //Italia flagh //if (x <11) pixel.setPixelColor(led, 0, 255, 0); //jika (x> 10 &&x <21) pixel.setPixelColor(led, 255, 255, 255); //jika (x> 20) pixel.setPixelColor(led, 255, 0, 0); //bintang dan garis if (i  debounceDelay) { displaycolor++; if (warna tampilan> 7) warna tampilan =0; showSettings(1, benar); //set ke false jika Anda tidak menginginkan saveConfig(); lastDebounceTime =milis(); } status sebelumnya =membaca;}void brightnessChange() { int membaca =digitalRead(brightnessPIN); if (membaca ==TINGGI &&status sebelumnya ==RENDAH &&milis() - lastDebounceTime> debounceDelay) { brightness++; jika (kecerahan> 7) kecerahan =0; pixel.setBrightness(kecerahan * 24 + 8); showSettings(2, benar); //set ke false jika Anda tidak menginginkan saveConfig(); lastDebounceTime =milis(); } status sebelumnya =membaca;}// Utilitas dari sketsa demo Adafruit Neopixel // Masukkan nilai 0 hingga 255 untuk mendapatkan nilai warna.// Warna adalah transisi R - G - B - kembali ke R.unsigned long Wheel(byte WheelPos) { WheelPos =255 - WheelPos; if (WheelPos <85) { mengembalikan piksel.Warna(255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) { WheelPos -=85; mengembalikan pixel.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -=170; return pixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0);}// muat apa yang ada di EEPROM ke KONFIGURASI lokal jika itu adalah pengaturan yang valid loadConfig() { if (EEPROM.read(CONFIG_START + 0) ==CONFIG_VERSION[0] &&EEPROM.read(CONFIG_START + 1) ==CONFIG_VERSION[1] &&EEPROM.read(CONFIG_START + 2) ==CONFIG_VERSION[2] &&EEPROM.read(CONFIG_START + 3) ==CONFIG_VERSION[3 ] &&EEPROM.read(CONFIG_START + 4) ==CONFIG_VERSION[4]) { // memuat (menimpa) struct konfigurasi lokal untuk (unsigned int i =0; i =0; x--) { for (int y =5; y>=0; y--) { if ((charBitmap[val * 6 + 5 - y]>> x) &0x01) { pixel.setPixelColor(GetLedFromMatrix(4 - x + pos, y + 1), Wheel((pos> 10) * 170)); piksel.tampilkan(); } } }}//oleh Janux®, Versi terakhir pada 28/06/2020.

Skema


Proses manufaktur

  1. 32 (Linier) / 11 (Pseudo Log) band Audio Spectrum Analyzer
  2. Alarm Tanaman Peringatan Haus
  3. Jam Kata Italia
  4. Sigfox kWh Meter
  5. Pemantau Suhu Bluetooth
  6. Kunci yang Dikendalikan Gerakan
  7. IC Pendamping
  8. Adaptor MIDI USB
  9. Input Analog Terisolasi untuk Arduino
  10. Ukur waktu reaksi Anda