Проблема с меню для LCD

James
Offline
Зарегистрирован: 26.02.2016
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;                                         //то отобразить главный экран
  }
}
  

 

James
Offline
Зарегистрирован: 26.02.2016

Подскажите, пожалуйста, в чем ошибка? сейчас, меню отображается просто циклично и значения переменных не изменяются.

Заранее спасибо

vvadim
Offline
Зарегистрирован: 23.05.2012

вы бы сначала научились правильноь с кнопками работать, потом кнопками в сериал повыводили что нибудь, а уже потом к дисплею подобрались

releyshic
Offline
Зарегистрирован: 20.11.2015

James пишет:

Подскажите, пожалуйста, в чем ошибка? сейчас, меню отображается просто циклично и значения переменных не изменяются.

Заранее спасибо

замени свои бешенные if на switch и объясни что не работает что работает какие перемнные меняются в порту какие нет и тп и как вообще должно работать

James
Offline
Зарегистрирован: 26.02.2016

vvadim пишет:

вы бы сначала научились правильноь с кнопками работать, потом кнопками в сериал повыводили что нибудь, а уже потом к дисплею подобрались

я и прошу Вас подсказать, что не правильно, просто именно с меню столкнулся в первый раз

 

James
Offline
Зарегистрирован: 26.02.2016

switch мне только при перемене экранов нужен?
да в принципе, это вроде не принципиально и так, и так правильно ж вроде. Разве что читаемость получше.

я про switch и не знал, спасибо огромное, Вам.

Задача такая:

есть 3 экрана меню:

0. (m=0) - Начальная страница, там отображаются параметры, она отображается в рабочем режиме

1. (m=1)- При 1 нажатии кнопки "м", появляется страница для изменения переменной "h" c с помощью кнопок "+" и "-".

2. (m=2)- При повторном нажатии кнопки "м", появляется страница для изменения переменной "dh" c с помощью кнопок "+" и "-".

соответственно есть 3 кнопки: "м", "+", "-"

vvadim
Offline
Зарегистрирован: 23.05.2012

James пишет:

vvadim пишет:

вы бы сначала научились правильноь с кнопками работать, потом кнопками в сериал повыводили что нибудь, а уже потом к дисплею подобрались

я и прошу Вас подсказать, что не правильно, просто именно с меню столкнулся в первый раз

 

а при чём здесь меню, если вы с кнопками работать пока не научились.

когда ваши кнопки будут чётко отрабатывать нужные команды - делайте следующий шаг( меню и всякое разное)))))

James
Offline
Зарегистрирован: 26.02.2016
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;                                         //то отобразить главный экран
  }
}
  

вот теперь все работает, немножко затупил:) Только с задержками беда вышла, нужно поиграть немного, а то мерцает

James
Offline
Зарегистрирован: 26.02.2016

 076 lcd.clear(); одина строка была не на месте

case 0://переменная m=0

//она вот тут должна быть

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

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

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

чтобы не маргало сделайте обновление при нажатии кнопки...

James
Offline
Зарегистрирован: 26.02.2016

Mr.Privet пишет:

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

вот тут можно поподробнее, пожалуйста

James
Offline
Зарегистрирован: 26.02.2016

Mr.Privet пишет:

чтобы не маргало сделайте обновление при нажатии кнопки...

это уже исправил

James
Offline
Зарегистрирован: 26.02.2016

видно не судьба мне про функции узнать:( сам пытался читать, но сильно все запутанно

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Судьба, главное иметь желание, а функцию я завтра напишу, сейчас времени нет...

James
Offline
Зарегистрирован: 26.02.2016

Спасибо. Буду ждать

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

 

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&&currentMillis - previousMillis > interval)  //Если счетчик
  {
    previousMillis = currentMillis;              //достиг интервала
    m=0;                                         //то отобразить главный экран
  }
 }
}

 

вот примерно Ваш код, который я как то криво запихнул в функцию, она начинается строкой int val_change так как возвращает int значение, если Вам нужно какое то другое то так и пишем. из лупа мы ее вызываем обращением h=val_change, где в скобочках указываем используемые в функции параметры, у нас это нач. значение, название, мин, макс и шаг. если что то не нужно то можно удалить из скобок и из функции соответственно. удобство в том, что мы прописываем функцию один раз и обращаемся к ней сколь угодно. вот у Вас в программе их было 2, а если бы было 10? через эту функцию можно и 10 без проблем менять, и с разными шагами и с пределами.

Я намеренно не стал переделывать все другие ошибки кода, если продолжите изучать ардуино сами все найдете, да и кнопки лучше делать не через delay, а одним из других тысячи способов, представленных на форуме. на пример классом "титановый велосипед для тактильной кнопки" великого и ужасного Клапауция...

James
Offline
Зарегистрирован: 26.02.2016

я думал класс это что-то великое и ужасное с объектами:) а так получился цикл, который крутится не в лупе:) что-то такое мне и нужно было в принципе:) а дэлеи согласен, нужно убирать и фильтровать случайные нажатия по другому:)как раз задумался, что нужно как можно больше быстродействия, почему и задумался по поводу вставок типа:

#asm{

}

они возможны?

А вообще по сути я только начал изучать это все:) очень интересно получается:)а переделать код по Вашему примеру сейчас попробую. Спасибо:)

releyshic
Offline
Зарегистрирован: 20.11.2015

Где ты тут Класс увидел, это всего лишь Функция ) Они есть в классическом С, точнее это её основной иструмент, даже больше С - язык функций

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

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

James
Offline
Зарегистрирован: 26.02.2016

а по поводу ассемблера никто не ответил:(

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

James пишет:

а по поводу ассемблера никто не ответил:(

здесь #5 познавательно об ассемблере, труассемблеристах и практической применимости их знаний.

James
Offline
Зарегистрирован: 26.02.2016

ахах:) там такой дикий бред, что я ничего не понял, от слова совсем:)

но за наводку спасибо, поржал знатно:)

да я не то что бы труассемблерист, просто интересно возможно это или нет

James
Offline
Зарегистрирован: 26.02.2016

вот в том то и дело, что хотелось бы разобраться как это все работает

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

James пишет:

просто интересно возможно это или нет

возможно.

James
Offline
Зарегистрирован: 26.02.2016

а есть какая-нибудь статья или другая литература?

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

James пишет:

а есть какая-нибудь статья или другая литература?

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

James
Offline
Зарегистрирован: 26.02.2016

ладно, тогда такой вопрос, смогу ли я мегой организовать быстродействие системы в 0,3 с ?

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

James пишет:

ладно, тогда такой вопрос, смогу ли я мегой организовать быстродействие системы в 0,3 с ?

можешь - убери делаи и циклы из кода.

James
Offline
Зарегистрирован: 26.02.2016
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 экран, просто установки

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

всё херня - давай сначала... без делаев.

James
Offline
Зарегистрирован: 26.02.2016

т.е. если м=0, и там делаев и нет, то все равно остальные делаи будут всеравно тормозить его?

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

James пишет:

т.е. если м=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;} // выходим в главный экран при неактивности кнопок

не поленись - зайди и почитай класс титановый велосипед для тактовой кнопки.

James
Offline
Зарегистрирован: 26.02.2016

там не вверх вниз:) 

мы включаем прибор, у нас сразу м=3, где мы задаем h - высоту, кнопками +-

жмакаем еще раз м, м=4, задаем dh - зону нечуствительности, кнопками +-

нажимаем и поехали:) м=0. в процессе работы мы можем нажать еще раз "м" и подкорректировать значения.

м=1-2 -режимы каллибровки, которые включаются при одновременном нажатии +и-

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

James пишет:

там не вверх вниз:) 

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

James
Offline
Зарегистрирован: 26.02.2016

я понял, спасибо:)

if (BUTTON_01.click_down && m==2) {// 

так же можно сделать, я правильно понял?

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

James пишет:

я понял, спасибо:)

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.

James
Offline
Зарегистрирован: 26.02.2016

 

а что делать если кнопки подтянуты на землю? т.е. нормальное состояние "1"?

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

James пишет:

 

а что делать если кнопки подтянуты на землю? т.е. нормальное состояние "1"?

перепиши класс или перепаяй кнопки правильно.

James
Offline
Зарегистрирован: 26.02.2016
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;                                         //то отобразить главный экран
  }
}
}

как то так

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

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

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

     delay(150);

блять. этот народ безнадёжен. :D

vde69
Offline
Зарегистрирован: 10.01.2016

вот тут без всяких классов :)  и даже анимация есть :)

http://arduino.ru/forum/obshchii/khochu-vylozhit-proekt-no-vot-kuda

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

vde69 пишет:

вот тут без всяких классов :)  и даже анимация есть :)

http://arduino.ru/forum/obshchii/khochu-vylozhit-proekt-no-vot-kuda

блин. ещё один клоун - один без делаев жить не может, второй не знает о существовании дропбокса.

други! вы нашли друг-друга в этот сложном для вашего понимания мире...

James
Offline
Зарегистрирован: 26.02.2016

Клапауций 322 пишет:

     delay(150);

блять. этот народ безнадёжен. :D

я его пропустил:)

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

James пишет:

Клапауций 322 пишет:

     delay(150);

блять. этот народ безнадёжен. :D

я его пропустил:)

ок. и, класс не пили, пока не убедился, что хоть как-то работает.

класс подключай как библиотеку #186

James
Offline
Зарегистрирован: 26.02.2016

Клапауций 322 пишет:

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

я выпилил 2-е нажатие  и долгое нажатие, а таймер у меня свой вроде как запилен

мне нужны были только нажать отпустить и дребезг

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

James пишет:

я выпилил 2-е нажатие  и долгое нажатие, а таймер у меня свой вроде как запилен

мне нужны были только нажать отпустить и дребезг

это понятно, но зачем? если ты не используешь что-то из класса, то неиспользуемое проигнорируется компиллятором.

James
Offline
Зарегистрирован: 26.02.2016
sketch_mar14a:8: error: 'BUTTON' does not name a type
sketch_mar14a:9: error: 'BUTTON' does not name a type
sketch_mar14a:10: error: 'BUTTON' does not name a type
sketch_mar14a.ino: In function 'void loop()':
sketch_mar14a:101: error: 'BUTTON_05' was not declared in this scope
sketch_mar14a:102: error: 'BUTTON_06' was not declared in this scope
sketch_mar14a:103: error: 'BUTTON_07' was not declared in this scope
 
вот так он у меня ругается на библиотеку:(
Клапауций 322
Offline
Зарегистрирован: 31.12.2015

James пишет:

вот так он у меня ругается на библиотеку:(

всё херня - давай сначала #186

James
Offline
Зарегистрирован: 26.02.2016

вообще никак:( ладно, будет так:) просто строк больше в скетче размер от этого не меняется