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