Управление ШД с клавиатуры и вывод цифровых значений на LCD

Здравствуйте нужен код для такого же точно устройства в видео все описан с подробностями.

Здравствуйте! Я делал проект с управлением матричной клавиатурой ШД и выводом на LCD,очень похожий, не так уж и давно, и вам возможно сделаю, пишите на Email wizard-sen@yandex.ru

Надо купить у автора “такого же точно устройства”, выйдет дешевле.

дороговато получается

Напиши сам. Будет вообще бесплатно.

сделаю за 3тр. fridgetester@mail.ru

А тут нищеброды же сидят, за 500р готовые на тебя 2 дня потратить.

Всем спасибо. Исполнитель найден, скетч готов. Могу сюда выложить мне не жалко


// Задаём параметры системы
#define microstep 16    // Микрошаг двигателя (разделение шага на 16 частей)
#define speedHoming 50  // Скорость движения при поиске нуля
#define speedwork 100   // Рабочая скорость двигателя

#define RAZGON 50         // Ускорение двигателя
#define MAX_distance 6800  // Максимальное расстояние перемещения (мм)
#define MIN_distance 300   // Минимальное расстояние перемещения (мм)

const float diametr = 7.0;  // Диаметр вала двигателя в мм для точных расчетов

// Формула для расчёта шагов:
// шаги = (длинна в мм * шагов на оборот * редукция * микрошаги) / (π * диаметр вала)

#define CON_HOMING 2  // Пин концевика для возврата в ноль D2
#define CON2 3        // Дополнительный концевик D3

// Подключаем необходимые библиотеки
#include <LiquidCrystal_I2C.h>
#include <SimpleKeypad.h>
#include "GyverStepper2.h"

// Инициализируем дисплей и двигатель
LiquidCrystal_I2C lcd(0x3F, 20, 4);                // Дисплей 20x4 SDA A4 / SCL A5 /// 0X27 или 0X3F АДРЕС дисплея если не работает поменять
GStepper2<STEPPER2WIRE> stepper(200, 16, 15, 14);  // Двигатель с тремя проводами A2 STEP, A1 DIR, A0 EN

// Настройки клавиатуры
const byte nb_rows = 4;  // Число строк клавиатуры
const byte nb_cols = 4;  // Число столбцов
char key_chars[nb_rows][nb_cols] = {
  { '1', '2', '3', 'A' },
  { '4', '5', '6', 'B' },
  { '7', '8', '9', 'C' },
  { '*', '0', '#', 'D' }
};

// Переменные для работы
char buffer[10];           // Буфер для ввода чисел
char hom[] = "homing...";  // Сообщение для поиска нуля
uint8_t val = 0;           // Индекс для буфера
int16_t mm = 0;            // Линейное перемещение в мм
bool stop;                 // Флаг остановки

byte rowPins[nb_rows] = { 5, 6, 7, 8 };                                  // The pins where the rows are connected
byte colPins[nb_cols] = { 9, 10, 11, 4 };                                // The pins where the columns are connected
SimpleKeypad kp1((char*)key_chars, rowPins, colPins, nb_rows, nb_cols);  // Инициализация клавиатуры

void setup() {
  Serial.begin(9600);  // Открываем порт для отладки

  // Настраиваем пины концевиков
  pinMode(CON_HOMING, INPUT_PULLUP);
  pinMode(CON2, INPUT_PULLUP);

  // Настраиваем параметры двигателя
  stepper.setMaxSpeed(speedwork * microstep);   // Максимальная скорость
  stepper.setAcceleration(RAZGON * microstep);  // Ускорение

  lcd.init();       // Инициализация дисплея
  lcd.backlight();  // Включение подсветки

  setDisp(0, 0, "old", 0);  // Отображаем "old" на дисплее
  setDisp(0, 1, "new", 0);  // Отображаем "new" на дисплее
  setDisp(4, 0, hom, 0);    // Отображаем "homing..." при старте

  homing();  // Запускаем поиск нуля
}

void loop() {
  stepper.tick();  // Обновляем состояние двигателя

  // Проверяем концевик CON2
  if (!digitalRead(CON2)) {
    stepper.brake();  // Останавливаем двигатель
    stepper.reset();  // Сбрасываем координаты в 0
    stepper.disable();
    stop = true;  // Устанавливаем флаг остановки

    // Очищаем строки дисплея
    clear(4, 12, 0);
    clear(4, 12, 1);

    setDisp(4, 0, "press #", 0);  // Просим нажать "#"
  }

  // Обработка нажатий клавиатуры
  char key = kp1.getKey();
  if (key) {
    Serial.println(key);  // Отладочный вывод

    if (!stop) {
      if (key == '#') {

        stepper.stop();
        setDisp(4, 1, "stop", 0);  // Отображаем "homing..."

      } else if (key == '*') {
        buffer[val] = '\0';  // Завершаем строку

        mm = atoi(buffer);  // Преобразуем строку в число
        mm = mm - MIN_distance;
        if(mm < 0 ) mm = 0;
        // Ограничиваем перемещение
        if (mm > MAX_distance - MIN_distance) mm = MAX_distance - MIN_distance;
        //if (mm < MIN_distance) mm = MIN_distance;

        // Рассчитываем шаги
        float step = (float(mm) * 200 * 1 * microstep) / (3.14 * diametr);

        stepper.setTarget(step);  // Устанавливаем цель перемещения

        // Очищаем и обновляем дисплей
        clear(4, 10, 1);
        clear(4, 10, 0);

        itoa(mm + MIN_distance, buffer, sizeof(buffer));  // Преобразуем число обратно в строку

        Serial.println(buffer);    // Отладочный вывод
        setDisp(4, 0, buffer, 1);  // Отображаем на дисплее
        val = 0;                   // Сбрасываем индекс

        memset(buffer, '\0', sizeof(buffer));  // Очищаем буфер
      } else if (key != '*' || key != '#') {
        if (val < 4) {
          buffer[val] = key;         // Сохраняем нажатую клавишу
          setDisp(4, 1, buffer, 1);  // Отображаем на дисплее
          val++;
        }
      }
    } else {
      if (key == '#') {

        stop = false;           // Снимаем флаг остановки
        setDisp(4, 0, hom, 0);  // Отображаем "homing..."
        stepper.enable();
        homing();  // Запускаем поиск нуля
      }
    }
  }
}

void homing() {
  // Проверяем концевик
  if (digitalRead(CON_HOMING)) {
    stepper.setSpeed(-speedHoming * microstep);  // Назад с заданной скоростью

    while (digitalRead(CON_HOMING)) {
      stepper.tick();  // Крутим двигатель
    }
    stepper.brake();  // Останавливаем двигатель
  }
  stepper.reset();           // Сбрасываем координаты
  clear(4, sizeof(hom), 0);  // Очищаем дисплей
  char buffer2[10];
  itoa(MIN_distance, buffer2, sizeof(buffer2));  // Преобразуем число обратно в строку

  setDisp(4, 0, buffer2, 1);  // Устанавливаем "0"
}

// Очистка строки на дисплее
void clear(uint8_t x, uint8_t val, int y) {
  for (uint8_t i = 0; i < val + x; i++) {
    lcd.setCursor(i + x, y);
    lcd.print(' ');
  }
}

// Отображение текста на дисплее
void setDisp(int x, int y, char* data, bool flag) {
  lcd.setCursor(x, y);
  lcd.print(data);
  if (flag) lcd.print(" mm");
}