Индикация количества отработанных циклов

SHDmitriy

✩✩✩✩✩✩✩
2 Окт 2022
2
0
Прошу помощи более опытных специалистов.
Шаговый мотор управляется микроконтроллером на Ардуино, запрограммированным таким скетчем:

C++:
int j = 0;

int n = 10; //Количество циклов

//Пины управления шаговиком

#define STEP_PIN         3

#define DIR_PIN          2

#define ENABLE_PIN       4



//Пин кнопки

#define start_button 6



//Здесь можно настроить время поворота и паузы

#define move_forward_time 5000    //время прямого хода в мсек

#define move_back_time 5000       //время обратного хода в мсек

#define pause_time 1000           //время паузы в мсек

#define frequency 100 //Время между импульсами в мксек. 1000 мксек = 1 мсек = 0.001 сек. Частота следования импульсов 1/0.001 = 1 кГц,

//Не рекомендуется устанавливать время меньше 100 мсек, т.к. частота будет 10 кГц



//Таймер для millis()

uint32_t timer = 0;

int period_smazki =0;

//Логический флаг для рабочего режима

bool flag = 0;



void setup() {

  Serial.begin(9600);



  pinMode(start_button, INPUT_PULLUP);  //Подтягиваем кнопку к питанию



  pinMode(STEP_PIN   , OUTPUT);       //Настраиваем пины управления

  pinMode(DIR_PIN    , OUTPUT);

  pinMode(ENABLE_PIN , OUTPUT);

  digitalWrite(ENABLE_PIN , HIGH);    //Выключаем мотор, чтобы не грелся

}



void loop () {

  if (!digitalRead(start_button)) {       //Если нажали на кнопку

    digitalWrite(ENABLE_PIN , LOW);

    //Serial.println("Мотор включен");  //Включаем мотор

    flag = 1;                             //Активируем флаг рабочего режима

    timer = millis();                     //Запускаем таймер

  }

  if (flag) {                                 //Если флаг активирован

         //Задаем направление вращения

for(int j=1; j <=n; j++){

   Serial.print("Цикл ");Serial.println(j);

   digitalWrite(ENABLE_PIN , LOW);

     digitalWrite(DIR_PIN    , HIGH);

      for (int i = 1; i <=400*16; i++) {          //Выполняем нужное число шагов 200 = 1 оборот

    digitalWrite(STEP_PIN    , HIGH);

    delayMicroseconds(frequency);

    digitalWrite(STEP_PIN    , LOW);

    delayMicroseconds(frequency);

    //Serial.print("шаг ");Serial.println(i);

    }

    digitalWrite(ENABLE_PIN , HIGH);

    flag = 0;



      //Serial.println("пауза 1 сек"); //Пауза pause_time мсек

    delay(pause_time);     

    timer = millis();

     digitalWrite(ENABLE_PIN , LOW);

    digitalWrite(DIR_PIN    , LOW);

  

        for (int i = 1; i <= 400*16; i++) {          //Выполняем нужное число шагов 200 = 1 оборот

    digitalWrite(STEP_PIN    , HIGH);

    delayMicroseconds(frequency);

    digitalWrite(STEP_PIN    , LOW);

    delayMicroseconds(frequency);

    //Serial.print("шаг назад ");Serial.println(i);

    }

    flag = 0;

digitalWrite(ENABLE_PIN , HIGH);

 

    //Serial.println("пауза 1 сек"); //Пауза pause_time мсек

    delay(pause_time);     

    timer = millis();

  }

  }

}
По такой схеме всё отрабатывает нормально и счёт циклов выводится на монитор порта. Но понадобилось оторвать устройство от компьютера, а индикацию количества отработанных циклов вывести на четырехразрядный семисегментный индикатор. Подключил индикатор TM1637, установил библиотеку TM1637.h, загрузил demo скетч. Также всё работает, индикатор выводит заданное значение.
Теперь объединил два скетча в один:
C++:
#include "TM1637.h"





#define CLK 9

#define DIO 8



TM1637 disp(CLK, DIO);





int j = 0;

int n = 10; //Количество циклов

//Пины управления шаговиком

#define STEP_PIN         3

#define DIR_PIN          2

#define ENABLE_PIN       4



//Пин кнопки

#define start_button 6



//Здесь можно настроить время поворота и паузы

#define move_forward_time 5000    //время прямого хода в мсек

#define move_back_time 5000       //время обратного хода в мсек

#define pause_time 1000           //время паузы в мсек

#define frequency 100 //Время между импульсами в мксек. 1000 мксек = 1 мсек = 0.001 сек. Частота следования импульсов 1/0.001 = 1 кГц,

//Не рекомендуется устанавливать время меньше 100 мсек, т.к. частота будет 10 кГц



//Таймер для millis()

uint32_t timer = 0;

int period_smazki =0;

//Логический флаг для рабочего режима

bool flag = 0;



void setup() {

  //Serial.begin(9600);



  pinMode(start_button, INPUT_PULLUP);  //Подтягиваем кнопку к питанию

  pinMode(STEP_PIN   , OUTPUT);       //Настраиваем пины управления

  pinMode(DIR_PIN    , OUTPUT);

  pinMode(ENABLE_PIN , OUTPUT);



  digitalWrite(ENABLE_PIN , HIGH);    //Выключаем мотор, чтобы не грелся

  disp.init();  // инициализация

  disp.set(1);  // яркость, 0 - 7 (минимум - максимум)



}



void loop () {

  if (!digitalRead(start_button)) {       //Если нажали на кнопку

    digitalWrite(ENABLE_PIN , LOW);

    //Serial.println("Мотор включен");  //Включаем мотор

    flag = 1;                             //Активируем флаг рабочего режима

    timer = millis();                     //Запускаем таймер

  }

  if (flag) {                                 //Если флаг активирован

         //Задаем направление вращения

for(int j=1; j <=n; j++){

   //Serial.print("Цикл ");Serial.println(j);

 

   disp.displayInt(j);



   digitalWrite(ENABLE_PIN , LOW);

     digitalWrite(DIR_PIN    , HIGH);

      for (int i = 1; i <=400*16; i++) {          //Выполняем нужное число шагов 200 = 1 оборот

    digitalWrite(STEP_PIN    , HIGH);

    delayMicroseconds(frequency);

    digitalWrite(STEP_PIN    , LOW);

    delayMicroseconds(frequency);

    //Serial.print("шаг ");Serial.println(i);

    }

    digitalWrite(ENABLE_PIN , HIGH);

    flag = 0;



      //Serial.println("пауза 1 сек"); //Пауза pause_time мсек

    delay(pause_time);     

    timer = millis();

     digitalWrite(ENABLE_PIN , LOW);

    digitalWrite(DIR_PIN    , LOW);

  

        for (int i = 1; i <= 400*16; i++) {          //Выполняем нужное число шагов 200 = 1 оборот

    digitalWrite(STEP_PIN    , HIGH);

    delayMicroseconds(frequency);

    digitalWrite(STEP_PIN    , LOW);

    delayMicroseconds(frequency);

    //Serial.print("шаг назад ");Serial.println(i);

    }

    flag = 0;

digitalWrite(ENABLE_PIN , HIGH);

 

    //Serial.println("пауза 1 сек"); //Пауза pause_time мсек

    delay(pause_time);     

    timer = millis();

  }

  }

}
В результате скетч компилируется, загружается в Ардуину, но не запускается цикл. При этом если закомментировать строки из первого скетча, то индикатор инициализируется и показывает значение переменной (в данном случае j=0), а если закомментировать строки инициализации индикатора:
// disp.init(); // инициализация
и
// disp.displayInt(j);

то программа запускается, но без индикации.
Буду очень благодарен, если кто-нибудь разберётся в этой проблеме и подскажет мне как её решить.
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,197
1,282
Москва
1) Отредактируйте сообщение применив оформление кода с помощью соотв. тега - < / > . В таком виде смотреть прям нет желания. Многие пройдут мимо и все.
2) Очевидно, что проблема связана с выводом дисплея. Если включить дисплей и подержать кнопку немного дольше, не нажатие сделать и отпускание, а нажать и дождаться работы - будет ли так работать ?
 

SHDmitriy

✩✩✩✩✩✩✩
2 Окт 2022
2
0
@Старик Похабыч
1) Спасибо за замечание по поводу оформления моего вопроса, но честно говоря я впервые общаюсь в форуме (и не только в этом). Во главе копируемого скетча необходимо проставить "/"?
2) При любом нажатии (даже очень долгом) цикл не запускается.