меню без древа но с тремя перемнными
- Войдите на сайт для отправки комментариев
вечер добрый учасникам, постигаю азы ардуино ну и соответственно есть вопрос с привязыванием кнопок к переменным на одном экране:
имеется наброски меню с одним экраном, (никаких древовидных переходов) и а на этом экране нужно изменять 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]
пробовал делать перелистывание строк только в одну сторону, ниего не дало, энкодер меняет значения только первой, нулевой переменной.
((
Посмотри тут http://arduino.ru/forum/programmirovanie/prostoe-menyu-dlya-simvolnogo-d...
Только вмето опроса кнопок нужно энкодер воткнуть.
опять же... древо.
ну все равно что-то есть интересное!
Попутный вопрос: возможно я не правильно взял направление?
Экран выводит лишь глобальную перменную, а кнопки и блютуз изминяют ее отдельно, экран перписывает значение опять. Потом еще и через епром для запоминания при выключении.
опять же... древо.
Дерево - нормальный и ественный способ представления меню. Даже если не нужно сворачивать разворачивать, все равно - то, что Вы называете "переходом между переменными" легко реализуется переходом между узлами дерева.
Вы же почему-то отказались от общепринятого способа создания меню и упорно изобретаете велосипед.
Попутный вопрос: возможно я не правильно взял направление?
Совершенно верно. См. выше.
Не, не ! Никаких велосипедов! Хочу как все)
Да и не доставал бы. Но как и остальные пришёл тот период что дальнейшее понятие программирования развивается в примерах и доставанием уже знающих)))
Все вот эти тонкости применения, по ним явно не хватает книжек(
Еще бы почитать ...
все же сделал без древа, дальше иду. Оказалось что кнопки у меня глючили а я все с программой бился)) Разобрался с подтягивающими резисторами, дело пошло дальше. Сейчас стою у задачи: задавать количество шагов с меню, считать их и запоминать. А также делать сброс в 0. курю форум
что не курится совсем((
нужна помощь.
пробовал разные коды но работает только с этим
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
но на буржуйском не особо быстро получается..((
подозреваю из-за того что только в этом примере
сразу указывается что
digitalWrite(enx, LOW);