ARDUINO Прошу помощи у тех кто может помочь немного разобраться в чужом скетче

Андрей К.

★✩✩✩✩✩✩
25 Май 2019
287
23
Москва. Щукино
Сразу скажу, я пенсионер, программированием занялся совсем недавно... отсюда и много вопросов...
Сделал слайдер по образу из ютуба . На контакт автор не идет. Некоторые моменты как исправить нашел сам. Но некоторые моменты не поддаются. Для тех кто готов попытаться помочь, все скинул сюда - https://yadi.sk/d/Tf1fbfVISi9jVA?w=1 Механика и электроника вся сделана, в принципе пользоваться уже можно..
А вопросы такие:
После установки параметров перемещения, в меню, на экране появляется значение скорости и времени, которое чрезмерно велико, точнее скорость низкая и соответственно время долгое... а для установки значений для бОльшей скорости движения приходится 1-2 минуты крутить ручку энкодера... Где задается изначально параметр скорости я не понимаю... Помогите его найти.
В идеале хотелось чтоб в конце, по окончании движения, появлялось меню с выбором что делать дальше а не ФИНИШ... Иногда хочется проехать туда а потом и обратно не изменяя параметров перемещения... Но как это реализовать вообще не представляю...
Спасибо откликнувшимся.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
строка 60 , вроде это и есть начальная скорость.
float setspeed=200;
Далее она делится на 80 и устанавливается как скорость мотора (строка 177)
motorspeed=setspeed/80;

остальное требует времени и вникания
 

Андрей К.

★✩✩✩✩✩✩
25 Май 2019
287
23
Москва. Щукино
Спасибо. Попробую поиграться.
Не прокатило... менял от 50 до 500 ни на что не влияло.

Может тогда с шагом при вращении энкодера как то помудрить ? Сделать шаг побольше... Как работает энкодер для меня загадка...

Я бы сам не спеша написал программу, управление сделал бы на кнопках, и проще и нагляднее.... не могу понять как скрестить вращение 2ух моторов одновременно с разными условиями... Управление одним мотором я уже делал самостоятельно... а два и сразу, и чтоб они при прохождении одного расстояния повернулись на разное кол-во оборотов, причем синхронно... не укладывается в голове...
 
Изменено:

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
208
Начальное значение у setspeed устанавливается в двух местах, не пропустите. Ну и по этой же переменной найдёте, где она подкручивается энкодером, сможете увеличить шаг изменения скорости.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Действительно.. Код не форматирован, а листать все setspeed я уже припух :) поиск по "setspeed =" дал только одно место. спс.
 

Андрей К.

★✩✩✩✩✩✩
25 Май 2019
287
23
Москва. Щукино
Начальное значение у setspeed устанавливается в двух местах, не пропустите. Ну и по этой же переменной найдёте, где она подкручивается энкодером, сможете увеличить шаг изменения скорости.
Я правильно нашел управление энкодером ? Это строки 159 и дальше, шаг энкодера +30. Если поставить значение бОльше, то шаг увеличится ? Так ?
if (rotationdirection)
{
setspeed = setspeed + 30;
}
if (!rotationdirection)
{
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
208
Я правильно нашел ? Это строки 159 и дальше, шаг энкодера +30. Если поставить значение бОльше, то шаг увеличится ? Так ?
if (rotationdirection)
{
setspeed = setspeed + 30;
}
if (!rotationdirection)
{
Поменяйте, проверьте.
 

Андрей К.

★✩✩✩✩✩✩
25 Май 2019
287
23
Москва. Щукино
Спасибо. По крайней мере шаг сделал бОльше и уже настройка скорости стала бОлее удобная. А то была какая то прецизионная :)

Теперь бы сделать в конце, через меню, выбор "Домой" или ехать с те ми же настройками обратно. Было б класс.
 
Изменено:

Андрей К.

★✩✩✩✩✩✩
25 Май 2019
287
23
Москва. Щукино
Не спеша все продвигается. Возврат для обратного прохода уже сделал. Отлично.

А вот с меню у меня затык. сделал так - вставлял после 254 строки

кусок скетча:
// Меню выбора куда ехать  Вводим переменную D для переключения звездочки



  if (flag == 9)                // пишем надписи меню

  {

    display.clearDisplay();

    display.setCursor(20, 10);

    display.println("Return");

    display.setCursor(20, 35);

    display.println("Homing");

    display.display();



    if (TurnDetected)     //  а потом меняем надписи на отмеченые звездочками

    {

      TurnDetected = false;         // не повторять цикл IF до тех пор, пока не будет обнаружено новое вращение

      if (rotationdirection)

      {

        D = D + 1;            // вращение по часовой

      }

      if (D > 2)

      {

        D = 2;

        display.clearDisplay();

        display.setCursor(20, 10);

        display.println("Return");

        display.setCursor(20, 35);

        display.println("Homing **");    //выбраный пункт меню

        display.display();



      }

      if (!rotationdirection)

      {

        D = D - 1;            // вращение против часовой

        if (D < 1)

        {

          D = 1;

          display.clearDisplay();

          display.setCursor(20, 10);

          display.println("Return **");    //выбраный пункт меню

          display.setCursor(20, 35);

          display.println("Homing");

          display.display();



        }

      }

    }

  }





  //  Перенаправление куда идти

  if (flag == 10) {

    flag = flag + D;

  }



  //Return

  if (flag == 11)

  {
Но после внедрения этой писанины, скетч вообще не запускается в работу.... Всё компилируется и прошивается, но при включении слайдера полная тишина... моторы стоят, дисплей не включается....

Спасибо откликнувшимся.
 
Изменено:

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
208
Но после внедрения этой писанины, скетч вообще не запускается в работу.... Всё компилируется и прошивается, но при включении слайдера полная тишина... моторы стоят, дисплей не включается....
Для начала верните предыдущую версию скетча, убедитесь, что всё снова заработало. Потом добавляйте новый код по кускам, пока не перестанет работать.
 

Андрей К.

★✩✩✩✩✩✩
25 Май 2019
287
23
Москва. Щукино
Не выходит "Каменный цветок" :(
Сколько я не бился, какие варианты не пробовал... не получается... и моей логике не поддается.
Описываю в общих чертах Меню, которое хотел сделать, работает без проблем. Всё выбирается и переходит туда куда нужно. С этим проблем никаких. Но отображение выбранного пункта в меню, содержит мной не объяснимую не понимаемую засаду.

Вот так выглядит блок самого меню:
if (flag == 9) {

    if (TurnDetected)
    {
      TurnDetected = false;                // не повторять цикл IF до тех пор, пока не будет обнаружено новое вращение

      if (rotationdirection)
      { D = D + 1;                                   // вращение по часовой
        display.clearDisplay();
        display.setCursor(20, 10);
        display.println("Return");
        display.setCursor(20, 35);
        display.println("Finish<<");       //выбранный пункт меню
        display.display();
        if (D >= 2)    {
          D = 2;
        }
      }

      if (!rotationdirection)
      {
        D = D - 1;                                       // вращение против часовой
        display.clearDisplay();
        display.setCursor(20, 10);
        display.println("Return");            //выбранный пункт меню
        display.setCursor(20, 35);
        display.println("Finish");
        display.display();

        if (D <= 1) {
          D = 1;

        }
      }
    }
  }


  //  Перенаправление куда идти
  if (flag == 10) {
    flag = flag + D;
  }
Но самое противное в этой ситуации то, что : если в первом блоке вывода на дисплей выбран (отмечен) стрелочками (в принципе не важно чем) Финиш, а во второй части ничего не отмечено, а просто надписи как есть, то программа работает корректно, при кручении ручки выбора, на экране то появляется надпись отмеченная стрелочками то исчезает... и выполняется переход туда куда нужно.
НО, если в во втором блоке вывода на дисплей поставить галки (отметить) надпись Возврат, то всё.... полный абзац. После заливки программа не работает вообще... Но если, так же как и в первом блоке, отметить надпись Финиш, то программа не глючит и работает... Памяти достаточно... Я даже эти оба блока выводил под свой оператор if (D=1) {... } и ситуация оставалась той же.
Если быть точнее, скетч позволял мне отмечать выбранное слово или в первом или во втором блоке... и работал корректно. Если выбор был в двух блоках, как это должно быть, то программа полностью уходит в аут. И не работает.
У меня мыслей уже нет.
Спасибо...
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Если я правильно понял, то работать перестает после того, как в 25-ой строке сделать так :
display.println("Return<<"); //выбранный пункт меню

Верно ?
Если нажать на галочку , которая компилирует прошивку, то в нижнем окне будет такое сообщение:
Скетч использует 17826 байт (58%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 757 байт (36%) динамической памяти, оставляя 1291 байт для локальных переменных. Максимум: 2048 байт.

Что там у вас по памяти показывает ?
 

Андрей К.

★✩✩✩✩✩✩
25 Май 2019
287
23
Москва. Щукино
Скетч использует 26630 байт (86%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 882 байт (43%) динамической памяти, оставляя 1166 байт для локальных переменных. Максимум: 2048 байт.

А поняли всё верно.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Тут может быть 2 вариант. Не нравится длина строки. Тогда попробовать сделать строки короче
display.println("R <<");
display.println("S <<");
Еще можно попробовать разместить их в общей памяти вот так:
display.println(F("R <<"));
display.println(F("S <<"));
 

Андрей К.

★✩✩✩✩✩✩
25 Май 2019
287
23
Москва. Щукино
Длинну строки я уменьшал. Не помогало.
Если я правильно понял, то те строки которые выводят надпись в обоих блоках, в них нужно дописать F