меню без древа но с тремя перемнными

maxvalin
Offline
Зарегистрирован: 22.02.2016

вечер добрый учасникам, постигаю азы ардуино ну и соответственно есть вопрос с привязыванием кнопок к переменным на одном экране:

имеется наброски меню с одним экраном, (никаких древовидных переходов) и а на этом экране нужно изменять 3 перемнные с помощью энкодера и двух кнопок.

Не обращайте внимание на транслит и возможно лишние строки, это всего лишь набросок. Многое еще хочу добавить но пока что вопрос с изменением трех переменных. Конкретно надо чтоб нажатием кнопок переходить между этими переменными а энкодером изменят значения. находил на форуме работу энкодера- взял как приемливый образец: #define ENCODER_DO_NOT_USE_INTERRUPTS

да и вообще создание меню отдаленно мне почему то напоминает таблицу пифагора... не знаю, но вот эти все условия как бы говорят что точка пересечения X и Y и есть цель команды одного if

[code]

#define ENCODER_DO_NOT_USE_INTERRUPTS // без прерываний.
#include <Encoder.h>
  

 // переменные
byte vozduh = 0; //переменная для двигателя 12в (0-255) 
int podazh = 0; // здесь будут шаги nema 17
boolean alarm = 0; // переменная для включения аварии либо 1 либо 0
long old_pos = 0; // старая позиция для энкодера
int stroka = 0;// переменная номера строчек меню - вот ее пробовал сделать чтоб между строками переходить.
                         
                  здесь кнопочки
      Encoder Enc_1(31, 33); //кнопки энкодера
      int enter = 41; // кнопка стопа на плате
      int enterEnk = 35; // кнопка на энкодере

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

и дальше собственно обработка самих входов:
//обработка кнопок выбора строки меню
  
  // перход на следующую переменную
  if (digitalRead(enter)== HIGH)
  {
  stroka++;// следующая переменная с верху в низ
  if (stroka>3)//если уровень больше 3
  {
  stroka=0;// то вернуться к началу
  }
  //delay (500);
  //lcd.clear();
  }
     // перелистывание вверх
  if (digitalRead(enterEnk)== HIGH)
  {
  stroka--;// следующая строка меню на одну строчку
  if (stroka<0)//если уровень больше 3
  {
  stroka=3;// то вернуться к началу
  }
  //delay (500);
  //lcd.clear();
  }
                   
  //!!!!!!!!!!!!!!!!! обработка нажатия энкодера
         //для нулевой строки, самой первой.всего три их.
 
  long new_pos;
  new_pos = Enc_1.read()/4;
  if (new_pos != old_pos)
  {
  if (stroka==0 && new_pos > old_pos  )
 
  { 
   lcd.clear();
   vozduh ++; // увеличиваем значение
  }
  if (stroka==0 && new_pos < old_pos )
  //delay (100);
  {
   lcd.clear();
   vozduh -- ; // уменьшаем значение
  }
  old_pos = new_pos;
  }

[/code]

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

пробовал делать перелистывание строк только в одну сторону, ниего не дало, энкодер меняет значения только первой, нулевой переменной.

((

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Посмотри тут http://arduino.ru/forum/programmirovanie/prostoe-menyu-dlya-simvolnogo-d...
Только вмето опроса кнопок нужно энкодер воткнуть.

maxvalin
Offline
Зарегистрирован: 22.02.2016

опять же... древо.

ну все равно что-то есть интересное!

Попутный вопрос: возможно я не правильно взял направление?

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

maxvalin пишет:

опять же... древо.

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

Вы же почему-то отказались от общепринятого способа создания меню и упорно изобретаете велосипед.

maxvalin пишет:

Попутный вопрос: возможно я не правильно взял направление?

Совершенно верно. См. выше.

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

Не, не ! Никаких велосипедов! Хочу как все)
Да и не доставал бы. Но как и остальные пришёл тот период что дальнейшее понятие программирования развивается в примерах и доставанием уже знающих)))
Все вот эти тонкости применения, по ним явно не хватает книжек(
Еще бы почитать ...

maxvalin
Offline
Зарегистрирован: 22.02.2016

все же сделал без древа, дальше иду. Оказалось что кнопки у меня глючили а я все с программой бился)) Разобрался с подтягивающими резисторами, дело пошло дальше. Сейчас стою у задачи: задавать количество шагов с меню, считать их и запоминать. А также делать сброс в 0. курю форум

maxvalin
Offline
Зарегистрирован: 22.02.2016

что не курится совсем((

нужна помощь.

пробовал разные коды но работает только с этим

int ledPin = 13; // LED connected to digital pin 13
int enx = 38;
int stepx = 54;
int dirx = 55;
int Z =1;

// The setup() method runs once, when the sketch starts

void setup() { 
// initialize the digital pin as an output:
pinMode(ledPin, OUTPUT); 
pinMode(enx, OUTPUT); 
pinMode(stepx, OUTPUT); 
pinMode(dirx, OUTPUT); 
digitalWrite(enx, HIGH);
digitalWrite(stepx, LOW);
digitalWrite(dirx, LOW);

}

// the loop() method runs over and over again,
// as long as the Arduino has power

void loop() 
{
digitalWrite(enx, LOW);
digitalWrite(dirx, HIGH);
digitalWrite(ledPin, HIGH); // set the LED on
for (int x = 0; x<800; x++){ //not sure how this line is effecting the entire system, x< any# does not change how long the motors step for me
digitalWrite(stepx, HIGH);
delay(1); //using this and the below delay to control speed, but only a few different combinations between 0-3 run smoothly so i could use help here
digitalWrite(stepx, LOW);
delay(1);
} //no matter what both motors are running in sync, not what i want
for (int b = 0; b<50; b++){

delay(0);
}
}

шилд ramps 1.4 и драйвер на нем 4988, перепробовал практичесски все примеры из форума - нигде не сдвинулся с места , только с этим кодом крутит в одну сторону и без остановки. На данном этапе пытаюсь изучить ШД а именно библитеку http://www.airspayce.com/mikem/arduino/AccelStepper/AccelStepper_8h_source.html

но на буржуйском не особо быстро получается..(( 

maxvalin
Offline
Зарегистрирован: 22.02.2016

подозреваю из-за того что только в этом примере 

сразу указывается что 

digitalWrite(enx, LOW);