오늘은 소리감지 LED 키트인
Hear & Light 키트에 대해서 알아보는 마지막 시간입니다.
소리감지 LED 키트 매뉴얼을 1&2편 보지 않으신 분들은
아래 링크를 통해 순서대로 따라해주시기 바랍니다.
▼ ▼ ▼
[소리감지 LED] 매뉴얼 2편
https://intopionshop.tistory.com/507?category=1021753
[소리감지 LED] 매뉴얼 1편
https://intopionshop.tistory.com/506?category=1052256
Chapter 3. LED
이제 챕터 1 과 2 에서 한 것들을 종합하여
소리의 크기를 LED 로 표시해 보겠습니다.
MAX9814 + 네오 픽셀 LED
MAX9814 + 네오 픽셀 LED
MAX9814 + 네오 픽셀 LED
#include <Adafruit_NeoPixel.h>#define PIN 6 // DI 핀번호#define N_LEDS 16 // 네오픽셀 LED 갯수Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);//NEO_GRB <= 네오픽셀 타입 , NEO_KHZ800 <= 클럭 주파수const int sampleWindow = 50; // 샘플링 시간(50 mS = 20Hz)unsigned int sample;int displayPeak = 0;int C = 0;void setup(){Serial.begin(9600);strip.begin(); // 네오픽셀 시작strip.setBrightness(50); // 네오픽셀 밝기}void loop(){strip.setPixelColor(0 , 0);int R = 0;int G = 0;int B = 0;int C = 0;data();R = 255;G = 0;for (int B = 0; B < 156 ; B+=50) {chase(strip.Color(R, G, 0));R -= 50;G += 50;}data();R = 105;G = 150;for (int B = 150; B < 256 ; B+=50) {chase(strip.Color(R, G, 0));R -= 50;G += 50;}data();G = 255;B = 0;for (int R = 0; R < 156 ; R+=50) {chase(strip.Color(0, G, B));G -= 50;B += 50;}data();G = 105;B = 150;for (int R = 150; R < 256 ; R+=50) {chase(strip.Color(0, G, B));G -= 50;B += 50;}data();B = 255;R = 0;for (int G = 0; G < 156 ; G+=50) {chase(strip.Color(R, 0, B));B -= 50;R += 50;}data();B = 1055;R = 150;for (int G = 150; G < 256 ; G+=50) {chase(strip.Color(R, 0, B));B -= 50;R += 50;}}static void chase(uint32_t c) {for (uint16_t i = 0; i < displayPeak; i++) {strip.setPixelColor(i , c); // i 번째 픽셀에 LED 색상 지정strip.show();delay(7);}for (uint16_t j = N_LEDS ; j > displayPeak ; j--) {strip.setPixelColor(j, 0);strip.setPixelColor(j-1, 0);strip.show();delay(7);}}void data(){unsigned long startMillis= millis(); // 샘플링 시작unsigned int peakToPeak = 0; // 음성신호의 진폭unsigned int signalMax = 0; // 최대크기 초기값 0unsigned int signalMin = 1024; // 최소크기 초기값 1024while (millis() - startMillis < sampleWindow){ // 50ms 마다 데이터 수집sample = analogRead(0); // 마이크 증폭 모듈로부터 받아오는 아날로그 값 저장if (sample < 1024){ // 값이 1024 보다 작을때if (sample > signalMax){ // 0보다 크면signalMax = sample; // signalMax에 저장}else if (sample < signalMin){ // 1024보다 작으면signalMin = sample; // signalMin에 저장}}}peakToPeak = signalMax - signalMin; // 최대- 최소 = 진폭값double volts = (peakToPeak * 5.0) / 1024; // // 전압 단위로 변환 = 소리 크기로 변환displayPeak = map(peakToPeak, 150, 500, 0, N_LEDS); // 범위는 테스트를 통해 최소 최대값으로 설정if(peakToPeak<150){ // peakToPeak 값이 150보다 작을경우 LED를 출력하지 않음displayPeak = 0;}else if(peakToPeak>500) { //peakToPeak 값이 500보다 클경우 LED를 최대로 출력함displayPeak = N_LEDS+1;}}
chase() 함수
static void chase(uint32_t c) {for (uint16_t i = 0; i < displayPeak; i++) {strip.setPixelColor(i , c); // i 번째 픽셀에 LED 색상 지정strip.show();delay(7);}for (uint16_t j = N_LEDS ; j > displayPeak ; j--) {strip.setPixelColor(j, 0);strip.setPixelColor(j-1, 0);strip.show();delay(7);}}
첫번째 for 문은 LED 를 displayPeak 아래까지 출력합니다.
두번째 for 문은 맨 위에서부터 displayPeak 까지 지원하게 됩니다.
이 함수가 LED 를 오르락내리락 하게 해주는데 그 속도는
각 for 문의 delay(); 를 조절하면 됩니다.
만약 LED의 반응을 빠르게 하고 싶다면 본문의 data, chase 함수에 설정된
LED 값을 단색으로 변경해주세요.
data() 함수
기존 MAX9814 소스 코드의 샘플링 코드를 가지고 LED 출력 개수를 정합니다.
12345678910 displayPeak = map(peakToPeak, 150, 500, 0, N_LEDS);if(peakToPeak<150){displayPeak = 0;}else if(peakToPeak>500){displayPeak = N_LEDS+2;}
먼저 측정한 peakToPeak 값을 기준으로 displayPeak(LED 출력 개수)를 정하게 됩니다.
peakToPeak 의 150 부터 500 까지 값들을 LED 개수에 따라 매핑하도록 되어있습니다.
저는 주변 소음이 150 미만으로 발생해 150보다 작을 경우 LED 를 0 개로 정했고,
노래를 틀었을 때 최대가 500에 가까워 500을 넘을 경우 최대치로 출력하게 했습니다.
소리감지 LED 영상
전자부품 전문 쇼핑몰 인투피온입니다.
필요한 자재에 관한 문의는 홈페이지를 통한 견적 신청, 혹은 전화나 메일로 주시면 빠른 회신을 드릴 수 있도록 하겠습니다.
▶ 홈페이지: http://intopion.com/
▶ 전화: 02-2615-7278
▶ FAX : 02-6124-4242
▶ 메일: intopion@hanmail.net
'인투피온 강좌 > 아두이노 팁(Tip)' 카테고리의 다른 글
아두이노 매뉴얼 [화분 물공급 키트] - 2 (0) | 2022.08.01 |
---|---|
아두이노 매뉴얼 [화분 물공급 키트] - 1 (0) | 2022.07.29 |
아두이노 매뉴얼 [소리감지 LED 키트] - 2 (0) | 2022.07.26 |
아두이노 매뉴얼 [소리감지 LED 키트] - 1 (0) | 2022.07.25 |
아두이노 MAX6675 열전대 온도센서 모듈 (0) | 2022.01.24 |