Как вставить код для индикатора oled в скетч для шагового мотора

Шаговый мотор работает с регулировкой скорости потенциометром скетч

     Basic example code for controlling a stepper without library

     by Dejan, https://howtomechatronics.com
*/

// defines pins
#define stepPin 2
#define dirPin 5

int customDelay, customDelayMapped;

void setup() {
  // Sets the two pins as Outputs
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
}
void loop() {
  speedControl();
  // Makes pules with custom delay, depending on the Potentiometer, from which the speed of the motor depends
  digitalWrite(stepPin, HIGH);
  delayMicroseconds(customDelayMapped);
  digitalWrite(stepPin, LOW);
  delayMicroseconds(customDelayMapped);
}
// Custom function for reading the potentiometer and mapping its value from 300 to 3000, suitable for the custom delay value in microseconds
void speedControl() {
  customDelay = analogRead(A0); // Read the potentiometer value
  customDelayMapped = map(customDelay, 0, 1023, 300, 3000); // Convert the analog input from 0 to 1024, to 300 to 3000
}

Я попытался добавить код для измерения напряжения на том же входе А0 и индикации его
на OLED.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <MsTimer2.h>
#define OLED_RESET 4
#define MEASURE_PERIOD 1000  // время периода измерения
int timeCount;               // счетчик времени
uint32_t sum;                    // переменные для суммирования кодов АЦП
uint32_t  value;                  // сумма кодов АЦП (среднее значение * 500)
boolean flagReady;           // признак готовности данных измерения
uint16_t  buttonState = 0;
Adafruit_SSD1306 display(OLED_RESET);
uint32_t out;
void timerInterupt() {

  timeCount++;            // +1 счетчик выборок усреднения
  sum += analogRead(A0);  // суммирование кодов АЦП


// проверка числа выборок усреднения
  if (timeCount >= MEASURE_PERIOD) {
    timeCount = 0;
    value = sum;  // перегрузка среднего значения

    sum = 0;

    flagReady = true;  // признак результат измерений готов
  }
}
void setup() {
  Serial.begin(9600);
  MsTimer2::set(1, timerInterupt);  // прерывания по таймеру, период 1 мс
  MsTimer2::start();                // разрешение прерывания
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.clearDisplay(); 
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  display.setCursor(75,10);
  display.setTextSize(2);
  display.clearDisplay();
  display.setTextColor(WHITE);
   out= value/1000;
  display.println(out);
  display.setCursor(10,10);
  display.setTextSize(2);
  display.println("RPM: ");
  display.display();
}

Оба скетча работают по отдельности нормально,но когда я их объединил скорость мотора резко упала

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <MsTimer2.h>
#include <AccelStepper.h>
AccelStepper stepper1(1, 2, 5); 
#define OLED_RESET 4
#define MEASURE_PERIOD 1000  // время периода измерения
int timeCount;               // счетчик времени
uint32_t sum;                    // переменные для суммирования кодов АЦП
uint32_t  value;                  // сумма кодов АЦП (среднее значение * 500)
boolean flagReady;           // признак готовности данных измерения
uint16_t  buttonState = 0;
Adafruit_SSD1306 display(OLED_RESET);
uint32_t out;
void timerInterupt() {

  timeCount++;            // +1 счетчик выборок усреднения
  sum += analogRead(A0);  // суммирование кодов АЦП


// проверка числа выборок усреднения
  if (timeCount >= MEASURE_PERIOD) {
    timeCount = 0;
    value = sum;  // перегрузка среднего значения

    sum = 0;

    flagReady = true;  // признак результат измерений готов
  }
}
void setup() {
  Serial.begin(9600);
   stepper1.setMaxSpeed(1000);
  MsTimer2::set(1, timerInterupt);  // прерывания по таймеру, период 1 мс
  MsTimer2::start();                // разрешение прерывания
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.clearDisplay(); 
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
   stepper1.setSpeed(analogRead(A0));
  // Step the motor with a constant speed previously set by setSpeed();
  stepper1.runSpeed();
  display.setCursor(75,10);
  display.setTextSize(2);
  display.clearDisplay();
  display.setTextColor(WHITE);
   out= value/1000;
  display.println(out);
  display.setCursor(10,10);
  display.setTextSize(2);
  display.println("RPM: ");
  display.display();
}

мотор медленно вращается короткими шажками. Я понимаю что или нельзя использовать в
коде дважды вход А0,или прерывание для АЦП влияет на код шагового мотора. Но как разрешить эту проблему не знаю.
Надеюсь получить помощь.
Спасибо.
Юрий

Хм, а зачем дважды измерять одно и то же? почему нельзя измерить один раз, а потом использовать результат в двух местах?

Что касается замедления кода - работа с дисплеем дело не быстрое, поэтому и мотор спотыкается

Спасибо. Попробую ввести переменную для считывания А0 и потом использовать ее в двух
местах.Но судя по второй части вашего ответа проблема не в этом,а в наличии индикатора
OLED, т. е. решать ее нужно по другому.

Вот вам для затравки:

Посмотрите в код - Вы читаете и усредняете значения с аналогового пина в течении 1000 периодов - а обновляете на экране значительно чаще. Зачем? - ведь значение не изменилось. Вы бессмысленно тратите на это время.
Значение на экране надо обновлять только тогда, когда закончился очередной период усреднения. И делать это только один раз.

Спасибо за подсказку, попробую пойти этим путем.

@b707 поддержу. Ещё добавлю:
Чтение АЦП и работу с экраном нужно вызывать намного реже, например 20-50раз в секунду. Millis поможет.

АЦП и индикация работает нормально,мотор вращается,но с остановками.Период
остановок совпадает с константой для Millis

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
#define stepPin 2
#define dirPin 5
Adafruit_SSD1306 display(OLED_RESET);
unsigned long previousMillis1 = 0;
const long period1 = 1000;
int customDelay, customDelayMapped;
void setup() {
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
}
void speedControl() {
  customDelay = analogRead(A0);
  customDelayMapped = map(customDelay, 0, 1023, 300, 3000);
}

void loop() {
  speedControl();
  digitalWrite(stepPin, HIGH);
  delayMicroseconds(customDelayMapped);
  digitalWrite(stepPin, LOW);
  delayMicroseconds(customDelayMapped);
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis1 >= period1) {
    previousMillis1 = currentMillis;
    display.setCursor(40, 10);
    display.setTextSize(3);
    display.clearDisplay();

    display.setTextColor(WHITE);
    int sensorValue = analogRead(A0);
    float voltage = sensorValue * (5.0 / 1023.0);
    display.println(voltage);
    display.display();
  }
}

А чего же Вы хотите? С таким кодом иначе и быть не может.
Выкидывайте из кода все лишнее.

Вроде все нужно,лишнего нет

Ну, если Вас все устраивает, будем считать, что вопрос решен.

Ирония не ваш конек.

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

Так а что вы хотели? Например я вам написал, что не надо читать аналоговый вход дважды - и что? Исправили вы - нет.
То же самое на тему обновления экрана. Вам сказано, что не надо обновлять его тупо по времени - обновляйте только тогда, когда значение на экране меняется. Это вы тоже проигнорировали.

А раз вы не слушаете даже те советы, что уже дали - никто с новыми и не спешит.

Тем не менее, все-таки напишу еще.
Пока вы работаете с мотором “вручную”, генерируя его импульсы через команды digitalWrite() и операторы delay() - он (мотор) у вас будет “запинаться” всегда.

Код выше несовместим с любым другим процессом в ЛУП, например с записью на экран.

Чтобы мотор работал независимо от других процессов, импульсы должны генерироваться по таймеру или через прерывания. Или возьмите внешний драйвер шагового мотора типа PCA9685 - он все будет делать за вас.

Один только digitalWrite(stepPin); претендует на роль delay();
К прерываниям добавлю ещё: если уж надо быстро дрыгать ногами, то только через регистры PORTx.

А Вы почитайте форум и убедитесь, что большая часть новичков на нем, это как раз 60+.
Вот коллега b707 дал Вам вполне дельные советы, и что в результате?
Понятно, что у него есть опыт, и он дает советы, исходя из своего опыта. У Вас опыта нет, но ведь это не значит, что Вам совершенно не на что опереться. Для начала Вам бы следовало разобраться, как работает Ваша программа. Ну хотя бы оценить, сколько времени занимает работа с экраном. Вы вот вставили в код инициализацию Serial, а не пользуетесь им. Например, можно вставить после 41 строки: Serial.plintln(millis() - currentMillis); и хотя бы получить ответ на этот вопрос. Потом точно так же выяснить, что именно в этом блоке занимает наибольшее время. Ну а дальше вносить изменения в программу на основе полученной информации.

Вот-вот.
Кстати, в проекте, на который я совсем недавно ссылался, все это есть: и шаговые двигатели, и прерывания, и “быстро дрыгать ногами”.

То есть, достаточно просто поискать по форуму.