Кто нибудь занимается ардуино?

  • Ребята вопрос, иногда на некоторых кодах выкидывает оранжевым цветом типа ошибки, но типа удачно прописал, но код корректно не работает, например спектранализатопр должен цвета менять, а он только зеленым цветом работает. не могу понять где косяк, либо библиотеки и версии программ не совпадают или надо руками править, судя ошибке снизу, там шлайфе не используется?

  • In function 'topSinking()'


    iteration 14 invokes undefined behavior [-Waggressive-loop-optimizations]


    гдето у тебя Überlauf или деминзион от арай маленькая получается, ну или в библиотеке.

    смотри

    или вариабле j, ROWS

    или арай

    peakhold[j]

  • В общем вяснилась одна вещь, не любой скетчь от НАНО можно залить в МЕГА, вот и вылазиют ошибки.

    Конечно было бы не плохо разобраться с этим.

    Прикупил пару клонов НАНО, там код работает без проблем.

    В общем учиться и учиться...

  • Заменил канал фона на функцию пинг-понг. Нравится, видео ниже. Только как избавиться от Delay в фунции void pingPong() и заменить ее на millis(), пока не соображаю как.


  • тут примеры есть и Генка мне в код встаил, но не соображаю как дальше пристроить.


    Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.

  • попробовал первый блок изменить, ругается на ковчки, что не так стоят


    void pingPong()

    {

    int index;

    int delayTime = 80; //80


    for(index = 0; index <= 6; index++)

    {

    digitalWrite(LEDpins[index], HIGH);{

    //delay(delayTime);

    if (timer == 0) {timer = millis();}

    if (millis() - timer > 80){

    digitalWrite(LEDpins[index], LOW);

    }

    }


    for(index = 6; index >= 0; index--)


    {

    digitalWrite(LEDpins[index], LOW);

    delay(delayTime);

    digitalWrite(LEDpins[index], HIGH);

    }

    }

  • зделал так, не ругается, но получился не пинг-понг а стробоскоп... :roflmao:

    к сожалению непонимаю что делаю... :hexe:


  • Я так понинаю у меня проблема с шляйфой, т.е. выполняется пауза только один раз, а надо с каждым оборотом.

    Пока не понимаю как это зделать, конкретных примеров нету.

    Есть только где двеажды делэй в шлайфе,, тогда используют знак неравенства 1=!1

    А тут не получится так. ||||||||||

    Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.

    Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.

  • заменил на микросекунды 5 раз по 16383 (это максимальный верт, который может ардуино) как раз и будет чуть больше 80 милисекунд.

    Но тормозит так же как при делэй.

    Тут тоже процессор тормозится?

    Что то ничего не нашел на эту тему.

    Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.

    P.S.

    Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.

    Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.

    Сообщение было отредактировано 1 раз, последнее редактирование пользователем Kamen987 ().

  • delayMicroseconds() также блокирует как и delay() только вместо милисекунд можно микросекунды задать.

  • Ясно, значит надо с милис разбираться, научится их применять в шляйфе.

    У меня получается стробоскоб. :roflmao:

    Пока отложу, итак мозги дымят от количества инфы..

  • зделал так, не ругается, но получился не пинг-понг а стробоскоп... :roflmao:

    к сожалению непонимаю что делаю... :hexe:


    если так посмотреть на код то последней скобки не хватает чтобы завершить

    void pingPong()

    {

    } <- этой скобки, но код всёравно работать не будет.


    Если делать на милис() то там милис считает одну 32 бит вариабле вверх каждую милисекунду,

    этого хватает на 50 дней. (49 с копейками если точно)

    пока милис-значение не достигнет 2³² потом будет опять 0,1,2 итд.

    Поэтому надо гдето встраивать это :

    if (timer > millis()){timer=0;} /Überlauf abfangen


    timer = millis(); //запомнили значение милис в вариабле таймер

    timer2 = millis(); //запомнили значение милис в вариабле таймер2


    if (millis() - timer > 500){ analogWrite(FonLed, 255); } // милис считает дальше и если перевалил за 500 (millis() - timer ) то исполняется код который в скобках.

    if (millis() - timer2 > 300){ analogWrite(FonLed, 255); } // милис считает дальше и если перевалил за 300 (millis() - timer2 ) то исполняется код который в скобках.


    После того как код исполнился надо както вариаблен timer и timer2 сделатъ не исполняемыми чтобы это if (millis() - timer > 500) и это if (millis() - timer2 > 300) было фальш.

    самое простое это timer = millis(); где нибудь записать,тем самым у нас есть опять 500 мс времени чтобы гденибудь сброситъ опять.


    Как тебе пинпонг сделать на милис зависит от того как ты это себе представляешь, на делай в принципе уже хорошо один раз в лево один раз в право и потом провераем есть ли сигнал, если нет опять влево вправо.

    На милис он у тебя в середине должен отключать с помощью timer = millis();

    будет ли это так хорошо выглядеть не знаю.

  • Всем привет. Сейчас доцент мой бывший по васапу прислал и я вспомнил что здесь интересуются этой темой. Выставлю ссылку, думаю пригодится многим и спрашивайте его на канале в комментах, он очень хорошо всё расказывает и с удовольствием помогает. Всем удачи!


    Пожалуйста зарегистрируйся для просмотра этого медийного элемента.