Намоточный станок

timurtanum
Offline
Зарегистрирован: 15.11.2014

добрый вечер всем посетившим . Решил собрать намоточный станок для мелких двигателей . В код программы решил добавить lcd шилд с кнопками . Не могу найти ошику , не могу понять почему кнопки в лево и право не срабатывают . Если кто знает где ошибка и как заставить срабатывать кнопки правильно буду благодарен за помошь . 

заранее спасибо 

 
//23.02.2016
#include <Wire.h> // добавляем необходимые библиотеки
#include <EEPROM.h>
#include <LiquidCrystal.h>
#include "TimerOne.h"
#include <MenuSystem.h>
#include "HID.h"
#include "Keyboard.h"
#define FULLTURN1 360/1.8*16 //full turn per steps drive1
#define FULLTURN2 360/1.8*32 //full turn per steps drive2
#define STEP_PER_MM FULLTURN2 / 0.8 //шагов на мм для шпильки M5

#define d1  1 //для указания направления
#define d2  -1

const int sd1d = 9;              // pin for dir steps drive 1
const int sd1 = 10;              // pin for step steps drive 1
const int sd2d = 11 ;            // pin for dir steps drive 2
const int sd2 = 12;              // pin for step steps drive 2


LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); //init LCD display, pins 1,2,3,4,5


#define KEY_ESC
#define KEY_UP_ARROW    
#define KEY_DOWN_ARROW    
#define KEY_LEFT_ARROW    
#define KEY_RIGHT_ARROW 

float WIRED = 0.3; //default wire diameter, mm
float WINDOW = 30; //default window, mm
int COILS = 200;   //default coils
int spd = 200;     //default step motor delay
int steps1 = 0;    //счетчик шагов
int steps2 = 0;    //счетчик шагов для второго шд
int count_coils = 0; // счетчик витков
int count_coilspw = 0; //счетчик на заполнение окна
int STEP_PER_COIL = 0;

int dir = 1;
int flag_i = 0; //для мотора на прерываниях то 1 выдаем то 0
int motor_on = 0; //вкл./выкл. мотор намотки
int buttonValue = 0;
char k;

//menu
MenuSystem ms;
Menu mm("------Menu------");
MenuItem mm_mi1("Calibration");
MenuItem mm_mi2("Diagnostic");
MenuItem mm_mi3("Wired");
MenuItem mm_mi4("Window");
MenuItem mm_mi5("Coils");
MenuItem mm_mi6("Direction");
MenuItem mm_mi7("Run");



void setup()
{
  lcd.begin(16, 2);
  pinMode(sd1, OUTPUT);
  pinMode(sd2, OUTPUT);
  pinMode(sd1d, OUTPUT);
  pinMode(sd2d, OUTPUT);
  pinMode(0, INPUT_PULLUP);
  //Keyboard.begin();

  //возвращаем параметры из eeprom
  float WIRED_EEPROM = 0;
  WIRED_EEPROM = EEPROM_float_read(0);
  if ((WIRED_EEPROM >= 0.2) && (WIRED_EEPROM <= 0.6))
  {
    WIRED = WIRED_EEPROM;
  }

  float WINDOW_EEPROM = 0;
  WINDOW_EEPROM = EEPROM_float_read(4);
  if ((WINDOW_EEPROM >= 0.5) && (WINDOW_EEPROM <= 150))
  {
    WINDOW =  WINDOW_EEPROM;
  }

  int COILS_EEPROM = 0;
  COILS_EEPROM = EEPROM_int_read(8);
  if ((COILS_EEPROM >= 10) && (COILS_EEPROM <= 5000))
  {
    COILS = COILS_EEPROM;
  }

  int DIR_EEPROM = 0;
  COILS_EEPROM = EEPROM_int_read(12);
  if ((DIR_EEPROM == 1) || (DIR_EEPROM == -1))
  {
    dir = DIR_EEPROM;
  }

  mm.add_item(&mm_mi1, &Calibration);
  mm.add_item(&mm_mi2, &Diagnostic);
  mm.add_item(&mm_mi3, &Wired);
  mm.add_item(&mm_mi4, &Window);
  mm.add_item(&mm_mi5, &Coils);
  mm.add_item(&mm_mi6, &Direction);
  mm.add_item(&mm_mi7, &Runing);
  //mm.add_item(&mm_mi6, &day_setup_selected);
  ms.set_root_menu(&mm);

  //инициалищируем таймер
  Timer1.initialize(100000); // set a timer of length 100000 microseconds (or 0.1 sec - or 10Hz => the led will blink 5 times, 5 cycles of on-a
  //Timer1.attachInterrupt( timerIsr ); // прикрепить подпрограмму обслуживания здесь
  hello();
}  // setup()...



void loop()
{
  menu();  
} //loop()...



void MenuSystem() {
  lcd.setCursor(0, 0);
  lcd.clear();
  // Display the menu
  Menu const* cp_menu = ms.get_current_menu();

  lcd.print("menu name:");
  lcd.print(cp_menu->get_name());
  lcd.setCursor(0, 1);
  lcd.print(cp_menu->get_selected()->get_name());
  delay(500);

}
char KEY()
{
  
  int KEY = analogRead (0);
  //debug
  lcd.setCursor(10, 1);

  //right
  if (KEY < 100)
  {
    return 'r';            //right   'r';
  }
  //up
  if (KEY < 200)
  {
    return 'u';           //up    'u';
  }
  //down
  if (KEY < 400)
  {
    return 'd';           //down  'd';
  }
  //left
  if (KEY < 600)
  {
    return 'l';           //left   'l';

  }
  //SELECT
  if (KEY < 800)
  {
    return 'e';           //Enter  'e';
  }


  return 0;
}

void hello() {
  
  lcd.setCursor(0, 0);
  lcd.print(F("Winding machine"));
}

void menu() {

  k = KEY();
  switch (k) {
    case 'c':         //Esc/Cancel    'c';
      ms.back();
      hello();
      break;

    case 'u':        //up    'u';
      ms.prev();
      MenuSystem();
      break;
    
    case 'd':       //down  'd';
      ms.next();
      MenuSystem();
      break;
      
    case 'e':      //Enter  'e';
      ms.select();
      MenuSystem();
      break;
  }
}


void Calibration(MenuItem* p_menu_item) {
  lcd.setCursor(0, 0);
  lcd.print(F("Calibration mode"));

  delay(30);
  while (k != 'c')       //Esc/Cancel    'c';
  {
    if (k == 'd')         //down  'd';

    {
      spd = 1500;
      step(sd1, -16);
    }
    
    if (k == 'u')       //up    'u';
    
    {
      spd = 1500;
      step(sd1, 16);
    }
    if (k == 'r')       //right   'r';
    {
      spd = 80;
      step(sd2, 16);
    }
    if (k == 'l')       //left   'l';

    {
      spd = 80;
      step(sd2, -16);
    }

  }
}

void Diagnostic(MenuItem* p_menu_item) 
{
  
  lcd.setCursor(0, 0);
  lcd.print(F("Diagnostic mode"));
   
  while (k != 'c')       //Esc/Cancel    'c';
  {
    if (k == 'd')
    {
      spd = 200;
      step(sd1, FULLTURN1 * -1);
    }
    if (k == 'u')
    {
      spd = 200;
      step(sd1, FULLTURN1);
    }
    if (k == 'r')
    {
      spd = 50;
      int i = 0;
      while (i != 43)
      {
        step(sd2, STEP_PER_MM);
        i++;
      }
    }

    if (k == 'l')
    {
      spd = 50;
      step(sd2, FULLTURN2 * -1);
    }
    }
    }

void Wired(MenuItem* p_menu_item)
{
  while (k != 'c')
  {
    lcd.setCursor(0, 1);
    lcd.print("Wired:");
    lcd.print(WIRED, 2);
    lcd.print(" < ");
    if (k == 'l') {
      if (WIRED > 0.2)
      {
        WIRED = WIRED - 0.01;
        delay(100);
      }
    }
    if (k == 'r')
    {
      if (WIRED < 0.6)
      {
        WIRED = WIRED + 0.01;
        delay(100);
      }
    }
    if (k == 'e')
    {
      EEPROM_float_write(0, WIRED);
      lcd.print(" OK");
      delay(100);
    }
  }
}

void Window(MenuItem* p_menu_item)
{
  while (k != 'c')
  {
    lcd.setCursor(0, 1);
    lcd.print("Window:");
    lcd.print(WINDOW, 1);
    lcd.print(" < ");
    delay(20);
    if (k == 'l')
    {
      if (WINDOW > 0.5)
      {
        WINDOW = WINDOW - 0.5;
        delay(100);
      }
    }
    if (k == 'r')
    {
      if (WINDOW < 150)
      {
        WINDOW = WINDOW + 0.5;
        delay(100);
      }
    }
    if (k == 'e')
    {
      EEPROM_float_write(4, WINDOW);
      lcd.print("OK");
      delay(100);
    }

  }

}
void Coils(MenuItem* p_menu_item)
{
  while (k != 'c')
  {
    lcd.setCursor(0, 1);
    lcd.print("Coils:");
    lcd.print(COILS);
    lcd.print(" < ");
    delay(200);
    if (k == 'l')
    {
      if (COILS > 10)
      {
        COILS = COILS - 1;
        delay(60);
      }
    }
    if (k == 'r')
    {
      if (COILS < 5000)
      {
        COILS = COILS + 1;
        delay(60);
      }
    }
    if (k == 'u') {
      if (COILS < 4900) {
        COILS = COILS + 100;
        delay(60);
      }
    }
    if (k == 'd') {
      if (COILS > 100) {
        COILS = COILS - 100;
        delay(60);
      }
    }

    if (k == 'e') {
      EEPROM_int_write(8, COILS);
      lcd.print("OK");
      delay(100);
    }
  }
}

void Runing(MenuItem* p_menu_item) {
  count_coils = 0;
  int COILSPW = WINDOW / WIRED; //сколько витков помещается в окошке
  STEP_PER_COIL = STEP_PER_MM * WIRED; //расчитываем кол-во шагов на виток

  lcd.setCursor(0, 0);
  lcd.print("Wir:");
  lcd.print(WIRED);
  lcd.print(" W:");
  lcd.print(WINDOW, 1);

  lcd.setCursor(14, 1);
  lcd.print(COILSPW);
  float Tpercent = 0;
  int stepsNado = 0;
  int s = 0;
  byte stat = 0;
  spd = 600;
  digitalWrite(sd1d, LOW); //вот выбрали направление
  motor_on = 1;            //и идем

  long ttt = 0;

  lcd.setCursor(0, 1);
  lcd.print("C:");

  while (count_coils <= COILS) {
    delayMicroseconds(spd);
    if (motor_on == 1) { //что-нибудь делаем, если только motor_on
      if (flag_i == 0) {
        digitalWrite(sd1, HIGH);
        flag_i = 1;
      } else {
        digitalWrite(sd1, LOW);
        flag_i = 0;
        steps1++; //счетчик шагов
      }

      Tpercent = float(steps1) / float(FULLTURN1);
      stepsNado = Tpercent * STEP_PER_COIL;
      s = stepsNado - steps2;

      steps2 = stepsNado;
      step(sd2, dir * s);

      if (steps1 == FULLTURN1) {
        count_coils++;
        count_coilspw++;
        steps1 = 0;
        steps2 = 0;
        lcd.setCursor(2, 1);
        lcd.print(count_coils);
        lcd.print("/");
        lcd.print(COILS);
        lcd.print(" ");
        lcd.print(COILSPW);

        if (dir > 0) {
          lcd.print(" >");
        } else {
          lcd.print(" <");
        }

        if (count_coilspw == COILSPW) {
          if (dir == d1) {
            dir = d2;
          } else {
            dir = d1; //меняем направление
          }
          count_coilspw = 0;
          spd = 600;
          pause(); //пауза
        }


      } else {
        delayMicroseconds(100);

      }
    }

    if (k == 'e')
    {
      if (pause()) {
        return;
      }
    }
  }
  motor_on = 0;            //стоп машина

}

byte pause() {
  motor_on = 0;
  delay(300);
  int cnt = 0;
  int flag = 0;

  while (k != 'e') {

    lcd.setCursor(15, 1);
    if (flag) {
      lcd.print(" ");
    } else {
      lcd.print("P");
    }

    if (cnt < 100) {
      cnt++;
    } else {
      cnt = 0;
      if (flag) {
        flag = 0;
      } else {
        flag = 1;
      }
    }

    delay(10);
    if (k == 'c') {
      return 1;
    }
  }
  motor_on = 1;
  lcd.setCursor(15, 1);
  lcd.print(" ");
  delay(200);
  return 0;
}

void Direction(MenuItem * p_menu_item) {

  while (k != 'c') {
    lcd.setCursor(0, 1);
    lcd.print("Dir.:");
    if (dir > 0) {
      lcd.print(" >");
    } else {
      lcd.print(" <");
    }
    lcd.print(" < ");
    delay(200);
    if (k == 'l') {
      dir = 1;
      delay(200);
    }
    if (k == 'r') {
      dir = -1;
      delay(200);
    }
    if (k == 'e') {
      EEPROM_int_write(12, dir);
      lcd.print("OK");
      delay(100);
    }
  }

}

void step(int drive, int steps) {
  int sdir;
  int dirval;

  if (steps < 0 ) {
    steps = abs(steps);
    dirval = HIGH;
  } else {
    dirval = LOW;
  }

  if (drive == sd1) {
    sdir = sd1d;
  }
  if (drive == sd2) {
    sdir = sd2d;
  }

  digitalWrite(sdir, dirval);

  while (steps != 0 ) {
    delayMicroseconds(spd);
    digitalWrite(drive, HIGH);
    delayMicroseconds(spd);
    digitalWrite(drive, LOW);
    steps--;
  }

}


void EEPROM_float_write(int addr, float val) // запись в ЕЕПРОМ
{
  byte *x = (byte *)&val;
  for (byte i = 0; i < 4; i++) EEPROM.write(i + addr, x[i]);
}

float EEPROM_float_read(int addr) // чтение из ЕЕПРОМ
{
  byte x[4];
  for (byte i = 0; i < 4; i++) x[i] = EEPROM.read(i + addr);
  float *y = (float *)&x;
  return y[0];
}

void EEPROM_int_write(int p_address, int p_value)
{
  byte lowByte = ((p_value >> 0) & 0xFF);
  byte highByte = ((p_value >> 8) & 0xFF);

  EEPROM.write(p_address, lowByte);
  EEPROM.write(p_address + 1, highByte);
}

unsigned int EEPROM_int_read(int p_address)
{
  byte lowByte = EEPROM.read(p_address);
  byte highByte = EEPROM.read(p_address + 1);
  return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

шыпко не разбирался, но 9-й пин используется и для кнопки и для lcd, а этта неправильно. 

timurtanum
Offline
Зарегистрирован: 15.11.2014

DetSimen пишет:

шыпко не разбирался, но 9-й пин используется и для кнопки и для lcd, а этта неправильно. 

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

kalapanga
Offline
Зарегистрирован: 23.10.2016

Так а у Вас и нет каких-либо действий на эти кнопки. Смотрите Вашу функцию menu(), разве там есть что-то про влево и вправо? Контроллер сам о Ваших желаниях не догадается :)

timurtanum
Offline
Зарегистрирован: 15.11.2014

kalapanga пишет:

Так а у Вас и нет каких-либо действий на эти кнопки. Смотрите Вашу функцию menu(), разве там есть что-то про влево и вправо? Контроллер сам о Ваших желаниях не догадается :)

Я правильно вас понимаю ? в этом заголовке надо вписать функуи. влево и вправо : 

181 void menu() {
182  
183   k = KEY();
184   switch (k) {
185     case 'c':         //Esc/Cancel    'c';
186       ms.back();
187       hello();
188       break;
189  
190     case 'u':        //up    'u';
191       ms.prev();
192       MenuSystem();
193       break;
194     
195     case 'd':       //down  'd';
196       ms.next();
197       MenuSystem();
198       break;
199       
200     case 'e':      //Enter  'e';
201       ms.select();
202       MenuSystem();
203       break;
204   }
205 }

в библеотеке я не нашел таких функций #include <MenuSystem.h>

timurtanum
Offline
Зарегистрирован: 15.11.2014

timurtanum]</p> <p>[quote=kalapanga пишет:

Так а у Вас и нет каких-либо действий на эти кнопки. Смотрите Вашу функцию menu(), разве там есть что-то про влево и вправо? Контроллер сам о Ваших желаниях не догадается :)

посоветуйте какую библеотеку использовать для меню и ардуино lcd шилда с кнопками . Заранее спасибо 

kalapanga
Offline
Зарегистрирован: 23.10.2016

У Вас тут много ошибок. Кнопка считывается в функции KEY() и значение возвращается в виде одного из символов - r u d l e. А в функции menu() есть проверка на c u d e. 'c' откуда возьмётся? Не может у Вас такого значения быть. А 'l' вообще не проверяется. 'c' ещё и в скетче в других функциях проверяется, значит и они у Вас не работают. Исправляйте.

У Вас кнопки используются двояко. Во-первых, для навигации по меню, во-вторых, уже где-то по ходу работы. И что по этим кнопкам должно делаться - только Вы знаете. Может в меню они Вам и не нужны?

Библиотек не подскажу. А чем Вас то, что есть не устраивает? 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

timurtanum пишет:
посоветуйте какую библеотеку использовать для меню и ардуино lcd шилда с кнопками . Заранее спасибо
У Вас основная программа эгоистична. И на деле мешает работе всего остального, а тем более работе с меню.

timurtanum
Offline
Зарегистрирован: 15.11.2014

qwone пишет:

timurtanum пишет:
посоветуйте какую библеотеку использовать для меню и ардуино lcd шилда с кнопками . Заранее спасибо
У Вас основная программа эгоистична. И на деле мешает работе всего остального, а тем более работе с меню.

 

Основная программа и не моя . я решил собрать станок и взял материал из интеренета , так как я не умею прогромировать ! Попытался самостоятельно устранить ошибки  , но особо не получатся! Вот решиз задать вопрос по поводу прошивки , чтобы люди которые понимают этот код подсказали мне где эти ошибки и как заставить работать этот код правильно  

 

timurtanum
Offline
Зарегистрирован: 15.11.2014
//23.02.2016

#include <EEPROM.h>
#include <LiquidCrystal.h>
#include "TimerOne.h"
#include <MenuSystem.h>
#define FULLTURN1 360/1.8*16 //full turn per steps drive1
#define FULLTURN2 360/1.8*32 //full turn per steps drive2
#define STEP_PER_MM FULLTURN2 / 0.8 //шагов на мм для шпильки M5

#define d1  1 //для указания направления
#define d2  -1

const int sd1d = 13;              // pin for dir steps drive 1
const int sd1 = 10;              // pin for step steps drive 1
const int sd2d = 11 ;            // pin for dir steps drive 2
const int sd2 = 12;              // pin for step steps drive 2


LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); //init LCD display, pins 1,2,3,4,5

float WIRED = 0.3; //default wire diameter, mm
float WINDOW = 30; //default window, mm
int COILS = 200;   //default coils
int spd = 200;     //default step motor delay
int steps1 = 0;    //счетчик шагов
int steps2 = 0;    //счетчик шагов для второго шд
int count_coils = 0; // счетчик витков
int count_coilspw = 0; //счетчик на заполнение окна
int STEP_PER_COIL = 0;

int dir = 1;
int flag_i = 0; //для мотора на прерываниях то 1 выдаем то 0
int motor_on = 0; //вкл./выкл. мотор намотки
int KEY ;

//menu
MenuSystem ms;
Menu mm("------Menu------");
MenuItem mm_mi1("Calibration");
MenuItem mm_mi2("Diagnostic");
MenuItem mm_mi3("Wired");
MenuItem mm_mi4("Window");
MenuItem mm_mi5("Coils");
MenuItem mm_mi6("Direction");
MenuItem mm_mi7("Run");



void setup()
{
  lcd.begin(16, 2);
  pinMode(sd1, OUTPUT);
  pinMode(sd2, OUTPUT);
  pinMode(sd1d, OUTPUT);
  pinMode(sd2d, OUTPUT);
  pinMode(0, INPUT);
  

  //возвращаем параметры из eeprom
  float WIRED_EEPROM = 0;
  WIRED_EEPROM = EEPROM_float_read(0);
  if ((WIRED_EEPROM >= 0.2) && (WIRED_EEPROM <= 0.6))
  {
    WIRED = WIRED_EEPROM;
  }

  float WINDOW_EEPROM = 0;
  WINDOW_EEPROM = EEPROM_float_read(4);
  if ((WINDOW_EEPROM >= 0.5) && (WINDOW_EEPROM <= 150))
  {
    WINDOW =  WINDOW_EEPROM;
  }

  int COILS_EEPROM = 0;
  COILS_EEPROM = EEPROM_int_read(8);
  if ((COILS_EEPROM >= 10) && (COILS_EEPROM <= 5000))
  {
    COILS = COILS_EEPROM;
  }

  int DIR_EEPROM = 0;
  COILS_EEPROM = EEPROM_int_read(12);
  if ((DIR_EEPROM == 1) || (DIR_EEPROM == -1))
  {
    dir = DIR_EEPROM;
  }

  mm.add_item(&mm_mi1, &Calibration);
  mm.add_item(&mm_mi2, &Diagnostic);
  mm.add_item(&mm_mi3, &Wired);
  mm.add_item(&mm_mi4, &Window);
  mm.add_item(&mm_mi5, &Coils);
  mm.add_item(&mm_mi6, &Direction);
  mm.add_item(&mm_mi7, &Runing);
  //mm.add_item(&mm_mi6, &day_setup_selected);
  ms.set_root_menu(&mm);

  //инициалищируем таймер
  Timer1.initialize(100000); // set a timer of length 100000 microseconds (or 0.1 sec - or 10Hz => the led will blink 5 times, 5 cycles of on-a
  //Timer1.attachInterrupt( timerIsr ); // прикрепить подпрограмму обслуживания здесь
  hello();
}  // setup()...



void loop()
{
 // menu();  
} //loop()...



void MenuSystem() {
  lcd.setCursor(0, 0);
  lcd.clear();
  // Display the menu
  Menu const* cp_menu = ms.get_current_menu();

  lcd.print("menu name:");
  lcd.print(cp_menu->get_name());
  lcd.setCursor(0, 1);
  lcd.print(cp_menu->get_selected()->get_name());
  delay(500);

  
  int KEY = analogRead (0);
  //debug
  lcd.setCursor(10, 1);

  //right
  if (KEY < 100)
  {
    return 'r';            //right   'r';
  }
  //up
  if (KEY < 200)
  {
    return 'u';           //up    'u';
  }
  //down
  if (KEY < 400)
  {
    return 'd';           //down  'd';
  }
  //left
  if (KEY < 600)
  {
    return 'l';           //left   'l';

  }
  //SELECT
  if (KEY < 800)
  {
    return 'e';           //Enter  'e';
  }


  return 0;
}

void hello() {
  
  lcd.setCursor(0, 0);
  lcd.print(F("Winding machine"));
}




void Calibration(MenuItem* p_menu_item) {
  lcd.setCursor(0, 0);
  lcd.print(F("Calibration mode"));

  delay(30);
  while (KEY != 'c')       //Esc/Cancel    'c';
  {
    if (KEY == 'd')         //down  'd';

    {
      spd = 1500;
      step(sd1, -16);
    }
    
    if (KEY == 'u')       //up    'u';
    
    {
      spd = 1500;
      step(sd1, 16);
    }
    if (KEY == 'r')       //right   'r';
    {
      spd = 80;
      step(sd2, 16);
    }
    if (KEY == 'l')       //left   'l';

    {
      spd = 80;
      step(sd2, -16);
    }

  }
}

void Diagnostic(MenuItem* p_menu_item) 
{
  
  lcd.setCursor(0, 0);
  lcd.print(F("Diagnostic mode"));
   
  while (KEY != 'c')       //Esc/Cancel    'c';
  {
    if (KEY == 'd')
    {
      spd = 200;
      step(sd1, FULLTURN1 * -1);
    }
    if (KEY == 'u')
    {
      spd = 200;
      step(sd1, FULLTURN1);
    }
    if (KEY == 'r')
    {
      spd = 50;
      int i = 0;
      while (i != 43)
      {
        step(sd2, STEP_PER_MM);
        i++;
      }
    }

    if (KEY == 'l')
    {
      spd = 50;
      step(sd2, FULLTURN2 * -1);
    }
    }
    }

void Wired(MenuItem* p_menu_item)
{
  while (KEY != 'c')
  {
    lcd.setCursor(0, 1);
    lcd.print("Wired:");
    lcd.print(WIRED, 2);
    lcd.print(" < ");
    if (KEY == 'l') {
      if (WIRED > 0.2)
      {
        WIRED = WIRED - 0.01;
        delay(100);
      }
    }
    if (KEY == 'r')
    {
      if (WIRED < 0.6)
      {
        WIRED = WIRED + 0.01;
        delay(100);
      }
    }
    if (KEY == 'e')
    {
      EEPROM_float_write(0, WIRED);
      lcd.print(" OK");
      delay(100);
    }
  }
}

void Window(MenuItem* p_menu_item)
{
  while (KEY != 'c')
  {
    lcd.setCursor(0, 1);
    lcd.print("Window:");
    lcd.print(WINDOW, 1);
    lcd.print(" < ");
    delay(20);
    if (KEY == 'l')
    {
      if (WINDOW > 0.5)
      {
        WINDOW = WINDOW - 0.5;
        delay(100);
      }
    }
    if (KEY == 'r')
    {
      if (WINDOW < 150)
      {
        WINDOW = WINDOW + 0.5;
        delay(100);
      }
    }
    if (KEY == 'e')
    {
      EEPROM_float_write(4, WINDOW);
      lcd.print("OK");
      delay(100);
    }

  }

}
void Coils(MenuItem* p_menu_item)
{
  while (KEY != 'c')
  {
    lcd.setCursor(0, 1);
    lcd.print("Coils:");
    lcd.print(COILS);
    lcd.print(" < ");
    delay(200);
    if (KEY == 'l')
    {
      if (COILS > 10)
      {
        COILS = COILS - 1;
        delay(60);
      }
    }
    if (KEY == 'r')
    {
      if (COILS < 5000)
      {
        COILS = COILS + 1;
        delay(60);
      }
    }
    if (KEY == 'u') {
      if (COILS < 4900) {
        COILS = COILS + 100;
        delay(60);
      }
    }
    if (KEY == 'd') {
      if (COILS > 100) {
        COILS = COILS - 100;
        delay(60);
      }
    }

    if (KEY == 'e') {
      EEPROM_int_write(8, COILS);
      lcd.print("OK");
      delay(100);
    }
  }
}

void Runing(MenuItem* p_menu_item) {
  count_coils = 0;
  int COILSPW = WINDOW / WIRED; //сколько витков помещается в окошке
  STEP_PER_COIL = STEP_PER_MM * WIRED; //расчитываем кол-во шагов на виток

  lcd.setCursor(0, 0);
  lcd.print("Wir:");
  lcd.print(WIRED);
  lcd.print(" W:");
  lcd.print(WINDOW, 1);

  lcd.setCursor(14, 1);
  lcd.print(COILSPW);
  float Tpercent = 0;
  int stepsNado = 0;
  int s = 0;
  byte stat = 0;
  spd = 600;
  digitalWrite(sd1d, LOW); //вот выбрали направление
  motor_on = 1;            //и идем

  long ttt = 0;

  lcd.setCursor(0, 1);
  lcd.print("C:");

  while (count_coils <= COILS) {
    delayMicroseconds(spd);
    if (motor_on == 1) { //что-нибудь делаем, если только motor_on
      if (flag_i == 0) {
        digitalWrite(sd1, HIGH);
        flag_i = 1;
      } else {
        digitalWrite(sd1, LOW);
        flag_i = 0;
        steps1++; //счетчик шагов
      }

      Tpercent = float(steps1) / float(FULLTURN1);
      stepsNado = Tpercent * STEP_PER_COIL;
      s = stepsNado - steps2;

      steps2 = stepsNado;
      step(sd2, dir * s);

      if (steps1 == FULLTURN1) {
        count_coils++;
        count_coilspw++;
        steps1 = 0;
        steps2 = 0;
        lcd.setCursor(2, 1);
        lcd.print(count_coils);
        lcd.print("/");
        lcd.print(COILS);
        lcd.print(" ");
        lcd.print(COILSPW);

        if (dir > 0) {
          lcd.print(" >");
        } else {
          lcd.print(" <");
        }

        if (count_coilspw == COILSPW) {
          if (dir == d1) {
            dir = d2;
          } else {
            dir = d1; //меняем направление
          }
          count_coilspw = 0;
          spd = 600;
          pause(); //пауза
        }


      } else {
        delayMicroseconds(100);

      }
    }

    if (KEY == 'e')
    {
      if (pause()) {
        return;
      }
    }
  }
  motor_on = 0;            //стоп машина

}

byte pause() {
  motor_on = 0;
  delay(300);
  int cnt = 0;
  int flag = 0;

  while (KEY != 'e') {

    lcd.setCursor(15, 1);
    if (flag) {
      lcd.print(" ");
    } else {
      lcd.print("P");
    }

    if (cnt < 100) {
      cnt++;
    } else {
      cnt = 0;
      if (flag) {
        flag = 0;
      } else {
        flag = 1;
      }
    }

    delay(10);
    if (KEY == 'c') {
      return 1;
    }
  }
  motor_on = 1;
  lcd.setCursor(15, 1);
  lcd.print(" ");
  delay(200);
  return 0;
}

void Direction(MenuItem * p_menu_item) {

  while (KEY != 'c') {
    lcd.setCursor(0, 1);
    lcd.print("Dir.:");
    if (dir > 0) {
      lcd.print(" >");
    } else {
      lcd.print(" <");
    }
    lcd.print(" < ");
    delay(200);
    if (KEY == 'l') {
      dir = 1;
      delay(200);
    }
    if (KEY == 'r') {
      dir = -1;
      delay(200);
    }
    if (KEY == 'e') {
      EEPROM_int_write(12, dir);
      lcd.print("OK");
      delay(100);
    }
  }

}

void step(int drive, int steps) {
  int sdir;
  int dirval;

  if (steps < 0 ) {
    steps = abs(steps);
    dirval = HIGH;
  } else {
    dirval = LOW;
  }

  if (drive == sd1) {
    sdir = sd1d;
  }
  if (drive == sd2) {
    sdir = sd2d;
  }

  digitalWrite(sdir, dirval);

  while (steps != 0 ) {
    delayMicroseconds(spd);
    digitalWrite(drive, HIGH);
    delayMicroseconds(spd);
    digitalWrite(drive, LOW);
    steps--;
  }

}


void EEPROM_float_write(int addr, float val) // запись в ЕЕПРОМ
{
  byte *x = (byte *)&val;
  for (byte i = 0; i < 4; i++) EEPROM.write(i + addr, x[i]);
}

float EEPROM_float_read(int addr) // чтение из ЕЕПРОМ
{
  byte x[4];
  for (byte i = 0; i < 4; i++) x[i] = EEPROM.read(i + addr);
  float *y = (float *)&x;
  return y[0];
}

void EEPROM_int_write(int p_address, int p_value)
{
  byte lowByte = ((p_value >> 0) & 0xFF);
  byte highByte = ((p_value >> 8) & 0xFF);

  EEPROM.write(p_address, lowByte);
  EEPROM.write(p_address + 1, highByte);
}

unsigned int EEPROM_int_read(int p_address)
{
  byte lowByte = EEPROM.read(p_address);
  byte highByte = EEPROM.read(p_address + 1);
  return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}

kalapanga пишет:

У Вас тут много ошибок. Кнопка считывается в функции KEY() и значение возвращается в виде одного из символов - r u d l e. А в функции menu() есть проверка на c u d e. 'c' откуда возьмётся? Не может у Вас такого значения быть. А 'l' вообще не проверяется. 'c' ещё и в скетче в других функциях проверяется, значит и они у Вас не работают. Исправляйте.

У Вас кнопки используются двояко. Во-первых, для навигации по меню, во-вторых, уже где-то по ходу работы. И что по этим кнопкам должно делаться - только Вы знаете. Может в меню они Вам и не нужны?

Библиотек не подскажу. А чем Вас то, что есть не устраивает? 

kalapanga
Offline
Зарегистрирован: 23.10.2016

timurtanum пишет:

Основная программа и не моя . я решил собрать станок и взял материал из интеренета , так как я не умею прогромировать ! Попытался самостоятельно устранить ошибки  , но особо не получатся!

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

b707
Offline
Зарегистрирован: 26.05.2017

timurtanum пишет:

Вот решиз задать вопрос по поводу прошивки , чтобы люди которые понимают этот код подсказали мне где эти ошибки и как заставить работать этот код правильно  

 

в сообщении #6 kalapanga вам подсказал для начала самые очевидные ошибки. Попробуйте исправить сначала эти - и посмотрите, как изменится работа кода.

timurtanum
Offline
Зарегистрирован: 15.11.2014

b707 пишет:

timurtanum пишет:

Вот решиз задать вопрос по поводу прошивки , чтобы люди которые понимают этот код подсказали мне где эти ошибки и как заставить работать этот код правильно  

 

в сообщении #6 kalapanga вам подсказал для начала самые очевидные ошибки. Попробуйте исправить сначала эти - и посмотрите, как изменится работа кода.

Возможно мои исправления не совсем и верны . вы просмотрели исправленный код последний ? 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Если Вы о коде в сообщении #9, то всё стало ещё хуже. Вы намешали строчки программы по совершенно непонятной логике. А программа Ваша теперь вообще ничего не делает кроме каких-то начальных установок. Вы этого не заметили?

Ну сложна эта задача для Вас, начинайте с элементарных примеров!