산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

32(Lineer) / 11(Pseudo Log) 대역 오디오 스펙트럼 분석기

구성품 및 소모품

Arduino Nano R3
× 1
저항 10k 옴
× 1
저항 100k 옴
× 2
저항 4.75k 옴
× 3
점퍼 와이어(일반)
× 1
브레드보드(일반)
× 1
USB-A 대 미니 USB 케이블
× 1
촉각 스위치, 상단 작동
× 1
남성 헤더 36 위치 1 행 길이(0.1")
× 1

필요한 도구 및 기계

납땜 인두(일반)

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

arduino 프로젝트 구축에 대한 첫 번째 시도였습니다. 오디오 프로젝트에 관한 모든 것에 관심이 있습니다. Shajeeb의 Audio Visualizer를 찾아 디스플레이의 눈금을 다르게 만들어 보았습니다. 일종의 Logarithmic이지만 Excel에서 일부 (Log / exponential) 테이블을 만들고 프로젝트 코드에서 수동으로 데이터 매핑을 구현합니다.

표시 변경 버튼 추가/수정:단일 막대(선형 눈금 표시/이중 막대 - 유사 로그).

마음에 드셨으면 하고 즐겁게 조립하세요.

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • 32_Band_LED_Spectrum_Analyzer-009.ino
  • 32_Band_LED_Spectrum_Analyzer-009.inoArduino
    내 사용자 정의 부품 코드(다시 매핑 데이터, 주석으로 표시)에서 필요에 맞게 자유롭게 수정/사용자 정의할 수 있습니다.
    // (c) 2019 Shajeeb TM// HAZI TECH/에서 Christian Suryanto가 수정한 코드 / 업데이트:Christian Suryanto// #include #include #include #include #define HARDWARE_TYPE MD_MAX72XX::FC16_HW // MD_MAX72xx 라이브러리가 올바르게 트리팅합니다#define CLK_PIN 13 // 디스플레이와 통신하기 위한 클럭 핀#define DATA_PIN 11 // 디스플레이와 통신하기 위한 데이터 핀#define CS_PIN 10 // 디스플레이와 통신하기 위한 제어 핀#define SAMPLES 64 // 전원이어야 합니다. of 2#define MAX_DEVICES 4 // 총 디스플레이 모듈 수#define xres 32 // 디스플레이의 총 열 수는 <=SAMPLES/2#define yres 8이어야 합니다. // 디스플레이의 총 행 수#define PREV 0xFF02FD // 주소는 FFA25D이지만 이것이 arduino가 HEXADECIMAL이라고 알려주기 때문에 0x가 추가됩니다.#define NEXT 0xFFC23D // 제어 중지 코드#define PWR 0xFFA25D // 제어 Powerint audio_response =35; // 10에서 80 사이의 값을 입력합니다. 숫자가 작을수록 오디오 응답이 높아집니다.double vReal[SAMPLES];//double vReal2[SAMPLES];double vImag[SAMPLES];char data_avgs[xres];int yvalue;int displaycolumn , displayvalue;int peaks[xres]; const int buttonPin =6; // 푸시버튼 핀 상태의 수 =HIGH; // 입력 pinint의 현재 판독값 previousState =LOW; // 입력 pinint displaymode에서 이전 판독값; 서명되지 않은 long lastDebounceTime =0; // 마지막으로 출력 핀이 토글된 시간dunsigned long debounceDelay =50; // 디바운스 시간; 출력이 깜박이면 증가합니다.int MY_ARRAY[]={0, 128, 192, 224, 240, 248, 252, 254, 255}; // 기본값 =표준 패턴//int MY_MODE_1[]={0, 128, 192, 224, 240, 248, 252, 254, 255}; // 표준 패턴//int MY_MODE_2[]={0, 128, 64, 32, 16, 8, 4, 2, 1}; // 피크 패턴만 //int MY_MODE_3[]={0, 128, 192, 160, 144, 136, 132, 130, 129}; // 최고점 + 최저점만 //int MY_MODE_4[]={0, 128, 192, 160, 208, 232, 244, 250, 253}; // 상단에 하나의 간격, 세 번째 조명 onwardsbool EQ_ON =true; // eqbyte를 비활성화하려면 false로 설정 eq1[32] ={40, 45, 50, 60, 65, 70, 75, 95, 110, 110, 110, 110, 110, 110, 110, 110, 130, 13 130, 130, 130, 130, 130, 130, 145, 155, 170, 180, 215, 220, 245, 255};바이트 eq2[11] ={40, 70, , 715, 40, 110 220, 220, 230, 250};MD_MAX72XX mx =MD_MAX72XX(하드웨어 유형, CS_PIN, MAX_DEVICES); // 객체를 표시합니다.arduinoFFT FFT =arduinoFFT(); // FFT 객체 void setup() { EEPROM.update(1,1); //(메모리 주소, 값), 처음으로 실행 displaymode =EEPROM.read(1); //디스플레이 모드 =1; ADCSRA =0b11100101; // ADC를 자유 실행 모드로 설정하고 프리 스칼라를 32(0xe5)로 설정 ADMUX =0b00000000; // 핀 A0과 외부 전압 레퍼런스 사용 pinMode(buttonPin, INPUT); mx.begin(); // 디스플레이 초기화 mx.control(MD_MAX72XX::INTENSITY, 0); // LED 강도 설정 delay(50); // 기준 전압 안정화를 기다림} void loop() { // ++ 샘플링 int numData; 더블 rSum; for(int i=0; i<샘플; i++) { 동안(!(ADCSRA &0x10)); // ADC가 현재 변환을 완료할 때까지 기다립니다. 즉, ADIF 비트 세트 ADCSRA =0b11110101; // ADC가 다음 작업을 수행할 수 있도록 ADIF 비트를 지웁니다(0xf5) int value =ADC - 512; // ADC에서 읽고 DC 오프셋을 뺀 값 값 =값 / 8; vReal[i]=값; // 압축 후 빈에 복사 vImag[i] =0; } // -- 샘플링 //++ FFT FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD); FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD); FFT.ComplexToMagnitude(vReal, vImag, 샘플); // -- FFT int step =(샘플)/xres; // 데이터 다시 매핑 - Christian Suryanto의 사용자 지정 /// switch (displaymode) { case 1 :{ numData =32; data_avgs[0] =(vReal[0] + vReal[0])/2; data_avgs[1] =(vReal[1] + vReal[63])/2; data_avgs[2] =(vReal[2] + vReal[62])/2; data_avgs[3] =(vReal[3] + vReal[61])/2; data_avgs[4] =(vReal[4] + vReal[60])/2; data_avgs[5] =(vReal[5] + vReal[59])/2; data_avgs[6] =(vReal[6] + vReal[58])/2; data_avgs[7] =(vReal[7] + vReal[57])/2; data_avgs[8] =(vReal[8] + vReal[56])/2; data_avgs[9] =(vReal[9] + vReal[55])/2; data_avgs[10] =(vReal[10] + vReal[54])/2; data_avgs[11] =(vReal[11] + vReal[53])/2; data_avgs[12] =(vReal[12] + vReal[52])/2; data_avgs[13] =(vReal[13] + vReal[51])/2; data_avgs[14] =(vReal[14] + vReal[50])/2; data_avgs[15] =(vReal[15] + vReal[49])/2; data_avgs[16] =(vReal[16] + vReal[48])/2; data_avgs[17] =(vReal[17] + vReal[47])/2; data_avgs[18] =(vReal[18] + vReal[46])/2; data_avgs[19] =(vReal[19] + vReal[45])/2; data_avgs[20] =(vReal[20] + vReal[44])/2; data_avgs[21] =(vReal[21] + vReal[43])/2; data_avgs[22] =(vReal[22] + vReal[42])/2; data_avgs[23] =(vReal[23] + vReal[41])/2; data_avgs[24] =(vReal[24] + vReal[40])/2; data_avgs[25] =(vReal[25] + vReal[39])/2; data_avgs[26] =(vReal[26] + vReal[38])/2; data_avgs[27] =(vReal[27] + vReal[37])/2; data_avgs[28] =(vReal[28] + vReal[36])/2; data_avgs[29] =(vReal[29] + vReal[35])/2; data_avgs[30] =(vReal[30] + vReal[34])/2; data_avgs[31] =(vReal[31] + vReal[33])/2; } 부서지다; 경우 2 :{ numData =11; data_avgs[0] =(vReal[0] + vReal[0])/2; data_avgs[1] =(vReal[0] + vReal[0] + vReal[1] + vReal[63]) / 4; data_avgs[2] =( vReal[1] + vReal[63] + vReal[2] + vReal[62] + vReal[3] + vReal[61])/6; data_avgs[3] =(vReal[2] + vReal[62] + vReal[3] + vReal[61] + vReal[4] + vReal[60])/6; data_avgs[4] =(vReal[5] + vReal[59] + vReal[6] + vReal[58] + vReal[7] + vReal[57])/6; data_avgs[5] =(vReal[8] + vReal[56] + vReal[9] + vReal[55] + vReal[10] + vReal[54] + vReal[11] + vReal[53])/8; data_avgs[6] =(vReal[12] + vReal[52] + vReal[13] + vReal[51] + vReal[14] + vReal[50] + vReal[15] + vReal[49])/8; data_avgs[7] =(vReal[16] + vReal[48] + vReal[17] + vReal[47] + vReal[18] + vReal[46])/6; data_avgs[8] =(vReal[19] + vReal[45] + vReal[20] + vReal[44] + vReal[21] + vReal[43] + vReal[22] + vReal[42])/8; data_avgs[9] =(vReal[23] + vReal[41] + vReal[24] + vReal[40] + vReal[25] + vReal[39] + vReal[26] + vReal[38] + vReal[27] + vReal[37])/10; data_avgs[10] =(vReal[28] + vReal[36] + vReal[29] + vReal[35] + vReal[30] + vReal[34] + vReal[31] + vReal[33])/8; } 부서지다; }// 데이터 다시 매핑 - Christian Suryanto의 사용자 지정 /// for(int i=0; i peaks[i]) peaks[i] =yvalue; y값 =피크[i]; 표시값=MY_ARRAY[y값]; 스위치(디스플레이 모드) { 경우 1:{ displaycolumn=31-i; mx.setColumn(디스플레이 열, 디스플레이 값); // 왼쪽에서 오른쪽으로 } break; 사례 2:{ displaycolumn=31-(3*i); mx.setColumn(디스플레이 열-1, 표시 값); // 왼쪽에서 오른쪽으로 mx.setColumn(displaycolumn, displayvalue); // 왼쪽에서 오른쪽으로 } break; } } // -- 측정값에 따라 디스플레이로 전송 displayModeChange(); // 디스플레이 모드를 변경하기 위해 버튼을 눌렀는지 확인}void displayModeChange() { int reading =digitalRead(buttonPin); if (reading ==HIGH &&previousState ==LOW &&millis() - lastDebounceTime> debounceDelay) // 누를 때만 작동합니다. { switch (displaymode) { case 1:// 모드 1에서 2로 이동 displaymode =2; mx.clear(); 지연(200); EEPROM.update(1,2); 부서지다; case 2:// 모드 2에서 3으로 이동 displaymode =1; mx.clear(); 지연(200); EEPROM.update(1,1); 부서지다; } lastDebounceTime =밀리(); } 이전 상태 =읽기;}

    회로도


    제조공정

    1. 갈증 경보 식물 알람
    2. 이탈리아어 단어 시계
    3. 4x3 키패드용 핀 3개
    4. Sigfox kWh 미터
    5. 블루투스 온도 모니터
    6. DIY 단순 자동 범위 정전 용량 측정기(10pF-10000microF)
    7. 제스처 제어 잠금
    8. 컴패니언 IC
    9. Arduino용 절연 아날로그 입력
    10. 반응 시간 측정