Даже заготовка есть Код (C++): // Dump_A0 #define prog_int8_t int8_t #include "fix_fft.h" #define ASIZE 128 void setup() { // put your setup code here, to run once: pinMode(A0, INPUT); Serial.begin(250000); while(!Serial){ } Serial.println(F("Starting...")); } void loop() { // put your main code here, to run repeatedly: char data[ASIZE + 1]; { char im[ASIZE + 1]; unsigned long us1(0); for ( size_t i = 0 ; i < ASIZE + 1 ; ++i ) { unsigned long us2 = micros(); data[i] = ( analogRead(A0) - 511 ) / 1; im[i] = 0; // im[i] = ( us2 - us1 ) - 120; // Фаза сэмпла время от времени сдвигается. Но не ясно как её учитывать. us1 = us2; } Serial.println((int)data[0]); fix_fft(data + 1, im + 1, 7, 0); for ( size_t i = 1 ; i < ASIZE / 2 ; ++i ) { data[i] = sqrt(data[i] * data[i] + im[i] * im[i]) / 1; // Расчет амплитуды и масштабирование. } for ( size_t j = 0 ; j < 8 ; ++j ) // матрица 8 стоблцов { size_t k = j * 8; char max_(0); for ( size_t i = 0 ; i < 8 ; ++i ) { max_ = max(max_, data[k+i+1]); } data[j] = (int)max_ * 8 / 45; // data[j] = ( (int)data[k+1] + data[k+2] + data[k+3] + data[k+4] + data[k+5] + data[k+6] + data[k+7] + data[k+8] ) / 15; // Группировка по столбцам матрицы } } for ( uint8_t j = 0 ; j < 8 ; ++j ) // заполняем матрицу { for ( size_t i = 0 ; i < 8 ; ++i ) { if ( j < data[i] ) Serial.print('@', 0); // включаем ячейку else Serial.print(' ', 0); // выключаем ячейку } Serial.println(""); } delay(500); // Задержка чтобы монитор порта не перегружать }
У меня попроще: Код (C++): const int micPinL = A5; const int micPinR = A4; const int LED = 13; void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); } void loop() { int mvL = analogRead(micPinL) * 5.0 / 1024.0 * 1000.0; // значения в милливольтах Serial.println(mvL); // выводим в порт /* Пороги срабатывания светодиодов настраиваются вами экспериментальным методом: */ if (mvL > 2500 && mvL != 2485 && mvL != 2495 && mvL != 2490 && mvL != 2480) { // порог срабатывания зелёного светодиода, мВ digitalWrite(LED, HIGH); } else if(mvL < 2200 && mvL != 2485 && mvL != 2495 && mvL != 2490 && mvL != 2480){ digitalWrite(LED, 120); } else if(mvL < 2000 && mvL != 2485 && mvL != 2495 && mvL != 2490 && mvL != 2480){ digitalWrite(LED, 80); } else if(mvL < 1500 && mvL != 2485 && mvL != 2495 && mvL != 2490 && mvL != 2480){ digitalWrite(LED, 40); } else if(mvL < 1000 && mvL != 2485 && mvL != 2495 && mvL != 2490 && mvL != 2480){ digitalWrite(LED, 20); } else{ digitalWrite(LED, LOW); } }
Это зачем? Код (C++): && mvL != 2485 && mvL != 2495 && mvL != 2490 && mvL != 2480 тем более, что это условие заведомо истинно. везде есть условие: или mvL <2200 или mvL >2500.
А это? Код (C++): digitalWrite(LED, 120); оно эквивалентно Код (C++): digitalWrite(LED, HIGH); видимо analogWrite надо было. И где тут 12 светодиодов? На один пин Arduino только один светодиод можно прицепить. Больше пин по току не потянет.