Проблема с меню для 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 кнопки: "м", "+", "-"
вы бы сначала научились правильноь с кнопками работать, потом кнопками в сериал повыводили что нибудь, а уже потом к дисплею подобрались
я и прошу Вас подсказать, что не правильно, просто именно с меню столкнулся в первый раз
а при чём здесь меню, если вы с кнопками работать пока не научились.
когда ваши кнопки будут чётко отрабатывать нужные команды - делайте следующий шаг( меню и всякое разное)))))
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)== LOW) { m++; previousMillis = currentMillis;////если кнопка была нажата сбросить счетчик автовозврата к главному экрану delay(100); if (m>2)//если уровень больше 2 { m=0;// то вернуться к началу } } //Обработка нажатия bol men для h if (digitalRead(bolPin)== LOW && m==1)//если находимся на экране с переменной р1 { h=h+10; //то при нажатии кнопки + увеличиваем переменную h на 10 previousMillis = currentMillis; delay (100); if (h>200) //устанавливаем придел изменения переменной = 200 { //если больше предела h=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } } if (digitalRead(menPin)== LOW && m==1)//если находимся на экране с переменной h { if (h>0) { h=h-10; //то при нажатии кнопки - уменьшаем переменную р на 10 previousMillis = currentMillis; delay (100); } h=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } //Обработка нажатия bol men для dh if (digitalRead(bolPin)== LOW && m==2) { dh=dh+10; //то при нажатии кнопки + увеличиваем переменную dh на 10 previousMillis = currentMillis; delay (100); if (dh>200) //устанавливаем придел изменения переменной = 200 { //если больше предела dh=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } } if (digitalRead(menPin)== LOW && m==2)//если находимся на экране с переменной dh { if (dh>0) { dh=dh-10; //то при нажатии кнопки - уменьшаем переменную dh на 10 previousMillis = currentMillis; delay (100); } h=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } //Вывод меню //Описание экранов меню lcd.clear(); switch(m){ case 0://переменная m=0 //start page break; case 1: //переменная m=1 //отображаем lcd.setCursor(0, 0); //******************* lcd.print("High"); //*Parametr-1 * lcd.setCursor(0, 1); //*P1=p1 * lcd.print("h = "); //******************* lcd.print(h); break; case 2: //переменная m=2 //отображаем lcd.setCursor(0, 0); //******************* lcd.print("sensitivity"); //*Parametr-2 * lcd.setCursor(0, 1); //*P2=p2 * lcd.print("dh= "); //******************* lcd.print(dh); break; } //Проверка автовозврата if(currentMillis - previousMillis > interval) //Если счетчик { previousMillis = currentMillis; //достиг интервала m=0; //то отобразить главный экран } }вот теперь все работает, немножко затупил:) Только с задержками беда вышла, нужно поиграть немного, а то мерцает
076 lcd.clear(); одина строка была не на месте
case0://переменная m=0//она вот тут должна бытьмогли бы сделать функцию для обработки изменения при нажатии кнопок. если не знаете как могу помоч...
чтобы не маргало сделайте обновление при нажатии кнопки...
могли бы сделать функцию для обработки изменения при нажатии кнопок. если не знаете как могу помоч...
вот тут можно поподробнее, пожалуйста
чтобы не маргало сделайте обновление при нажатии кнопки...
это уже исправил
видно не судьба мне про функции узнать:( сам пытался читать, но сильно все запутанно
Судьба, главное иметь желание, а функцию я завтра напишу, сейчас времени нет...
Спасибо. Буду ждать
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; unsigned long currentMillis; #include <Wire.h> #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 10, 11, 12, 13); // (RS, E, DB4, DB5, DB6, DB7) int val_change(String name,int val,int min,int max,int step) { while (digitalRead(mPin)==HIGH) { lcd.clear(); lcd.print(name); lcd.print("="); lcd.print(val); while(digitalRead(bolPin)==HIGH&&digitalRead(menPin)==HIGH&&digitalRead(mPin)==HIGH) { if (digitalRead(bolPin)== LOW) { val=val+step; previousMillis = currentMillis; delay (100); } if (digitalRead(menPin)== LOW) { val=val-step; previousMillis = currentMillis; delay (100); } val=constrain(val,min,max); } } return val; } void setup() { pinMode(bolPin,INPUT); pinMode(mPin,INPUT); pinMode(menPin,INPUT); lcd.begin(16, 2); // Задаем размерность экрана } void loop() { currentMillis=millis(); if (digitalRead(mPin)== LOW) { m++; previousMillis = currentMillis; delay(100); if (m>2)//если уровень больше 2 { m=0;// то вернуться к началу } } switch(m){ case 0://переменная m=0 lcd.clear(); lcd.print("MAIN SCREEN"); lcd.setCursor(0,1); lcd.print("H="); lcd.print(h); lcd.print(" DH="); lcd.print(dh); while(digitalRead(mPin)==HIGH) {delay(100);} break; case 1: h=val_change("High",h,0,200,10); break; case 2: dh=val_change("Sensitivity",dh,0,200,10); break; if(m!=0&¤tMillis - previousMillis > interval) //Если счетчик { previousMillis = currentMillis; //достиг интервала m=0; //то отобразить главный экран } } }вот примерно Ваш код, который я как то криво запихнул в функцию, она начинается строкой int val_change так как возвращает int значение, если Вам нужно какое то другое то так и пишем. из лупа мы ее вызываем обращением h=val_change, где в скобочках указываем используемые в функции параметры, у нас это нач. значение, название, мин, макс и шаг. если что то не нужно то можно удалить из скобок и из функции соответственно. удобство в том, что мы прописываем функцию один раз и обращаемся к ней сколь угодно. вот у Вас в программе их было 2, а если бы было 10? через эту функцию можно и 10 без проблем менять, и с разными шагами и с пределами.
Я намеренно не стал переделывать все другие ошибки кода, если продолжите изучать ардуино сами все найдете, да и кнопки лучше делать не через delay, а одним из других тысячи способов, представленных на форуме. на пример классом "титановый велосипед для тактильной кнопки" великого и ужасного Клапауция...
я думал класс это что-то великое и ужасное с объектами:) а так получился цикл, который крутится не в лупе:) что-то такое мне и нужно было в принципе:) а дэлеи согласен, нужно убирать и фильтровать случайные нажатия по другому:)как раз задумался, что нужно как можно больше быстродействия, почему и задумался по поводу вставок типа:
#asm{
}
они возможны?
А вообще по сути я только начал изучать это все:) очень интересно получается:)а переделать код по Вашему примеру сейчас попробую. Спасибо:)
Где ты тут Класс увидел, это всего лишь Функция ) Они есть в классическом С, точнее это её основной иструмент, даже больше С - язык функций
писать классы это следующий уровень, не начальный конечно, но на начальном никто не запрещает ими пользоваться, может немного изменяя под себя, для этого не нужно понимать как он работает, достаточно знать что он делает. Ведь те же самые библеотеки пишутся классами и функциями...
а по поводу ассемблера никто не ответил:(
а по поводу ассемблера никто не ответил:(
здесь #5 познавательно об ассемблере, труассемблеристах и практической применимости их знаний.
ахах:) там такой дикий бред, что я ничего не понял, от слова совсем:)
но за наводку спасибо, поржал знатно:)
да я не то что бы труассемблерист, просто интересно возможно это или нет
вот в том то и дело, что хотелось бы разобраться как это все работает
просто интересно возможно это или нет
возможно.
а есть какая-нибудь статья или другая литература?
а есть какая-нибудь статья или другая литература?
тайна, покрытая мраком сумасшествия и присыпаная кокаином - не видел вразумительной литературы на русском языке для новичков.
ладно, тогда такой вопрос, смогу ли я мегой организовать быстродействие системы в 0,3 с ?
ладно, тогда такой вопрос, смогу ли я мегой организовать быстродействие системы в 0,3 с ?
можешь - убери делаи и циклы из кода.
int pot1Pin = A0; //потенциометр подключается к 1-му порту int pot2Pin =A1 ; //потенциометр подключается к 1-му порту int b1Pin = A4; // 1 кнопка int b2Pin = A5; // 2 кнопка int b3Pin = A2; // 3 кнопка int b4Pin = A3; // 4 кнопка int upPin = 1; // подключается к digital pin 1 int downPin = 2; // подключается к digital pin 2 int lPin = 3; // подключается к digital pin 3 int rPin = 4; // подключается к digital pin 4 int bolPin=5; int mPin=6; int menPin=7; int m=1; float val1 = 0.00; // переменная для хранения значения входного напряжения float val3 = 0.00; int h=0.00; int dh=0; int hmin=0; int hmax=0; int b1 = 0; // переменная для хранения значения int b2 = 0; int b3 = 0; // переменная для хранения значения int b4 = 0; unsigned long previousMillis = 0; const long interval=300; #include <Wire.h> #include <LiquidCrystal.h> // Лобавляем необходимую библиотеку // Битовая маска символ byte u1[8] = { B00000, B00000, B00000, B00001, B00011, B00111, B01111, B11111, }; byte u2[8] = { B00000, B00000, B00000, B10000, B11000, B11100, B11110, B11111, }; byte d1[8] = { B11111, B01111, B00111, B00011, B00001, B00000, B00000, B00000, }; byte d2[8] = { B11111, B11110, B11100, B11000, B10000, B00000, B00000, B00000, }; LiquidCrystal lcd(8, 9, 10, 11, 12, 13); // (RS, E, DB4, DB5, DB6, DB7) void setup() { pinMode(upPin, OUTPUT); // настраиваем ledPin как выход pinMode(downPin, OUTPUT); pinMode(lPin, OUTPUT); // настраиваем ledPin как выход pinMode(rPin, OUTPUT); pinMode(bolPin,INPUT); pinMode(mPin,INPUT); pinMode(menPin,INPUT); lcd.begin(16, 2); // Задаем размерность экрана lcd.createChar(1, u1); // Создаем символ под номером 1 lcd.createChar(2, u2); lcd.createChar(3, d1); //// Создаем символ под номером 2 lcd.createChar(4, d2); } void loop() { val1 = analogRead(pot1Pin); val3 = analogRead(pot2Pin); b1 = analogRead(b1Pin); b2 = analogRead(b2Pin); b3 = analogRead(b3Pin); b4 = analogRead(b4Pin); b1=(b1/255); b2=(b2/255); b3=(b3/255); b4=(b4/255); val1=20.0*val1/1024; val3=20.0*val3/1024; unsigned long currentMillis = millis(); //Обработка нажатия кнопки M if (digitalRead(mPin)== LOW) { m=m+1; previousMillis = currentMillis;////если кнопка была нажата сбросить счетчик автовозврата к главному экрану delay(100); if (m>2)//если уровень больше 3 { m=0;// то вернуться к началу } } if (digitalRead(menPin)== LOW && digitalRead(bolPin)== LOW) {m=3;} if (digitalRead(menPin)== LOW && m==3)//если находимся на экране с переменной h { hmin=val1; previousMillis = currentMillis; delay (300); m++; } if (digitalRead(bolPin)== LOW && m==4)//если находимся на экране с переменной h { hmax=val1; previousMillis = currentMillis; delay (100); } //Обработка нажатия bol men для h if (digitalRead(bolPin)== LOW && m==1)//если находимся на экране с переменной h { h=h+1; //то при нажатии кнопки + увеличиваем переменную р1 на 10 previousMillis = currentMillis; delay (100); if (h>20) //устанавливаем придел изменения переменной = 200 { //если больше предела h=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } } if (digitalRead(menPin)== LOW && m==1)//если находимся на экране с переменной h { if (h>0) { h=h-1; //то при нажатии кнопки - уменьшаем переменную р на 10 previousMillis = currentMillis; delay (100); } h=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } //Обработка нажатия bol men для dh if (digitalRead(bolPin)== LOW && m==2) { dh=dh+1; //то при нажатии кнопки + увеличиваем переменную dh на 10 previousMillis = currentMillis; delay (100); if (dh>20) //устанавливаем придел изменения переменной = 200 { //если больше предела dh=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } } if (digitalRead(menPin)== LOW && m==2)//если находимся на экране с переменной dh { if (dh>0) { dh=dh-1; //то при нажатии кнопки - уменьшаем переменную dh на 10 previousMillis = currentMillis; delay (100); } h=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } //Вывод меню //Описание экранов меню switch(m){ case 0: //переменная m=0 lcd.clear(); { //отображаем h=hmin+h; if (b1>1&&b2>1) { if (val1>h-dh){ if (val1<h+dh){ digitalWrite(upPin, LOW); digitalWrite(downPin, LOW); } else{ digitalWrite(upPin, HIGH); digitalWrite(downPin, LOW); lcd.clear(); lcd.setCursor(2, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\1"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(3, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\2"); // Выводим смайлик (символ под номером 1) - "\1" } } else{ digitalWrite(upPin, LOW); digitalWrite(downPin, HIGH); lcd.clear(); lcd.setCursor(2, 1); // Устанавливаем курсор в начало 1 строки lcd.print("\3"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(3, 1); // Устанавливаем курсор в начало 1 строки lcd.print("\4"); // Выводим смайлик (символ под номером 1) - "\1" } } else { if (b1>b2) { digitalWrite(upPin, LOW); digitalWrite(downPin, LOW); lcd.clear(); lcd.setCursor(2, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\1"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(3, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\2"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(1,6); // Устанавливаем курсор в начало 1 строки lcd.print("R"); delay(150); } else digitalWrite(upPin, LOW); digitalWrite(downPin, LOW); {lcd.clear(); lcd.setCursor(2, 1); // Устанавливаем курсор в начало 1 строки lcd.print("\3"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(3, 1); // Устанавливаем курсор в начало 1 строки lcd.print("\4"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(1,6); // Устанавливаем курсор в начало 1 строки lcd.print("R"); delay(150); } } if (b3>1&&b4>1) { if (val3>512-dh){ if (val3<512+dh){ digitalWrite(lPin, LOW); digitalWrite(rPin, LOW); } else{ digitalWrite(rPin, HIGH); digitalWrite(lPin, LOW); lcd.clear(); lcd.setCursor(4, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\2"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(4, 1); // Устанавливаем курсор в начало 1 строки lcd.print("\4"); // Выводим смайлик (символ под номером 1) - "\1" } } else{ digitalWrite(rPin, LOW); digitalWrite(lPin, HIGH); lcd.clear(); lcd.setCursor(1, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\1"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(1, 1); // Устанавливаем курсор в начало 1 строки lcd.print("\3"); // Выводим смайлик (символ под номером 1) - "\1" } } else { if (b3>b4) { digitalWrite(rPin, LOW); digitalWrite(lPin, LOW); lcd.clear(); lcd.setCursor(4, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\2"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(4, 1); // Устанавливаем курсор в начало 1 строки lcd.print("\4"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(6,1); // Устанавливаем курсор в начало 1 строки lcd.print("R"); delay(150); } else digitalWrite(rPin, LOW); digitalWrite(lPin, LOW); {lcd.clear(); lcd.setCursor(1, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\2"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(3, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\4"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(6,1); // Устанавливаем курсор в начало 1 строки lcd.print("R"); delay(150); } } break; case 3: //переменная m=1 //отображаем lcd.setCursor(0, 0); //******************* lcd.print("DO YPORA VNIZ "); //*Parametr-1 * lcd.setCursor(0, 1); //*P1=p1 * lcd.print("hmin = "); //******************* lcd.print(hmin ); break; case 4: //переменная m=1 //отображаем lcd.setCursor(0, 0); //******************* lcd.print("DO YPORA VVERH"); //*Parametr-1 * lcd.setCursor(0, 1); //*P1=p1 * lcd.print("hmax = "); //******************* lcd.print(hmax ); break; case 1: //переменная m=1 //отображаем lcd.setCursor(0, 0); //******************* lcd.print("High "); //*Parametr-1 * lcd.setCursor(0, 1); //*P1=p1 * lcd.print("h = "); //******************* lcd.print(h ); break; case 2: //переменная m=2 //отображаем lcd.setCursor(0, 0); //******************* lcd.print("sensitivity "); //*Parametr-2 * lcd.setCursor(0, 1); //*P2=p2 * lcd.print("dh = "); //******************* lcd.print(dh ); break; } if(currentMillis - previousMillis > interval) //Если счетчик //Проверка автовозврата { previousMillis = currentMillis; //достиг интервала m=0; //то отобразить главный экран } } }вот так оно примерно получается, мне главное, что бы при 0-ом экране все работало быстро, а 1-4 экран, просто установки
всё херня - давай сначала... без делаев.
т.е. если м=0, и там делаев и нет, то все равно остальные делаи будут всеравно тормозить его?
т.е. если м=0, и там делаев и нет, то все равно остальные делаи будут всеравно тормозить его?
смотри, как всё упрощается... и, никаких делеев:
if (BUTTON_01.click_down) {if (m > 1) --m;} // лазием вверх-вниз по экранам 1-5 if (BUTTON_02.click_down) {if (m < 5) ++m;} // лазием вверх-вниз по экранам 1-5 if (BUTTON_01.doubleclick) {m = 0;} // выходим в главный экран по двойному клику 1-й кнопкой if (BUTTON_01.timer || BUTTON_02.timer) {m = 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:
if (BUTTON_01.click_down) {if (m > 1) --nm;} // лазием вверх-вниз по экранам 1-5 if (BUTTON_02.click_down) {if (m < 5) ++nm;} // лазием вверх-вниз по экранам 1-5 if (BUTTON_01.doubleclick) {nm = 0;} // выходим в главный экран по двойному клику 1-й кнопкой if (BUTTON_01.timer || BUTTON_02.timer) {nm = 0;} // выходим в главный экран при неактивности кнопокчто бы не долбить экран печатью в цикле, а перепечатывать экран при изменении переменной m.
а что делать если кнопки подтянуты на землю? т.е. нормальное состояние "1"?
а что делать если кнопки подтянуты на землю? т.е. нормальное состояние "1"?
перепиши класс или перепаяй кнопки правильно.
class BUTTON { public: //================================================================ static const byte bounce_ = 50; // длительность отслеживания дребезга. //================================================================ boolean click_down; boolean click_up; //================================= unsigned long m; boolean p; boolean b; boolean dc; byte c; boolean t; boolean r; //================================= byte _pb; //================================= BUTTON(byte pb) { _pb = pb; pinMode(_pb, INPUT); digitalWrite(_pb, 1); //==== click_down = 0; click_up = 0; //==== m = millis(); p = digitalRead(_pb); b = 0; dc = 0; c = 0; t = 0; r = 0; //==== } void read() { //======================================================= unsigned long nm = millis(); boolean np = digitalRead(_pb); //================= boolean nb = 0; boolean ndc = 0; boolean nt = 0; boolean nr = 0; //================ click_down = 0; click_up = 0; //================= if (np != p) {p = np; m = nm; } //======================================================= if (nm - m > bounce_) {nb = 1;} if (ndc != dc) {dc = ndc; if (dc == 1) {c = 0;}} if (nb != b) {b = nb; if (p == 0 && b == 0) {click_down = 1; } if (p == 1 && b == 1) {click_up = 1;} } //======================================================= if (nt != t) {t = nt; } //======================================================= } }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int pot1Pin = A0; //потенциометр подключается к 1-му порту int pot2Pin =A1 ; //потенциометр подключается к 1-му порту int b1Pin = A4; // 1 сигнал int b2Pin = A5; // 2 сигнал int b3Pin = A2; // 3 сигнал int b4Pin = A3; // 4 сигнал BUTTON BUTTON_05(5); BUTTON BUTTON_06(6); BUTTON BUTTON_07(7); int upPin = 1; // подключается к digital pin 1 int downPin = 2; // подключается к digital pin 2 int lPin = 3; // подключается к digital pin 3 int rPin = 4; // подключается к digital pin 4 int b1 = 0; // переменная для хранения значения int b2 = 0; int b3 = 0; // переменная для хранения значения int b4 = 0; int m=1; float val1 = 0.00; // переменная для хранения значения входного напряжения float val3 = 0.00; int h=0.00; int dh=0; int hmin=0; int hmax=0; unsigned long previousMillis = 0; const long interval=300; #include <Wire.h> #include <LiquidCrystal.h> // Лобавляем необходимую библиотеку // Битовая маска символ byte u1[8] = { B00000, B00000, B00000, B00001, B00011, B00111, B01111, B11111, }; byte u2[8] = { B00000, B00000, B00000, B10000, B11000, B11100, B11110, B11111, }; byte d1[8] = { B11111, B01111, B00111, B00011, B00001, B00000, B00000, B00000, }; byte d2[8] = { B11111, B11110, B11100, B11000, B10000, B00000, B00000, B00000, }; LiquidCrystal lcd(8, 9, 10, 11, 12, 13); // (RS, E, DB4, DB5, DB6, DB7) void setup() { pinMode(upPin, OUTPUT); // настраиваем ledPin как выход pinMode(downPin, OUTPUT); pinMode(lPin, OUTPUT); // настраиваем ledPin как выход pinMode(rPin, OUTPUT); lcd.begin(16, 2); // Задаем размерность экрана lcd.createChar(1, u1); // Создаем символ под номером 1 lcd.createChar(2, u2); lcd.createChar(3, d1); //// Создаем символ под номером 2 lcd.createChar(4, d2); } void loop() { val1 = analogRead(pot1Pin); val3 = analogRead(pot2Pin); b1 = analogRead(b1Pin); b2 = analogRead(b2Pin); b3 = analogRead(b3Pin); b4 = analogRead(b4Pin); BUTTON_05.read(); // обновляем состояние переменных кнопки BUTTON_01. BUTTON_06.read(); // обновляем состояние переменных кнопки BUTTON_01. BUTTON_07.read(); // обновляем состояние переменных кнопки BUTTON_01. val1=20.0*val1/1024; val3=20.0*val3/1024; unsigned long currentMillis = millis(); //Обработка нажатия кнопки M if (BUTTON_06.click_down) { m=m+1; previousMillis = currentMillis;////если кнопка была нажата сбросить счетчик автовозврата к главному экрану if (m>2)//если уровень больше 3 { m=0;// то вернуться к началу } } if (BUTTON_05.click_down && BUTTON_07.click_down) {m=3;} if (BUTTON_07.click_down && m==3)//если находимся на экране с переменной h { hmin=val1; previousMillis = currentMillis; m++; } if (BUTTON_05.click_down && m==4)//если находимся на экране с переменной h { hmax=val1; previousMillis = currentMillis; } //Обработка нажатия bol men для h if (BUTTON_05.click_down && m==1)//если находимся на экране с переменной h { h=h+1; //то при нажатии кнопки + увеличиваем переменную р1 на 10 previousMillis = currentMillis; if (h>20) //устанавливаем придел изменения переменной = 20 { //если больше предела h=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } } if (BUTTON_07.click_down && m==1)//если находимся на экране с переменной h { if (h>0) { h=h-1; //то при нажатии кнопки - уменьшаем переменную р на 10 previousMillis = currentMillis; } h=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } //Обработка нажатия bol men для dh if (BUTTON_05.click_down && m==2) { dh=dh+1; //то при нажатии кнопки + увеличиваем переменную dh на 10 previousMillis = currentMillis; delay (100); if (dh>20) //устанавливаем придел изменения переменной = 200 { //если больше предела dh=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } } if (BUTTON_07.click_down && m==2)//если находимся на экране с переменной dh { if (dh>0) { dh=dh-1; //то при нажатии кнопки - уменьшаем переменную dh на 10 previousMillis = currentMillis; } h=0; //то возвращаем ее к 0 (тут код условия что делать при достижении приделов) } //Вывод меню //Описание экранов меню switch(m){ case 0: //переменная m=0 lcd.clear(); { //отображаем h=hmin+h; if (b1>1&&b2>1) { if (val1>h-dh){ if (val1<h+dh){ digitalWrite(upPin, LOW); digitalWrite(downPin, LOW); } else{ digitalWrite(upPin, HIGH); digitalWrite(downPin, LOW); lcd.clear(); lcd.setCursor(2, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\1"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(3, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\2"); // Выводим смайлик (символ под номером 1) - "\1" } } else{ digitalWrite(upPin, LOW); digitalWrite(downPin, HIGH); lcd.clear(); lcd.setCursor(2, 1); // Устанавливаем курсор в начало 1 строки lcd.print("\3"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(3, 1); // Устанавливаем курсор в начало 1 строки lcd.print("\4"); // Выводим смайлик (символ под номером 1) - "\1" } } else { if (b1>b2) { digitalWrite(upPin, LOW); digitalWrite(downPin, LOW); lcd.clear(); lcd.setCursor(2, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\1"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(3, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\2"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(1,6); // Устанавливаем курсор в начало 1 строки lcd.print("R"); delay(150); } else digitalWrite(upPin, LOW); digitalWrite(downPin, LOW); {lcd.clear(); lcd.setCursor(2, 1); // Устанавливаем курсор в начало 1 строки lcd.print("\3"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(3, 1); // Устанавливаем курсор в начало 1 строки lcd.print("\4"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(1,6); // Устанавливаем курсор в начало 1 строки lcd.print("R"); delay(150); } } if (b3>1&&b4>1) { if (val3>512-dh){ if (val3<512+dh){ digitalWrite(lPin, LOW); digitalWrite(rPin, LOW); } else{ digitalWrite(rPin, HIGH); digitalWrite(lPin, LOW); lcd.clear(); lcd.setCursor(4, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\2"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(4, 1); // Устанавливаем курсор в начало 1 строки lcd.print("\4"); // Выводим смайлик (символ под номером 1) - "\1" } } else{ digitalWrite(rPin, LOW); digitalWrite(lPin, HIGH); lcd.clear(); lcd.setCursor(1, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\1"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(1, 1); // Устанавливаем курсор в начало 1 строки lcd.print("\3"); // Выводим смайлик (символ под номером 1) - "\1" } } else { { digitalWrite(rPin, LOW); digitalWrite(lPin, LOW); lcd.clear(); lcd.setCursor(4, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\2"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(4, 1); // Устанавливаем курсор в начало 1 строки lcd.print("\4"); // Выводим смайлик (символ под номером 1) - "\1" lcd.setCursor(6,1); // Устанавливаем курсор в начало 1 строки lcd.print("R"); delay(150); } } break; case 3: //переменная m=1 //отображаем lcd.setCursor(0, 0); //******************* lcd.print("DO YPORA VNIZ "); //*Parametr-1 * lcd.setCursor(0, 1); //*P1=p1 * lcd.print("hmin = "); //******************* lcd.print(hmin ); break; case 4: //переменная m=1 //отображаем lcd.setCursor(0, 0); //******************* lcd.print("DO YPORA VVERH"); //*Parametr-1 * lcd.setCursor(0, 1); //*P1=p1 * lcd.print("hmax = "); //******************* lcd.print(hmax ); break; case 1: //переменная m=1 //отображаем lcd.setCursor(0, 0); //******************* lcd.print("High "); //*Parametr-1 * lcd.setCursor(0, 1); //*P1=p1 * lcd.print("h = "); //******************* lcd.print(h ); break; case 2: //переменная m=2 //отображаем lcd.setCursor(0, 0); //******************* lcd.print("sensitivity "); //*Parametr-2 * lcd.setCursor(0, 1); //*P2=p2 * lcd.print("dh = "); //******************* lcd.print(dh ); break; } if(currentMillis - previousMillis > interval) //Если счетчик //Проверка автовозврата { previousMillis = currentMillis; //достиг интервала m=0; //то отобразить главный экран } } }как то так
если выпиливаешь из класса что-то, то думай, зачем... что бы терзаться смутными сомнениями, что ты сделал что-то не то?
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
вообще никак:( ладно, будет так:) просто строк больше в скетче размер от этого не меняется