Проблема с энкодером

IgOrKiP
Offline
Зарегистрирован: 11.11.2017

Доброго времени суток! Я в программировании новичок и у меня такой вопрос написал скетч для проверки целостности герконов кодовой маски ( датчика положения вала). Принцип действия такой : при повороте энкодера выбераем какую кодовоую маску проверять ( на 8 , 10 или 14 герконов), далее нажимаем кнопку энкодера и запускается двигатель с магнитом на валу, при достижении 1-го геркона двигатель останавливается (выставляется позиция ноль), дальше двигатель перемещается с остановками на против каждого геркона и выводит информацию на дисплей. по окончании проверки возвращаемся в меню выбора кодовой маски. Проблема заключается в том, что энкодер не меняет своё положение при выборе кодовой маски. Если закоментировать оставшуюся часть кода энкодер работает отлично. Я так понимаю что проблема заключается в том что код доходит до кнопки иждёт когда я её нажму, а мне для начала нужно выбрать 1 из 3-х позиций.        // ждем нажатие кнопки                                                                                                                                 while ( D2_Read ) delay_ms(5);  //  вот эта кнопка

 lcd.setCursor(0, 0); 
 lcd.print("POZICIONIROVANIE");
 // делаем шажки пока не упремся в геркон
 while ( !D3_Read +D4_Read + D5_Read  + D6_Read) 
#include <CyberLib.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <RotaryEncoder.h>
#include <Stepper_28BYJ.h>
RotaryEncoder encoder(16,17);                               // аналоговые входы энкодера
LiquidCrystal_I2C lcd(0x3F,16,2);                           // адрес, кол-во символов, кол-во строк
#define ENTER 2                                             // кнопка энкодера
#define PIN_1 3                                             // геркон 1
#define PIN_2 4                                             // геркон 2
#define PIN_4 5                                             // геркон 4
#define PIN_8 6                                             // геркон 8
#define NUM_CYCLES1 8                                       // количество циклов по 45 градусов
#define NUM_CYCLES2 10                                      // количество циклов по 36 градусов
#define NUM_CYCLES3 14                                      // количество циклов по 26 градусов
int result = 1;                                             // переменная позиции энкодера
static int pos = 0;                                         
const int stepsPerRevolution = 4096;                        // количество шагов на один оборот
Stepper_28BYJ myStepper_28BYJ(stepsPerRevolution, 9,10,11,12); 
void setup() 
{
 myStepper_28BYJ.setSpeed(3);                               // скорость двигателя 3 об/мин
 D2_In;                                                     // pinMode(ENTER, INPUT);   
 D2_Inv;                                                    // инвертируем ENTER
 D3_In;                                                     // pinMode(PIN_1, INPUT);
 D4_In;                                                     // pinMode(PIN_2, INPUT);
 D5_In;                                                     // pinMode(PIN_4, INPUT);
 D6_In;                                                     // pinMode(PIN_8, INPUT);
 lcd.init();                                                // инициализация LCD 1602
 lcd.backlight();                                           // включаем подсветку дисплея
 lcd.setCursor(0, 0);                                       // устанавливаем курсор в начало 1-ой строки
 lcd.print("   TECT MACOK   ");                             // выводим надпись в 1-ой строке
 lcd.setCursor(0, 1);                                       // устанавливаем курсор в начало 2-ой строки
 lcd.print("8; 10; 14; OTB-B");                             // выводим надпись в 1-ой строке
 delay_ms(3000);                                            // ждём
}
void loop() 
{ 
  encoder.tick();
 int newPos = encoder.getPosition();
 if (pos < newPos) result++;
 if (pos > newPos) result--;
 if (result > 3) result = 1;
 if (result < 1) result = 3;
 if (pos != newPos) pos = newPos;
 lcd.setCursor(0, 0);
 lcd.print(" Please Select: ");
 if (result == 1) 
{
 lcd.setCursor(0, 1); 
 lcd.print("        8        ");     
}
 if (result == 2)
{
 lcd.setCursor(0, 1); 
 lcd.print("       10       ");     
}
 if (result == 3)
{
 lcd.setCursor(0, 1); 
 lcd.print("       14       ");     
} 
 // ждем нажатие кнопки
 while ( D2_Read ) delay_ms(5);
 lcd.setCursor(0, 0); 
 lcd.print("POZICIONIROVANIE");
 // делаем шажки пока не упремся в геркон
 while ( !D3_Read +D4_Read + D5_Read  + D6_Read) 
{ 
 myStepper_28BYJ.step( 1 );
}
 lcd.setCursor(0, 0);
 lcd.print("     Otvod 1    ");
 lcd.setCursor(0, 1);
 lcd.print("Gerkon=1 ");
 delay_ms(2000);
 switch(result)
{
 case 1:
 for(byte x=0; x<NUM_CYCLES1; x++) 
{
 lcd.setCursor(0, 0);
 lcd.print("     Otvod ");
 lcd.print(x+1);
 lcd.print("    ");  // магнит отправился к X геркону
 lcd.setCursor(0, 1); 
 lcd.print("Gerkon=");
 byte g=(D6_Read*8 + D5_Read*4  + D4_Read*2 + D3_Read);
 lcd.print(g);
 lcd.print("   ");
 myStepper_28BYJ.step( -(long) 45 * stepsPerRevolution / 360 );
 delay_ms(2000);
}
 break;
case 2:
 for(byte x=0; x<NUM_CYCLES2; x++) 
{
 lcd.setCursor(0, 0);
 lcd.print("     Otvod ");
 lcd.print(x+1);
 lcd.print("    ");  // магнит отправился к X геркону
 lcd.setCursor(0, 1); 
 lcd.print("Gerkon=");
 byte g=(D6_Read*8 + D5_Read*4  + D4_Read*2 + D3_Read);
 lcd.print(g);
 lcd.print("   ");
 myStepper_28BYJ.step( -(long) 36 * stepsPerRevolution / 360 );
 delay_ms(2000);
}
 break;
 case 3:
 for(byte x=0; x<NUM_CYCLES3; x++) 
 {
 lcd.setCursor(0, 0);
 lcd.print("     Otvod ");
 lcd.print(x+1);
 lcd.print("    ");  // магнит отправился к X геркону
 lcd.setCursor(0, 1); 
 lcd.print("Gerkon=");
 byte g=(D6_Read*8 + D5_Read*4  + D4_Read*2 + D3_Read);
 lcd.print(g);
 lcd.print("   ");
 myStepper_28BYJ.step( -(long) 26 * stepsPerRevolution / 360 );
 delay_ms(2000);
}
  break;
}

}
 

 

 

IgOrKiP
Offline
Зарегистрирован: 11.11.2017
#include <CyberLib.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <RotaryEncoder.h>
#include <Stepper_28BYJ.h>
RotaryEncoder encoder(16,17);                               // аналоговые входы энкодера
LiquidCrystal_I2C lcd(0x3F,16,2);                           // адрес, кол-во символов, кол-во строк
#define ENTER 2                                             // кнопка энкодера
#define PIN_1 3                                             // геркон 1
#define PIN_2 4                                             // геркон 2
#define PIN_4 5                                             // геркон 4
#define PIN_8 6                                             // геркон 8
#define NUM_CYCLES1 8                                       // количество циклов по 45 градусов
#define NUM_CYCLES2 10                                      // количество циклов по 36 градусов
#define NUM_CYCLES3 14                                      // количество циклов по 26 градусов
int result = 1;                                             // переменная позиции энкодера
static int pos = 0;                                         
const int stepsPerRevolution = 4096;                        // количество шагов на один оборот
Stepper_28BYJ myStepper_28BYJ(stepsPerRevolution, 9,10,11,12); 
void setup() 
{
 myStepper_28BYJ.setSpeed(3);                               // скорость двигателя 3 об/мин
 D2_In;                                                     // pinMode(ENTER, INPUT);   
 D2_Inv;                                                    // инвертируем ENTER
 D3_In;                                                     // pinMode(PIN_1, INPUT);
 D4_In;                                                     // pinMode(PIN_2, INPUT);
 D5_In;                                                     // pinMode(PIN_4, INPUT);
 D6_In;                                                     // pinMode(PIN_8, INPUT);
 lcd.init();                                                // инициализация LCD 1602
 lcd.backlight();                                           // включаем подсветку дисплея
 lcd.setCursor(0, 0);                                       // устанавливаем курсор в начало 1-ой строки
 lcd.print("   TECT MACOK   ");                             // выводим надпись в 1-ой строке
 lcd.setCursor(0, 1);                                       // устанавливаем курсор в начало 2-ой строки
 lcd.print("8; 10; 14; OTB-B");                             // выводим надпись в 1-ой строке
 delay_ms(3000);                                            // ждём
}
void loop() 
{ 
  encoder.tick();
 int newPos = encoder.getPosition();
 if (pos < newPos) result++;
 if (pos > newPos) result--;
 if (result > 3) result = 1;
 if (result < 1) result = 3;
 if (pos != newPos) pos = newPos;
 lcd.setCursor(0, 0);
 lcd.print(" Please Select: ");
 if (result == 1) 
{
 lcd.setCursor(0, 1); 
 lcd.print("        8        ");     
}
 if (result == 2)
{
 lcd.setCursor(0, 1); 
 lcd.print("       10       ");     
}
 if (result == 3)
{
 lcd.setCursor(0, 1); 
 lcd.print("       14       ");     
} 
 // ждем нажатие кнопки
 while ( D2_Read ) delay_ms(5);
 lcd.setCursor(0, 0); 
 lcd.print("POZICIONIROVANIE");
 // делаем шажки пока не упремся в геркон
 while ( !D3_Read +D4_Read + D5_Read  + D6_Read) 
{ 
 myStepper_28BYJ.step( 1 );
}
 lcd.setCursor(0, 0);
 lcd.print("     Otvod 1    ");
 lcd.setCursor(0, 1);
 lcd.print("Gerkon=1 ");
 delay_ms(2000);
 switch(result)
{
 case 1:
 for(byte x=0; x<NUM_CYCLES1; x++) 
{
 lcd.setCursor(0, 0);
 lcd.print("     Otvod ");
 lcd.print(x+1);
 lcd.print("    ");  // магнит отправился к X геркону
 lcd.setCursor(0, 1); 
 lcd.print("Gerkon=");
 byte g=(D6_Read*8 + D5_Read*4  + D4_Read*2 + D3_Read);
 lcd.print(g);
 lcd.print("   ");
 myStepper_28BYJ.step( -(long) 45 * stepsPerRevolution / 360 );
 delay_ms(2000);
}
 break;
case 2:
 for(byte x=0; x<NUM_CYCLES2; x++) 
{
 lcd.setCursor(0, 0);
 lcd.print("     Otvod ");
 lcd.print(x+1);
 lcd.print("    ");  // магнит отправился к X геркону
 lcd.setCursor(0, 1); 
 lcd.print("Gerkon=");
 byte g=(D6_Read*8 + D5_Read*4  + D4_Read*2 + D3_Read);
 lcd.print(g);
 lcd.print("   ");
 myStepper_28BYJ.step( -(long) 36 * stepsPerRevolution / 360 );
 delay_ms(2000);
}
 break;
 case 3:
 for(byte x=0; x<NUM_CYCLES3; x++) 
 {
 lcd.setCursor(0, 0);
 lcd.print("     Otvod ");
 lcd.print(x+1);
 lcd.print("    ");  // магнит отправился к X геркону
 lcd.setCursor(0, 1); 
 lcd.print("Gerkon=");
 byte g=(D6_Read*8 + D5_Read*4  + D4_Read*2 + D3_Read);
 lcd.print(g);
 lcd.print("   ");
 myStepper_28BYJ.step( -(long) 26 * stepsPerRevolution / 360 );
 delay_ms(2000);
}
  break;
}

}