Проблема с меню для LCD
- Войдите на сайт для отправки комментариев
Чт, 10/03/2016 - 17:35
int bolPin=5; int mPin=6; int menPin=7; int m=0; int val3 = 0; int h=0; int dh=0; long previousMillis = 0; long interval=3000; #include <Wire.h> #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 10, 11, 12, 13); // (RS, E, DB4, DB5, DB6, DB7) void setup() { pinMode(bolPin,INPUT); pinMode(mPin,INPUT); pinMode(menPin,INPUT); lcd.begin(16, 2); // Задаем размерность экрана void loop() { unsigned long currentMillis=millis(); //Обработка нажатия кнопки M if (digitalRead(mPin)== HIGH) { m++; previousMillis = currentMillis;////если кнопка была нажата сбросить счетчик автовозврата к главному экрану delay(100); if (m>2)//если уровень больше 3 { m=0;// то вернуться к началу } } //Обработка нажатия bol men для h if (digitalRead(bolPin)== HIGH && m==1)//если находимся на экране с переменной р1 { h=h+10; //то при нажатии кнопки + увеличиваем переменную h на 10 previousMillis = currentMillis; delay (100); if (h>200) //устанавливаем придел изменения переменной = 200 { //если больше предела h=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } } if (digitalRead(menPin)== HIGH && m==1)//если находимся на экране с переменной h { if (h>0) { h=h-10; //то при нажатии кнопки - уменьшаем переменную р на 10 previousMillis = currentMillis; delay (100); } h=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } //Обработка нажатия bol men для dh if (digitalRead(bolPin)== HIGH && m==2) { dh=dh+10; //то при нажатии кнопки + увеличиваем переменную dh на 10 previousMillis = currentMillis; delay (100); if (dh>200) //устанавливаем придел изменения переменной = 200 { //если больше предела dh=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } } if (digitalRead(menPin)== HIGH && m==2)//если находимся на экране с переменной dh { if (dh>0) { dh=dh-10; //то при нажатии кнопки - уменьшаем переменную dh на 10 previousMillis = currentMillis; delay (100); } h=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } //Вывод меню //Описание экранов меню lcd.clear(); if (m==0) //переменная m=0 { //отображаем 0 страницу } else if (m==1) //переменная m=1 { //отображаем lcd.setCursor(0, 0); //******************* lcd.print("High"); //*Parametr-1 * lcd.setCursor(0, 1); //*P1=p1 * lcd.print("h = "); //******************* lcd.print(h); } else if (m==2) //переменная m=2 { //отображаем lcd.setCursor(0, 0); //******************* lcd.print("sensitivity"); //*Parametr-2 * lcd.setCursor(0, 1); //*P2=p2 * lcd.print("dh= "); //******************* lcd.print(dh); } //Проверка автовозврата if(currentMillis - previousMillis > interval) //Если счетчик { previousMillis = currentMillis; //достиг интервала m=0; //то отобразить главный экран } }
Подскажите, пожалуйста, в чем ошибка? сейчас, меню отображается просто циклично и значения переменных не изменяются.
Заранее спасибо
вы бы сначала научились правильноь с кнопками работать, потом кнопками в сериал повыводили что нибудь, а уже потом к дисплею подобрались
Подскажите, пожалуйста, в чем ошибка? сейчас, меню отображается просто циклично и значения переменных не изменяются.
Заранее спасибо
вы бы сначала научились правильноь с кнопками работать, потом кнопками в сериал повыводили что нибудь, а уже потом к дисплею подобрались
я и прошу Вас подсказать, что не правильно, просто именно с меню столкнулся в первый раз
switch мне только при перемене экранов нужен?
да в принципе, это вроде не принципиально и так, и так правильно ж вроде. Разве что читаемость получше.
я про switch и не знал, спасибо огромное, Вам.
Задача такая:
есть 3 экрана меню:
0. (m=0) - Начальная страница, там отображаются параметры, она отображается в рабочем режиме
1. (m=1)- При 1 нажатии кнопки "м", появляется страница для изменения переменной "h" c с помощью кнопок "+" и "-".
2. (m=2)- При повторном нажатии кнопки "м", появляется страница для изменения переменной "dh" c с помощью кнопок "+" и "-".
соответственно есть 3 кнопки: "м", "+", "-"
вы бы сначала научились правильноь с кнопками работать, потом кнопками в сериал повыводили что нибудь, а уже потом к дисплею подобрались
я и прошу Вас подсказать, что не правильно, просто именно с меню столкнулся в первый раз
а при чём здесь меню, если вы с кнопками работать пока не научились.
когда ваши кнопки будут чётко отрабатывать нужные команды - делайте следующий шаг( меню и всякое разное)))))
вот теперь все работает, немножко затупил:) Только с задержками беда вышла, нужно поиграть немного, а то мерцает
076 lcd.clear(); одина строка была не на месте
case
0:
//переменная m=0
//она вот тут должна быть
могли бы сделать функцию для обработки изменения при нажатии кнопок. если не знаете как могу помоч...
чтобы не маргало сделайте обновление при нажатии кнопки...
могли бы сделать функцию для обработки изменения при нажатии кнопок. если не знаете как могу помоч...
вот тут можно поподробнее, пожалуйста
чтобы не маргало сделайте обновление при нажатии кнопки...
это уже исправил
видно не судьба мне про функции узнать:( сам пытался читать, но сильно все запутанно
Судьба, главное иметь желание, а функцию я завтра напишу, сейчас времени нет...
Спасибо. Буду ждать
вот примерно Ваш код, который я как то криво запихнул в функцию, она начинается строкой int val_change так как возвращает int значение, если Вам нужно какое то другое то так и пишем. из лупа мы ее вызываем обращением h=val_change, где в скобочках указываем используемые в функции параметры, у нас это нач. значение, название, мин, макс и шаг. если что то не нужно то можно удалить из скобок и из функции соответственно. удобство в том, что мы прописываем функцию один раз и обращаемся к ней сколь угодно. вот у Вас в программе их было 2, а если бы было 10? через эту функцию можно и 10 без проблем менять, и с разными шагами и с пределами.
Я намеренно не стал переделывать все другие ошибки кода, если продолжите изучать ардуино сами все найдете, да и кнопки лучше делать не через delay, а одним из других тысячи способов, представленных на форуме. на пример классом "титановый велосипед для тактильной кнопки" великого и ужасного Клапауция...
я думал класс это что-то великое и ужасное с объектами:) а так получился цикл, который крутится не в лупе:) что-то такое мне и нужно было в принципе:) а дэлеи согласен, нужно убирать и фильтровать случайные нажатия по другому:)как раз задумался, что нужно как можно больше быстродействия, почему и задумался по поводу вставок типа:
#asm{
}
они возможны?
А вообще по сути я только начал изучать это все:) очень интересно получается:)а переделать код по Вашему примеру сейчас попробую. Спасибо:)
Где ты тут Класс увидел, это всего лишь Функция ) Они есть в классическом С, точнее это её основной иструмент, даже больше С - язык функций
писать классы это следующий уровень, не начальный конечно, но на начальном никто не запрещает ими пользоваться, может немного изменяя под себя, для этого не нужно понимать как он работает, достаточно знать что он делает. Ведь те же самые библеотеки пишутся классами и функциями...
а по поводу ассемблера никто не ответил:(
а по поводу ассемблера никто не ответил:(
здесь #5 познавательно об ассемблере, труассемблеристах и практической применимости их знаний.
ахах:) там такой дикий бред, что я ничего не понял, от слова совсем:)
но за наводку спасибо, поржал знатно:)
да я не то что бы труассемблерист, просто интересно возможно это или нет
вот в том то и дело, что хотелось бы разобраться как это все работает
просто интересно возможно это или нет
возможно.
а есть какая-нибудь статья или другая литература?
а есть какая-нибудь статья или другая литература?
тайна, покрытая мраком сумасшествия и присыпаная кокаином - не видел вразумительной литературы на русском языке для новичков.
ладно, тогда такой вопрос, смогу ли я мегой организовать быстродействие системы в 0,3 с ?
ладно, тогда такой вопрос, смогу ли я мегой организовать быстродействие системы в 0,3 с ?
можешь - убери делаи и циклы из кода.
вот так оно примерно получается, мне главное, что бы при 0-ом экране все работало быстро, а 1-4 экран, просто установки
всё херня - давай сначала... без делаев.
т.е. если м=0, и там делаев и нет, то все равно остальные делаи будут всеравно тормозить его?
т.е. если м=0, и там делаев и нет, то все равно остальные делаи будут всеравно тормозить его?
смотри, как всё упрощается... и, никаких делеев:
не поленись - зайди и почитай класс титановый велосипед для тактовой кнопки.
там не вверх вниз:)
мы включаем прибор, у нас сразу м=3, где мы задаем h - высоту, кнопками +-
жмакаем еще раз м, м=4, задаем dh - зону нечуствительности, кнопками +-
нажимаем и поехали:) м=0. в процессе работы мы можем нажать еще раз "м" и подкорректировать значения.
м=1-2 -режимы каллибровки, которые включаются при одновременном нажатии +и-
там не вверх вниз:)
ну, так сделай сам, как тебе нужно... я, что ли буду разбираться в логике твоих меню - дал пример простого меню с пятью служебными и одним главным экраном.
я понял, спасибо:)
if
(BUTTON_01.click_down &&
m==2) {
}
//
так же можно сделать, я правильно понял?
я понял, спасибо:)
if
(BUTTON_01.click_down &&
m==2) {
}
//
так же можно сделать, я правильно понял?
конечно - суть в том, что у тебя сразу исчезнет проблема с делаями, и смотри, что бы ты смог выйти оттуда, вкуда зашёл.
и, ещё советую ввести переменную nm - будешь печатать меню по условию if (nm !=m) {m = nm; код подпрограммы печати меню в экран;}
т.е. здесь у тебя будет изменяться nm:
что бы не долбить экран печатью в цикле, а перепечатывать экран при изменении переменной m.
а что делать если кнопки подтянуты на землю? т.е. нормальное состояние "1"?
а что делать если кнопки подтянуты на землю? т.е. нормальное состояние "1"?
перепиши класс или перепаяй кнопки правильно.
как то так
если выпиливаешь из класса что-то, то думай, зачем... что бы терзаться смутными сомнениями, что ты сделал что-то не то?
delay(150);
блять. этот народ безнадёжен. :D
вот тут без всяких классов :) и даже анимация есть :)
http://arduino.ru/forum/obshchii/khochu-vylozhit-proekt-no-vot-kuda
вот тут без всяких классов :) и даже анимация есть :)
http://arduino.ru/forum/obshchii/khochu-vylozhit-proekt-no-vot-kuda
блин. ещё один клоун - один без делаев жить не может, второй не знает о существовании дропбокса.
други! вы нашли друг-друга в этот сложном для вашего понимания мире...
delay(150);
блять. этот народ безнадёжен. :D
я его пропустил:)
delay(150);
блять. этот народ безнадёжен. :D
я его пропустил:)
ок. и, класс не пили, пока не убедился, что хоть как-то работает.
класс подключай как библиотеку #186
если выпиливаешь из класса что-то, то думай, зачем... что бы терзаться смутными сомнениями, что ты сделал что-то не то?
я выпилил 2-е нажатие и долгое нажатие, а таймер у меня свой вроде как запилен
мне нужны были только нажать отпустить и дребезг
я выпилил 2-е нажатие и долгое нажатие, а таймер у меня свой вроде как запилен
мне нужны были только нажать отпустить и дребезг
это понятно, но зачем? если ты не используешь что-то из класса, то неиспользуемое проигнорируется компиллятором.
всё херня - давай сначала #186
вообще никак:( ладно, будет так:) просто строк больше в скетче размер от этого не меняется