Как организовать прерывание (соединить 2 проекта вместе)

Тема в разделе "Arduino & Shields", создана пользователем blackflash2009, 4 фев 2023.

  1. Хочу сделать полуавтоматический станок намотки
    Есть код вывода данных ( переменной на дисплей TM1637 пока не недоделанный)
    Также есть код изменение переменной при помощи энкодера. Не магу понять как их объединить вместе.
    Примерно должно выглядеть так контролер включается -> инициализируется библиотеки -> в функции setup() выводит надпись _H, _E, _L, _L -> в функции loop() стоит и ждет команды от кнопки на переход в подпрограмму "ввода данных с энкодера " -> по нажатию кнопки энкодера запоминает полученное значение переменной и сразу же начинает управлять шаговиком отсчитывая шоги (шаговик крутится за оборот отнимая по 1 от переменной полученной от энкодера )
    Первая часть выглядит как то так
    Код (C++):
    // инициалезация дисплея -----------------------------------------------------------
    #define CLK 9
    #define DIO 8
    #include "GyverTM1637.h"
    GyverTM1637 disp(CLK, DIO);
    //-----------------------------------------------------------------------------------
    // инициализация энкодера -----------------------------------------------------------
    #define CLK 2
    #define DT 3
    #define SW 4
    #include "GyverEncoder.h"
    Encoder enc1(CLK, DT, SW);
    int value = 0;
    //------------------------------------------------------------------------------------
    void setup() {
    // яркость и приветствие---------------------------------------------------------
      disp.brightness(7);  // яркость, 0 - 7 (минимум - максимум)
      disp.clear();
      disp.displayByte(_H, _E, _L, _L);
    delay(1000);
    //--------------------------------------------------------------------------------
    // настройки энкодера ------------------------------------------------------------
      enc1.setType(TYPE1);        // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый.
      enc1.setFastTimeout(40);    // таймаут на скорость isFastR. По умолч. 50
     
    }
     
     
  2. Энкодер пока тоже не дописан нужно получившиеся число перевести в переменную а
    Код (C++):
    void Encoder() {
      // обязательная функция отработки. Должна постоянно опрашиваться
      enc1.tick();
      if (enc1.isRight()) value++;        // если был поворот направо, увеличиваем на 1
      if (enc1.isLeft()) value--;         // если был поворот налево, уменьшаем на 1
      if (enc1.isFastR()) value += 10;    // если был быстрый поворот направо, увеличиваем на 10
      if (enc1.isFastL()) value -= 10;    // если был быстрый поворот налево, уменьшаем на 10
      if (enc1.isTurn()) {                // если был совершён поворот (индикатор поворота в любую сторону)
      disp.displayInt(value);// выводим значение при повороте          
      int a = value ; }
    }
     
  3. Рокки1945

    Рокки1945 Гуру

    хоть бы поздоровался что-ли - капздец воспитание у людей
     
    parovoZZ и Bott нравится это.
  4. Bott

    Bott Гик

    HELL это Ад? Тот текст что выводит дисплей при старте?
     
  5. "HELL это Ад" дисплей светодиодный на 4 символа. Рокки1945 а строчка disp.displayByte(_H, _E, _L, _L); за привет не устраивает ?
    Получилась пока как то так (Смори ниже )
    Застрял чтобы бы я не делал после "disp.displayInt(value); // выводит первоначальное значение переменной value " (Последняя в коде строчка) значение уходит сразу на исполнение без нажатой кнопке даже проскакивает режим ввода значения с энкодера
    Код (C++):
    // инициализация дисплея -----------------------------------------------------------
    #define CLK 9
    #define DIO 8
    #include "GyverTM1637.h"
    GyverTM1637 disp(CLK, DIO);
    //-----------------------------------------------------------------------------------
    // инициализация энкодера -----------------------------------------------------------
    #define CLK 2
    #define DT 3
    #define SW 4
    #include "GyverEncoder.h"
    Encoder enc1(CLK, DT, SW);
    int value = 0;
    //------------------------------------------------------------------------------------
    void setup() {
    // яркость и приветствие---------------------------------------------------------
      disp.brightness(7);  // яркость, 0 - 7 (минимум - максимум)
      disp.clear();
      disp.displayByte(_H, _E, _L, _L);
    delay(1000);
    //--------------------------------------------------------------------------------
    // настройки энкодера ------------------------------------------------------------
      enc1.setType(TYPE1);        // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый.
      enc1.setFastTimeout(10);    // таймаут на скорость isFastR. По умолч. 50
    //  ----------------------------------------------------------------------------------
    }
    void loop() {
      // бесконечный цикл ожидания нажатия кнопки-------------------------------------
    while (digitalRead(4) == LOW) { // цикл ничего не делает пока не сработает кнопка после нажатия так что его == HIGHбольше нет while, цикл завершится
      delay(600);
    disp.displayInt(value); //выводет первоначальное значение переменной value
    }
    //----------------------------------------------------------------------------------
    // ввод значения с энкодера --------------------------------------------------------
    // обязательная функция отработки. Должна постоянно опрашиваться
    enc1.tick();
      if (enc1.isRight()) value++;        // если был поворот направо, увеличиваем на 1
      if (enc1.isLeft()) value--;         // если был поворот налево, уменьшаем на 1
      if (enc1.isFastR()) value += 10;    // если был быстрый поворот направо, увеличиваем на 10
      if (enc1.isFastL()) value -= 10;    // если был быстрый поворот налево, уменьшаем на 10
      if (enc1.isTurn()) {                // если был совершён поворот (индикатор поворота в любую сторону)
      disp.displayInt(value);             // выводет первоначальное значение переменной value

    }
    }
     
     
  6. parovoZZ

    parovoZZ Гуру

    Прерывание организовывается через обработчик вектора прерывания. Предварительно это прерывание надо разрешитть. В сети полно примеров.
     
    Последнее редактирование: 4 фев 2023
  7. parovoZZ можно ссылочку ? я сам программирую свой код первый раз
     
  8. parovoZZ

    parovoZZ Гуру

    Сперва надо составить алгоритм работы программы. Можно в визио, можно в любой другой программе. Да хоть и на листке бумаги. Потом уже браться за код.
     
    Рокки1945 нравится это.
  9. parovoZZ

    parovoZZ Гуру

    Ключевые слова для поиска - narodstream. Там есть все - кнопки, энкодеры, дисплеи, прерывания.
     
    Ariadna-on-Line нравится это.
  10. parovoZZ

    parovoZZ Гуру

    В первый раз надо поморгать светодиодом, считать кнопку, затриггерить ее, научиться работать с интервалами без делеев. Всему этому надо научиться без библиотек.
     
    Рокки1945 нравится это.
  11. Рокки1945

    Рокки1945 Гуру

    Именно на бумаге и с ручкой, потому-что происходит осознание и понимание того, что необходимо сделать для решения поставленной задачи.
     
  12. Рокки1945

    Рокки1945 Гуру

    Ты вспомни что все учебники и книжки по нормальному программированию начинаются ну или почти все с того как выстроить алгоритм. Ведь это настоящее искусство!
     
  13. Код (C++):
    // инициалезация дисплея -----------------------------------------------------------
    #define CLK 9
    #define DIO 8
    #include "GyverTM1637.h"
    GyverTM1637 disp(CLK, DIO);
    //-----------------------------------------------------------------------------------
    // инициализация энкодера -----------------------------------------------------------
    #define CLK 2
    #define DT 3
    #define SW 4
    #include "GyverEncoder.h"
    Encoder enc1(CLK, DT, SW);
    int value = 0;
    int val = 0 ;
    int vlayal = 0 ;
    //------------------------------------------------------------------------------------
    void setup() {
    // яркость и приветствие---------------------------------------------------------
      disp.brightness(7);  // яркость, 0 - 7 (минимум - максимум)
      disp.clear();
      disp.displayByte(_H, _E, _L, _L);
      delay(3000);
      disp.displayInt(0);
    //--------------------------------------------------------------------------------
    // настройки энкодера ------------------------------------------------------------
      enc1.setType(TYPE1);        // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый.
      enc1.setFastTimeout(10);    // таймаут на скорость isFastR. По умолч. 50
    //  ----------------------------------------------------------------------------------
    }
    void loop() {
    // ввод значения с энкодера --------------------------------------------------------
    // обязательная функция отработки. Должна постоянно опрашиваться
      enc1.tick();
       if (enc1.isRight()) value++;        // если был поворот направо, увеличиваем на 1
       if (enc1.isLeft()) value--;         // если был поворот налево, уменьшаем на 1
       if (enc1.isFastR()) value += 10;    // если был быстрый поворот направо, увеличиваем на 10
       if (enc1.isFastL()) value -= 10;    // если был быстрый поворот налево, уменьшаем на 10
       if (enc1.isTurn()) {                // если был совершён поворот (индикатор поворота в любую сторону)
      disp.displayInt(value);              // выводет первоначальное значение переменной value
    }



    int val = value ;
    int vlayal = value ;

    // бесконечный цикол ожидания нажатия кнопки-------------------------------------
    while (digitalRead(4) == LOW) { // цыкол ничего не делает пока не сработает кнопка после нажатия так что его == HIGHбольше нет while, цикл завершится
    delay(10);
    //--------------------------------------------------------------------------------

    //пример работы счетчика где конечное значение переменная value


    for (int i = 1; i < vlayal; i++) {
    int val = vlayal-i;
      disp.displayInt(val); //выводет первоначальное значение переменной value
    delay(1000);
    }
    disp.displayByte(_0, _0, _0, _0);
    }
    //----------------------------------------------------------------------------------

    }
    Все красиво но я что-то делаю на мк раз в год по суте можно было не выпендриваться и управлять тупо перепрошивкой ардуино. А был бы я менее нищим взял бы готовый проект с укладчиком. Аппетит приходит во время еды. Появилась задумка Добавить кнопку стор (остановка во время намотки с запоминанием результатов ) и управление скоростью вращения энкодером.
    Пока получила количество витков регулируется сразу по щелчку кнопки данные отправляются дальше теперь нужно заставить шагать двигатель через драйвер А4988
     
  14. parovoZZ

    parovoZZ Гуру

    Так а ТС от нас чего хочет?
     
  15. Помощи с кодом но от вас, помощи не дождешься полько бла бла о прекрасном и о там как надо делать прекрасно, но только сам как нибудь, не мешай обсуждать нам прекрасное.
     
  16. parovoZZ

    parovoZZ Гуру

    Программа - это всегда интерпретация алгоритма на каком-то языке. Поэтому необходимо сперва разобраться с алгоритмом, довести его до работоспособного состояния, а уже потом просить помощи с кодом. Я сильно сомневаюсь, что кому-то из присутствующих ясна хотя бы постановка задачи.
     
    Рокки1945 нравится это.
  17. Рокки1945

    Рокки1945 Гуру

    Вот тоже самое, что и на работе от нас с тобой хотят. Ты когда на работе тз в последний раз видел от манагера или от архитектора толкового? Начнёшь что-то спрашивать - так ждёшь ответа неделю а то и месяц.
     
  18. Алгоритм прост включаешь устройство, энкодером задаешь количество оборотов которое необходимо выполнить шаговому двигателю, при наборе энкодером количество оборотов высвечивается на дисплей 7 сегментный сделанный на контролере TM1637, нажатие кнопки энкодера запускает вращение шагового мотора, с каждым полным оборотам двигателя на дисплее высвечивается оставшиеся количество витков. Это алгоритм ? если да то это минимум что мне нужен. На данный момент кое как написано до "нажатие кнопки энкодера запускает вращение шагового мотора" нужно в код добавить собственно "вращение шагового мотора"
     
  19. Рокки1945

    Рокки1945 Гуру

    никогда не забуду фразу из сериала про Ломоносова "Что не хочу знаю, а что хочу незнаю"
     
  20. Airbus

    Airbus Радиохулиган Модератор

    Все просто—слушай умных людей
     
    DetSimen и Рокки1945 нравится это.