если ставлю скобки, перестает все работать.
Кто нибудь занимается ардуино?
- Kamen987
- Вопрос темы решён
-
-
Как для меня то твоя "for"-schleife правильно построяна, а потом у тебя все строки кроме где есть "if((....)...." выполняются в этой Schleife.
Я не думаю что так задуманно.
Пожалуйста зарегистрируйся для просмотра прикрепленного файла.
-
в ориганальном скрипте нету скобок, если я парамерты меняю больше, меньше знак - команды отрабатываются.
Т.е. все реально работает.
Я думаю проблема не в скобках, а в логике.
Для семи диодов вычитываются в шлайфе (семь раз) результат от аналог аудио входа.
Я решил тоже использовать эти 7 вариабле для себя, где попставил знак больше в другую сторону.
Мне кажется можно проще, через else решить, но не знаю как это сделать.
Если прописываю else - компайлер ругается.
Я еще плохо понимаю в кодах.
-
Сейчас посмотрел в ардуино референц, если if без скобок то выполняется только одна следующая строчка, если условие true.
Тоестъ со скобками у тебя было бы так:
if (PWMvalue < 75){
PWMvalue = PWMvalue / 100;
}
analogWrite(LEDpins[x], PWMvalue);
digitalWrite(msgStrobe, HIGH);
if (PWMtest > 10) {//habe dazugefügt
PWMtest = PWMtest / 90; //habe dazugefügt
}
analogWrite(FonLed, PWMtest); //habe dazugefügt, hier sollte Signal kommen, wenn keine Musik spielt.
это так задуманно было?
-
Вообще как ты описываешь тебе это надо делать после шлайфы, а в шлайфе запоминать самое большое значение PWMvalue.
ЦитатаНужно на пин Д9 подавать сигнал (255 или немног слабее), когда на пинах 2, 3, 4, 5, 6, 7, 8 сигнала нет, как только сигнал на одном из них появится, пин9 должен отключить сигнал (0).
примерно так:
Исходный код
Показать весь кодvoid loop() { Audio.ReadFreq(FreqVal); //return 7 value of 7 bands pass filter //Frequency(Hz):63 160 400 1K 2.5K 6.25K 16K //FreqVal[7]: 0 1 2 3 4 5 6 digitalWrite(msgRST, HIGH); delay(20); digitalWrite(msgRST, LOW); //neu###### int PWMtest = 0; //#### for (int x = 0; x < 7; x++) { digitalWrite(msgStrobe, LOW); delayMicroseconds(20); int spectrumRead = analogRead(0); int PWMvalue = map(spectrumRead, 0, 1024, 0, 255); //neu###### höchsten Wert zwischenspeichern if (PWMtest < PWMvalue){PWMtest = PWMvalue;} //##### if (PWMvalue < 75) PWMvalue = PWMvalue / 100; analogWrite(LEDpins[x], PWMvalue); digitalWrite(msgStrobe, HIGH); } //neu###### solte es eigentlich nicht umgekehrt sein? z.B. // if (PWMtest < 10) { // analogWrite(FonLed, 255); // } // else { // analogWrite(FonLed, 0); // } if (PWMtest > 10) {//habe dazugefügt PWMtest = PWMtest / 90; //habe dazugefügt analogWrite(FonLed, PWMtest); //habe dazugefügt, hier sollte Signal kommen, wenn keine Musik spielt. } //###### }
-
вроде всё правильно у Генки, но сейчас фон будет резко включятся на 100% при каждой паузе в мелодии, тоесть он как бы сам станет частью светомузыки
надо длину паузы тоже описать и медленное вкл и откл фона
-
спасибо, попробую после обеда, отпишусь.
Если я правильно понимаю то вариабле PWMvalue и отвечает за свечение или несвечение диодов, т.е. может иметь значение от 0 до 255.
На самом деле диоды либо ярко светятся, либо не светятся.
Да и формула как то влияет на уровень PWMvalue /100, если меньше 75, в примерах для библиотеки испoль3уется другая формула, если меньше 50, то /2.
Почему автор кода так зделал не знаю, но работает.
не совсем ппонятны это величины в попугаях, а что тогда такое 1024?
В библиотеке коментаров практически нет.
А я тут "отсебячину" воткнул.
Но сперва попробую и потом отпишусь.
Спасибо!
-
а что тогда такое 1024?
1024 это верхний порог аналогового входа (5 Вольт если на атмеге например равно 1024, 10 бит)
255 это PWM выход он 8 бит
####--- вообщето правильней 1023 ---###
map(ххх, 0, 1024, 0, 255)
скалирует твои 10 бит входа к 8 бит выходу пропортионально значению ххх
Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.
-
Огромное спасибо ge-nka!
Заработало, код выглядит так:
Исходный код
Показать весь код#include <AudioAnalyzer.h> #define msgRST 12 #define msgStrobe 13 #define msgAnalog 0 Analyzer Audio = Analyzer(10, 11, 0); //Strobe pin ->10 RST pin ->11 Analog Pin ->0 int LEDpins[7] = {2, 3, 4, 5, 6, 7, 8}; int FreqVal[7] = {63, 160, 400, 1000, 2500, 6250, 16000}; int FonLed=9; //habe dazugefügt unsigned long timer = 0; //neu2 void setup() { Audio.Init(); //Init module for (int x = 0; x < 7; x++) { pinMode(LEDpins[x], OUTPUT); } pinMode(msgRST, OUTPUT); pinMode(msgStrobe, OUTPUT); pinMode(FonLed, OUTPUT); //habe dazugefügt } void loop() { Audio.ReadFreq(FreqVal); //return 7 value of 7 bands pass filter //Frequency(Hz):63 160 400 1K 2.5K 6.25K 16K //FreqVal[7]: 0 1 2 3 4 5 6 digitalWrite(msgRST, HIGH); delay(20); digitalWrite(msgRST, LOW); //neu###### int PWMtest = 0; //#### for (int x = 0; x < 7; x++) { digitalWrite(msgStrobe, LOW); delayMicroseconds(20); int spectrumRead = analogRead(0); int PWMvalue = map(spectrumRead, 0, 1024, 0, 255); //neu###### höchsten Wert zwischenspeichern if (PWMtest < PWMvalue){PWMtest = PWMvalue;} //##### if (PWMvalue < 75) PWMvalue = PWMvalue / 100; analogWrite(LEDpins[x], PWMvalue); digitalWrite(msgStrobe, HIGH); } if (PWMtest < 25) { analogWrite(FonLed, 255); } else { analogWrite(FonLed, 0); } }
хотелось бы еще добавить задержку 500млс, но не соображаю как в иф абфраге занести еще следущую иф абфраге из этого примера.
Delay использовать не хочу, так как все будет тромозить. Подчеркнул красным что я хочу добавить,
Пожалуйста зарегистрируйся для просмотра прикрепленного файла.
Может кто помочь?
Заранее огромное спасибо.
Это только для analogWrite(FonLed, 255); и analogWrite(FonLed, 0);
Что бы они запускались после 500милисекунд.
-
-
я бы так написал, уровень сигнала подобрать
Исходный код
Показать весь код#include <AudioAnalyzer.h> #define msgRST 12 #define msgStrobe 13 #define msgAnalog 0 Analyzer Audio = Analyzer(10, 11, 0); int LEDpins[7] = {2, 3, 4, 5, 6, 7, 8}; int FreqVal[7] = {63, 160, 400, 1000, 2500, 6250, 16000}; int FonLed=9; int SigLev=25; // здесь выставить уровень сигнала от 0 до 1024 ...5 volts / 1024 units or, 0.0049 volts (4.9 mV) per unit void setup() { Audio.Init(); for (int x = 0; x < 7; x++) { pinMode(LEDpins[x], OUTPUT); } pinMode(msgRST, OUTPUT); pinMode(msgStrobe, OUTPUT); pinMode(FonLed, OUTPUT); } void loop() { Audio.ReadFreq(FreqVal); digitalWrite(msgRST, HIGH); delay(20); digitalWrite(msgRST, LOW); if(analogRead(0) > SigLev){ analogWrite(FonLed, 0); for (int x = 0; x < 7; x++){ digitalWrite(msgStrobe, LOW); delayMicroseconds(20); int PWMvalue = map(analogRead(0), 0, 1024, 0, 255); if (PWMvalue < 75){ PWMvalue = PWMvalue / 100; } analogWrite(LEDpins[x], PWMvalue); digitalWrite(msgStrobe, HIGH); } }else{ analogWrite(FonLed, 255); } }
тебе же нужно фон зажигать если нет музыки, т.е нет сигнала или совсем малесинький, а ты почему то от спектра затанцевал.
а мож я неправ, хз
-
-
delay не подходит, так как во время delay - все процессы останавливаются, а это отразится на всей цветомузыке.
чуть позже выложу видео, что получилось в промежуточном итоге..
-
я бы так написал, уровень сигнала подобрать
что то твой код не работает, фон светится и больше ни какой реакции на музыку.
Видно где то ошибка.
Но проверю твой вариант.
сейчас зделал как ge-nka написал, только подберу задержку включения подсветки, 500мс похоже много.
Но работает отлично, код выглядит так:
Исходный код
Показать весь код#include <AudioAnalyzer.h> #define msgRST 12 #define msgStrobe 13 #define msgAnalog 0 Analyzer Audio = Analyzer(10, 11, 0); //Strobe pin ->10 RST pin ->11 Analog Pin ->0 int LEDpins[7] = {2, 3, 4, 5, 6, 7, 8}; int FreqVal[7] = {63, 160, 400, 1000, 2500, 6250, 16000}; int FonLed=9; //habe dazugefügt unsigned long timer = 0; //neu2 void setup() { Audio.Init(); //Init module for (int x = 0; x < 7; x++) { pinMode(LEDpins[x], OUTPUT); } pinMode(msgRST, OUTPUT); pinMode(msgStrobe, OUTPUT); pinMode(FonLed, OUTPUT); //habe dazugefügt } void loop() { Audio.ReadFreq(FreqVal); //return 7 value of 7 bands pass filter //Frequency(Hz):63 160 400 1K 2.5K 6.25K 16K //FreqVal[7]: 0 1 2 3 4 5 6 digitalWrite(msgRST, HIGH); delay(20); digitalWrite(msgRST, LOW); //neu###### int PWMtest = 0; //#### for (int x = 0; x < 7; x++) { digitalWrite(msgStrobe, LOW); delayMicroseconds(20); int spectrumRead = analogRead(0); int PWMvalue = map(spectrumRead, 0, 1024, 0, 255); //neu###### höchsten Wert zwischenspeichern if (PWMtest < PWMvalue){PWMtest = PWMvalue;} //##### if (PWMvalue < 75) PWMvalue = PWMvalue / 100; analogWrite(LEDpins[x], PWMvalue); digitalWrite(msgStrobe, HIGH); } if (PWMtest < 25) { if (timer == 0) {timer = millis();} if (millis() - timer > 300){ analogWrite(FonLed, 255); } } else { timer = 0; analogWrite(FonLed, 0); } if (timer > millis()){ timer=0; //Überlauf abfangen } }
-
ну ты видос покажи, интересно же
-
Будет видео - обещаю, телефон разряжен, щас заряжу...
думаю чере пару часов будет.
ge-nka - оргромное спасибо!!!
-
там в дебаге можно посмотреть, уровень сигнала когда играет музыка и когда нет
когда неиграет есть шум,
Исходный код
Показать весь код#include <AudioAnalyzer.h> #define msgRST 12 #define msgStrobe 13 #define msgAnalog 0 Analyzer Audio = Analyzer(10, 11, 0); int LEDpins[7] = {2, 3, 4, 5, 6, 7, 8}; int FreqVal[7] = {63, 160, 400, 1000, 2500, 6250, 16000}; int FonLed=9; int SigLev=2; // здесь выставить уровень сигнала от 0 до 1024 ...5 volts / 1024 units or, 0.0049 volts (4.9 mV) per unit void setup() { Audio.Init(); for (int x = 0; x < 7; x++) { pinMode(LEDpins[x], OUTPUT); } pinMode(msgRST, OUTPUT); pinMode(msgStrobe, OUTPUT); pinMode(FonLed, OUTPUT); } void loop() { Audio.ReadFreq(FreqVal); digitalWrite(msgRST, HIGH); delay(20); digitalWrite(msgRST, LOW); Serial.println(analogRead(0)); if(analogRead(0) > SigLev){ analogWrite(FonLed, 0); for (int x = 0; x < 7; x++){ digitalWrite(msgStrobe, LOW); delayMicroseconds(20); int PWMvalue = map(analogRead(0), 0, 1024, 0, 255); if (PWMvalue < 75){ PWMvalue = PWMvalue / 100; } analogWrite(LEDpins[x], PWMvalue); digitalWrite(msgStrobe, HIGH); } }else{ analogWrite(FonLed, 255); } }
сеичас я поставил SigLev равен 2 т.е 9,8mv амплитуда шума.
посмотри че пишет когда есть музыка и когда нет.
-
Видео в двух частях, даю линки в спойлере (это только для зарегестрированых пользователей), не хочу проблем из за музыки отхватить..
Снимал одной рукой с телефона, опыта снимок с телефона практически нет, делал интуитивно.
Пожалуйста зарегистрируйся для просмотра этого медийного элемента.
Пожалуйста зарегистрируйся для просмотра этого медийного элемента.
-
там в дебаге можно посмотреть, уровень сигнала когда играет музыка и когда нет
когда неиграет есть шум,
немогу разобраться пока, завтра буду разбираться.
P.S.
О моих видео - уже предупрежение прилитело за 4 трака, если будут бешверде, придется видео изменить (отключить эти трэки).
Пока оставлю так.
-
там в дебаге можно посмотреть, уровень сигнала когда играет музыка и когда нет
когда неиграет есть шум,
Что то с кодом не в порядке, показывает только нули, подсветка все время горит, другие цвета не включаются, не знаю, мне не хватает мозгов разобраться.
Пока только что немного исправил предыдущший код, который Генка помогал делать, изабвился от стороней библиотеки.
Выглядит сейчас кода так, меня устраивает как работает.
Исходный код
Показать весь код#define msg7RESET 12 #define msg7Strobe 13 #define msg7DCout 0 const int LEDpins[7] = {2,3,4,5,6,7,8}; //пины выводов для светодиодов. int FonLed=9; //пин канала подсветки unsigned long timer = 0; //таймер для работы с каналом подсветки void setup() { for (int x=0; x<7; x++) { pinMode(LEDpins[x], OUTPUT); // инициализация выходов для LED } pinMode(msg7RESET, OUTPUT); pinMode(msg7Strobe, OUTPUT); pinMode(FonLed, OUTPUT); //канал подсветки } void loop() { digitalWrite(msg7RESET, HIGH); // осуществляем сброс MSGEQ7 delay(5); digitalWrite(msg7RESET, LOW); int PWMFon = 0; for (int x = 0; x < 7; x++) { // семь частот - семь стробирующих импульсов digitalWrite(msg7Strobe, LOW); delayMicroseconds(35); // ждем установления значения 35 мкс int spectrumRead = analogRead(msg7DCout); // считываем значение с аналогового входа //Frequency(Hz):63 160 400 1K 2.5K 6.25K 16K int PWMvalue = map(spectrumRead, 0, 1024, 0, 255); // преобразовываем диапазон 0-1024 к диапазону 0-255 для ШИМ if (PWMFon < PWMvalue){PWMFon = PWMvalue;} //запоминаем самый высокий уровень сигнала if (PWMvalue < 75) // небольшой программный фильтр шума PWMvalue = PWMvalue / 100; analogWrite(LEDpins[x], PWMvalue); digitalWrite(msg7Strobe, HIGH); } if (PWMFon < 25) { //порог срабатывания канала подсветки, при отсутствии сигнала на всех семи каналах if (timer == 0) {timer = millis();} if (millis() - timer > 300){ //задержка в 300 милисекуд перед включением канала подсветки analogWrite(FonLed, 255); //канал подсветки включен } } else { timer = 0; analogWrite(FonLed, 0); //канал подсветки выключен } if (timer > millis()){ timer=0; //сброс таймера } }
надо еще схему нарисовать и выложить, может кому будет интересно собрать.
P.S.
я собирал по этим примерам, подключение миркосхемы спектр-анализатора первый рисунок, мосфеты (BUZ11) по второму рисунку, у меня их 8. Семь штук для лаждый частоты и одна на канал подсветки. Какие пины надо подключать в коде прописаны. Если есть вопросы - отвечу.
Пожалуйста зарегистрируйся для просмотра прикрепленного файла.Пожалуйста зарегистрируйся для просмотра прикрепленного файла.