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

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

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

vvadim пишет:

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

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

OneButton
короткое нажатие - клик
длительное нажатие - длинный клик

велосипед
короткое нажатие - клик
длительное нажатие - клик, потом длинный клик
 

 

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

vvadim пишет:

OneButton
короткое нажатие - клик
длительное нажатие - длинный клик

велосипед
короткое нажатие - клик
длительное нажатие - клик, потом длинный клик
 

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

if (короткое нажатие) digitalWrite(14, !digitalRead(14));
if (длинное  нажатие) digitalWrite(15, !digitalRead(15));

 

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

меня только это интересует

if (короткое нажатие) digitalWrite(14, HIGH);
if (длинное нажатие)  digitalWrite(14, LOW);

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

vvadim пишет:

меня только это интересует

if (короткое нажатие) digitalWrite(14, HIGH);
if (длинное нажатие)  digitalWrite(14, LOW);

т.е. примера, подтверждающего

vvadim пишет:

OneButton
короткое нажатие - клик
длительное нажатие - длинный клик

не будет?

 

mobistrike
mobistrike аватар
Онлайн
Зарегистрирован: 19.08.2016

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

mobistrike пишет:

А потом искать библиотеку отслеживающую длинный клик.

и ты мне пример напиши, пожалуйста.

Легко .

Пример с библиотекой ClickButton

 

if (button1.click == -1) {
 // Serial.println("long click");
  a0=a0+1;
  }
 
 if (button1.click == 1) {     
 // Serial.println("click");
   a1=a1+1;  
  } 

Код полностью - собирал товарищу треканальный коммутатор видеосигналов на LCD 1202. Упраляет микросхемами la7958n . Длинный клик - выбор источника видео(их 3). Короткий - коммутация между тремя телевизорами от выбранного источника. 

#include "lcd1202.h"
#include "ClickButton.h"

// the LED
//const int ledPin = 13;
//int ledState = 0;

// the Button
const int buttonPin1 = 2;
ClickButton button1(buttonPin1, LOW, CLICKBTN_PULLUP);

// Arbitrary LED function 
//int LEDfunction = 0;
LCD1202 lcd(6, 5, 4, 3);  // RST, CS, MOSI, SCK
int a1=1;
int b1=1;
int c1=1;
int aa=1;





void setup() {
 
lcd.Inicialize();  //Инициализация дисплея
lcd.Clear_LCD();  //Очистка дисплея
//pinMode(ledPin,OUTPUT);  

  // Setup button timers (all in milliseconds / ms)
  // (These are default if not set, but changeable for convenience)
  button1.maxPresses     = 3;    // max button multiclick count
  button1.debounceTime   = 20;   // Debounce timer in ms
  button1.multiclickTime = 250;  // Time limit for multi clicks
  button1.heldDownTime   = 1000; // time until "held-down clicks" register
//Serial.begin(9600);

// выходы на коммутатор
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);

pinMode(9, OUTPUT);
pinMode(10, OUTPUT);

pinMode(11, OUTPUT);
pinMode(12, OUTPUT);

}

void loop() {
 button1.Update();
 



if (button1.click == -1) {
 // Serial.println("long click");
  aa=aa+1;
  }


if (aa>3) {     
 aa=1;     
  } 




//****************первый канал  
 if (aa==1) {     
 if (button1.click == 1) {     
   a1=a1+1;  

  } 
  if (a1>3){
  a1=1;
  }
  }
   
 //*****************************

 //второй канал 
 if (aa==2) {     
 if (button1.click == 1) {     
   b1=b1+1;  

  } 
  if (b1>3){
  b1=1;
  }
  }
//********************************

//третий канал  
 if (aa==3) {     
if (button1.click == 1) {     
   c1=c1+1;  

  } 
  if (c1>3){
  c1=1;
 }
  }
 //*********************************

//..**********************вывод на экран****************** 
lcd.Clear_LCD();  //Очистка дисплея
//***************************************** Рисуем по координатам скругленный прямоугольник *************************************************

lcd.drawRoundRect(1, 10, 30, 50, 10, 1);     //Рисуем скругленный прямоугольник по координатам x, y, высота, ширина, радиус скругления, цвет
lcd.drawRoundRect(32, 10, 30, 50, 10, 1);
lcd.drawRoundRect(63, 10, 30, 50, 10, 1);
//lcd.simb16x32(8, 17, 1, 8);            //Выводим в координаты x, y, цветом 1, цифру 
//lcd.simb16x32(39, 17, 1, 8);   
//lcd.simb16x32(70, 17, 1, 8);  
                            

//********************************************************************************



//****************первый канал  
 if (aa==1) {     
 //******************************************* Рисуем закрашенный, скругленный прямоугольник *************************************************

lcd.fillRoundRect(1, 10, 30, 50, 10, 1);     //Рисуем закрашенный, скругленный прямоугольник по координатам x, y, высота, ширина, радиус скругления, цвет
//lcd.fillRoundRect(32, 10, 30, 50, 10, 1);
//lcd.fillRoundRect(63, 10, 30, 50, 10, 1);
lcd.simb16x32(8, 17, 0, a1);            //Выводим в координаты x, y, цветом 1, цифру 
//lcd.simb16x32(8, 17, 1, 8);            //Выводим в координаты x, y, цветом 1, цифру 
lcd.simb16x32(39, 17, 1, b1);   
lcd.simb16x32(70, 17, 1, c1);  

//**************************************************************
  } 
  
   
 //*****************************

 //второй канал 
 if (aa==2) {     
 //******************************************* Рисуем закрашенный, скругленный прямоугольник *************************************************

//lcd.fillRoundRect(1, 10, 30, 50, 10, 1);     //Рисуем закрашенный, скругленный прямоугольник по координатам x, y, высота, ширина, радиус скругления, цвет
lcd.fillRoundRect(32, 10, 30, 50, 10, 1);
//lcd.fillRoundRect(63, 10, 30, 50, 10, 1);
//lcd.simb16x32(8, 17, 0, 8);            //Выводим в координаты x, y, цветом 1, цифру 
lcd.simb16x32(39, 17, 0, b1);   
lcd.simb16x32(8, 17, 1, a1);            //Выводим в координаты x, y, цветом 1, цифру 
//lcd.simb16x32(39, 17, 1, 8);   
lcd.simb16x32(70, 17, 1, c1);  
//**************************************************************
  }
//********************************

//третий канал  
 if (aa==3) {     
//******************************************* Рисуем закрашенный, скругленный прямоугольник *************************************************

//lcd.fillRoundRect(1, 10, 30, 50, 10, 1);     //Рисуем закрашенный, скругленный прямоугольник по координатам x, y, высота, ширина, радиус скругления, цвет
//lcd.fillRoundRect(32, 10, 30, 50, 10, 1);
lcd.fillRoundRect(63, 10, 30, 50, 10, 1);
//lcd.simb16x32(8, 17, 0, 8);            //Выводим в координаты x, y, цветом 1, цифру 
//lcd.simb16x32(39, 17, 0, 8);   
lcd.simb16x32(70, 17, 0, c1);   
lcd.simb16x32(8, 17, 1, a1);            //Выводим в координаты x, y, цветом 1, цифру 
lcd.simb16x32(39, 17, 1, b1);   
//lcd.simb16x32(70, 17, 1, 8);  
//**************************************************************
  }
 //*********************************
 if (a1==1){
 digitalWrite(7, LOW); 
 digitalWrite(8, LOW);
 }
 if (a1==2){
 digitalWrite(7, HIGH); 
 digitalWrite(8, LOW);
  
 }
 if (a1==3){
  digitalWrite(7, LOW); 
 digitalWrite(8, HIGH);
 
 }
if (b1==1){
 digitalWrite(9, LOW); 
 digitalWrite(10, LOW);
  
 }
 if (b1==2){
 digitalWrite(9, HIGH); 
 digitalWrite(10, LOW);
  
 }
 if (b1==3){
  digitalWrite(9, LOW); 
 digitalWrite(10, HIGH);
  
 }
 if (c1==1){
 digitalWrite(11, LOW); 
 digitalWrite(12, LOW);
  
 }
 if (c1==2){
 digitalWrite(11, HIGH); 
 digitalWrite(12, LOW);
  
 }
 if (c1==3){
  digitalWrite(11, LOW); 
 digitalWrite(12, HIGH);
  
 }


lcd.Update();




}

 

 

 

 

vvadim
Offline
Зарегистрирован: 23.05.2012
#include "OneButton.h"

OneButton start(4, true);

void setup() 
{
  pinMode(13, OUTPUT);
  start.attachClick(Click);
  start.attachLongPressStart(LongPressStart); 
}

void loop() 
{ 
  start.tick();
}

void Click()
{
  digitalWrite(13, HIGH);
}

void LongPressStart()
{
  digitalWrite(13, LOW);
}

 

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

mobistrike пишет:

Легко .

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

if (короткое нажатие) digitalWrite(14, !digitalRead(14));
if (длинное  нажатие) digitalWrite(15, !digitalRead(15));

а не выкладывать все свои исходники.

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

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

vvadim пишет:

#include "OneButton.h"

OneButton start(4, true);

void setup() 
{
  pinMode(13, OUTPUT);
  start.attachClick(Click);
  start.attachLongPressStart(LongPressStart); 
}

void loop() 
{ 
  start.tick();
}

void Click()
{
  digitalWrite(13, HIGH);
}

void LongPressStart()
{
  digitalWrite(13, LOW);
}

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

#include <Click.h>

Click test;

void setup() {
pinMode     (13, OUTPUT      ); // pin LED
pinMode     ( 3, INPUT_PULLUP); // pin button
test.init(!digitalRead(3));
}

void loop() {
test.read(!digitalRead(3), 20, 200, 1000, 1000);
if (test.event_click_Dn     ()) {digitalWrite(14, HIGH);}
if (test.event_inactivity_Dn()) {digitalWrite(14, LOW );}
}

но, я хочу убедиться, что OneButton не генерит клик перед длинным кликом - как мне это сделать? 

vvadim
Offline
Зарегистрирован: 23.05.2012
#include "OneButton.h"

OneButton start(4, true);

void setup() 
{
  pinMode(14, OUTPUT);
  pinMode(15, OUTPUT);
  start.attachClick(Click);
  start.attachLongPressStart(LongPressStart); 
}

void loop() 
{ 
  start.tick();
}

void Click()
{
  digitalWrite(14, !digitalRead(14));
}

void LongPressStart()
{
  digitalWrite(15, !digitalRead(15));
}

 

mobistrike
mobistrike аватар
Онлайн
Зарегистрирован: 19.08.2016

#include "ClickButton.h"

const int buttonPin1 = 2;
ClickButton button1(buttonPin1, LOW, CLICKBTN_PULLUP);
void setup() {
 
  // Setup button timers (all in milliseconds / ms)
  // (These are default if not set, but changeable for convenience)
  button1.maxPresses     = 3;    // max button multiclick count
  button1.debounceTime   = 20;   // Debounce timer in ms
  button1.multiclickTime = 250;  // Time limit for multi clicks
  button1.heldDownTime   = 1000; // time until "held-down clicks" register

pinMode(14, OUTPUT);
pinMode(15, OUTPUT);
digitalWrite(14,LOW);
digitalWrite(15,LOW);
}

void loop() {
 button1.Update();

if (button1.click == -1) {
 digitalWrite(15, !digitalRead(15));
  }
 
 if (button1.click == 1) {     
digitalWrite(14, !digitalRead(14));

  } 
 

}

 

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017
ответ для mobistrike:
библиотека ClickButton не обрабатывает событие отпускания, которое происходит после события неактивности нажатой кнопки.
если ты считаешь такой дизайн поведения нормальным, то ок.
в титановом велосипеде дизайн поведения кнопки всегда будет соответствовать логике причинно-следственных связей, а не чем-либо иным.
Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017
ответ для vvadim:
предоставленный тобой пример обрабатывает отпускание, а не нажатие кнопки.
 
Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

тема ереси закрыта.

источник обнаружен.

vosara
Offline
Зарегистрирован: 08.02.2014

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

1 if (короткое нажатие) digitalWrite(14, !digitalRead(14));
2 if (длинное  нажатие) digitalWrite(15, !digitalRead(15));

 >>

Не знаю может тоже ЕРЕСЬ, но посмотрите и на такое решение. Здесь присутствует антидребезг и пины не 14, 15 а 10, 11 а так выполняет то что Вы заявили

#define button1 3
bool kn1;
bool f_kn1;
bool f_push;
unsigned long currentTime1;
unsigned long currentTime2;
void setup()
{
  Serial.begin(9600);
  pinMode(button1, INPUT_PULLUP);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop()
{
  static bool f_d;
  
  if (!digitalRead(button1) && !f_kn1)
  {
    currentTime1 = millis();
    f_kn1 = 1;
  }
  if ( digitalRead(button1))
  {
    kn1 = 0;
    f_kn1 = 0;
    f_d = 0;
    //f_push = 0;
  }

  if (f_kn1 && millis() - currentTime1 >= 100)
  {
    kn1 = 1;
    if (!f_push && !f_d) {
      currentTime2 = millis();
      f_push = 1;
    }
  }

  if (f_push && !kn1 && millis() - currentTime2 < 500) {
    digitalWrite(10, !digitalRead(10));
    f_push = 0;
  }
  else if (kn1 && !f_d && millis() - currentTime2 > 500) {
    digitalWrite(11, !digitalRead(11));
    f_d = 1;
    f_push = 0;
  }
}

 

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

vosara пишет:

Не знаю может тоже ЕРЕСЬ, но посмотрите и на такое решение.

тоже самое - событие отпускания и событие удержания кнопки.

сам код не есть ересь - если тебе так нужно, так и должно быть.
 
ересью являтеся утверждение, что возможно произвести что-то с кнопкой, предварительно её не нажав и не произвести отпускание в конце.
можно не использовать нажатие и блокировать отпускание - всё.
 
но... нет смысла вписывать все эти оригинальные танцы с бубном в библиотеку потому, что когда тебе понадобится всегда обрабатывать события отпускания кнопки, то тебя удивит странное поведение кнопки - нажал, подержал и не отжалось. О_О
 
 
 
vvadim
Offline
Зарегистрирован: 23.05.2012

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

ответ для vvadim:
предоставленный тобой пример обрабатывает отпускание, а не нажатие кнопки.
 

мне по барабану - нажатие там или отпускание, главное делается то что мне нужно.

mobistrike
mobistrike аватар
Онлайн
Зарегистрирован: 19.08.2016

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

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

Полностью солидарен с vvadim !

Библиотека ClickButton выполняет то что мне нужно , а что  она не обрабатывает мне по барабану.

Никаких сбоев в ее работе не наблюдал.

Засим откланиваюсь.

 

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

это какой-то цирк с конями. :D

#include <Click.h>

Click test;

void setup() {
pinMode     (14, OUTPUT      ); // pin LED
pinMode     (15, OUTPUT      ); // pin LED
pinMode     ( 3, INPUT_PULLUP); // pin button
test.init(!digitalRead(3));
}

void loop() {
test.read(!digitalRead(3), 20, 200, 1000, 1000);
static boolean flag_event_click_Up = 1;
if (test.event_click_Dn     ()                       ) {flag_event_click_Up = 1;                                    }
if (test.event_click_Up     () && flag_event_click_Up) {                         digitalWrite(14, !digitalRead(14));}
if (test.event_inactivity_Dn()                       ) {flag_event_click_Up = 0; digitalWrite(15, !digitalRead(15));}
}
да, да - титановый велосипед не делает то, что вам нужно. 
то, что вам нужно, вы будете делать сами. :D
Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

https://github.com/Klapautsiy/titanium-bicycle-for-button/wiki

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

  • обработанное фильтром дребезга состояние кнопки
  • состояние таймера неактивности ненажатой кнопки
  • состояние таймера неактивности нажатой кнопки
  • событие отпускания
  • событие нажатия
  • событие двойного щелчка
  • событие неактивности ненажатой кнопки
  • событие неактивности нажатой кнопки
Илья73
Offline
Зарегистрирован: 06.09.2013

[quote=Клапауций 112]

Спасибо за велосипед, хорошо идет!

Разобрался.

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

 

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

Илья73 пишет:

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

исходниках комментов более, чем достаточно.

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

файл README.txt опять же.

Илья73
Offline
Зарегистрирован: 06.09.2013

Да все понятно когда разберешься.

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

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

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

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017
duration_inactivity_Up(time) - передача длительности таймера неактивности ненажатой кнопки.
duration_inactivity_Dn(time) - передача длительности таймера неактивности   нажатой кнопки.
event_inactivity_Up() - событие неактивности ненажатой кнопки
event_inactivity_Dn() - событие неактивности   нажатой кнопки

файл README.txt

плюс примеры, плюс имена функций такие, что очень сложно не понять.

Lexan
Offline
Зарегистрирован: 12.02.2016

Увожаемый Клапауцый во первых большое СПАСИБО за ваш труд! Ваш велосипед уже пару раз пригодился мне  в моих проэктах.

 

Но в последнем проэкте возникли определённые сложности. А конкретнее это время реакции кнопок на одиночное нажатие.

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

 

Использую в проэкте только одиночное нажатие. Вот пример:





void loop()

BUTTON_MENU.read();
BUTTON_SELECT.read();


if (BUTTON_MENU.click_down ) 
       {
      ///действие
       }


if (BUTTON_SELECT.click_down && menu == 0 )
                {
        ///действие
        }



if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 0 )
                {
        ///действие
        }

 

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

Lexan пишет:

Но в последнем проэкте возникли определённые сложности. А конкретнее это время реакции кнопок на одиночное нажатие.

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

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

*полный пример - код, который компиллируется.

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

Lexan пишет:

Я прочитал ваши примеры и реадме но так и непонял как...

ты прочитал примеры и файл описания и не увидел как?..

duration_bounce       (time) - передача длительности таймера фильтра дребезга.
duration_click_Db     (time) - передача длительности таймера двойного щелчка.
duration_inactivity_Up(time) - передача длительности таймера неактивности ненажатой кнопки.
duration_inactivity_Dn(time) - передача длительности таймера неактивности   нажатой кнопки.

 

Lexan
Offline
Зарегистрирован: 12.02.2016

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

Lexan пишет:

Я прочитал ваши примеры и реадме но так и непонял как...

ты прочитал примеры и файл описания и не увидел как?..

duration_bounce       (time) - передача длительности таймера фильтра дребезга.
duration_click_Db     (time) - передача длительности таймера двойного щелчка.
duration_inactivity_Up(time) - передача длительности таймера неактивности ненажатой кнопки.
duration_inactivity_Dn(time) - передача длительности таймера неактивности   нажатой кнопки.

 

 

Это я видел. Пробовал убовлять и добавлять время. В основном пропорционально друк к другу. Но эффекта небыло.

Так значит это может быть чтото в моем коде так тормозит кнопки.

Ок сейчас выложу код .

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

Lexan пишет:

Пробовал убовлять и добавлять время. В основном пропорционально друк к другу. Но эффекта небыло.

не пробовать нужно, а настраивать так, как тебе необходимо, а не пропорционально.

эффект настроек вступает в силу после вызова функции настроек.

Lexan
Offline
Зарегистрирован: 12.02.2016

Вот код. Перемещение по меню

Ардуина Мега + Дисплей 320*480 + китайская мембранная клавиатура из шести кнопок подключена без резисторов, опщий к массе центральные к пинам меги.

 

#include <class_BUTTON_01.h>

#include <memorysaver.h>
#include <UTFT.h>


#include <SPI.h>
#include <SdFat.h>          
#include <UTFT_SdRaw.h>     

#define SD_CHIP_SELECT  53 
SdFat sd;                  
#include <max6675.h>
#include <Servo.h>

UTFT myGLCD(CTE32HR, 38, 39, 40, 41); 
                                       
 

extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];
extern uint8_t BigFontRus[];    //Кирилица
 

UTFT_SdRaw myFiles(&myGLCD);


Servo Zaslonka;
int thermo_vcc_pin = 13;
int ktcSO = 12;
int ktcCS = 11;
int ktcCLK = 10;
MAX6675 ktc(ktcCLK, ktcCS, ktcSO);


BUTTON BUTTON_MENU(14);  
BUTTON BUTTON_SELECT(15); 
BUTTON BUTTON_AUTO(16);
BUTTON BUTTON_LEFT(17); 
BUTTON BUTTON_RIGHT(18); 
BUTTON BUTTON_ONOFF(19); 

#define RELAY_01        4     
#define RELAY_POMPA     3  
boolean StatusCold = false;  
boolean relayEnable = false; 




int menu = 0;        
int menuselect = 0;   
int menuregim = 0;    
int menunasos = 0;    
int menugsm = 0;      
int menusecyrity = 0; 
int menubalans = 0;   
int fonstol = 0;      
int fonmenu = 0;      
int oboiselect = 0;   
int oboiregim = 0;    
int nomerfonstol =0;  
int nomerfonmenu = 0; 
int titulmenu = 0;    
int menuregimvn = 0; 
int gsmsignal = 0;    
int zaslonka = 0;     
int nasosregim = 0;  
int nasosavto = 0;  
int securregim = 0; 
int signsostpodduv = 0; 
int signnetelekt = 0;  
int tempnasosastart = 70;
int tempnasosastop = 60;
int xfonstol = 0;  
int xfonmenu = 0;  
int gsmselekt = 0; 
int telefonvkl = 0; 
int balansregim = 0; 


 
void setup()
{
   
  
  // инициализируем дисплей с вертикальной ориентацией
  myGLCD.InitLCD();
  // очищаем экран
  myGLCD.clrScr();
  // выбираем большой шрифт
  myGLCD.setFont(BigFont);
 
  // ждём успешной инициализации SD-карты
  while (!sd.begin(SD_CHIP_SELECT)) {
    // устанавливаем красный цвет «чернил» для печати и рисования
    myGLCD.setColor(VGA_RED);
    // печатаем строку в указанной строке позиции
    myGLCD.print("SD Card ERROR!", CENTER, 100);
    delay(1000);
  }
 
  // устанавливаем зелёный цвет «чернил» для печати и рисования
  myGLCD.setColor(VGA_GREEN);
  // печатаем строку в указанной строке позиции
  myGLCD.print("SD Card OK", CENTER, 90);
  // ждём 1 секунду
  delay(1000);
 
  
  myFiles.load(0, 0, 480, 320, "privet.raw");
  delay(4000);

  pinMode(RELAY_POMPA, OUTPUT);

  Serial.begin(9600);
  pinMode(thermo_vcc_pin, INPUT);
  pinMode(RELAY_01, OUTPUT);
  Zaslonka.attach(5);
  
}
 
void loop()
{


  BUTTON_MENU.read();
  BUTTON_SELECT.read();
  BUTTON_AUTO.read();
  BUTTON_LEFT.read();
  BUTTON_RIGHT.read();
  BUTTON_ONOFF.read();

  

  if (BUTTON_MENU.click_down ) 
       {
        menu++;
        
        if(menu > 1)
        {
          menu = 0;
          }
        if(menu == 0)
        {  
        fonstol = xfonstol;
        }
        if(menu == 1)
        {
          fonmenu = xfonmenu;
          }
          nasosregim = 0;
          titulmenu = 0;        
          menuregimvn = 0;
          oboiregim = 0;
          securregim = 0;
          gsmselekt = 0;
          balansregim = 0;
       }
   
       

   if (BUTTON_RIGHT.click_down && menu == 1 && oboiregim == 0 && nasosregim == 0 && securregim == 0 && menuregimvn == 0 && gsmselekt == 0 && balansregim == 0) 
       {
        titulmenu++;
        if(titulmenu > 5)
        {
          titulmenu = 0;
          }
          fonmenu = xfonmenu;
        }

     if (BUTTON_LEFT.click_down && menu == 1 && oboiregim == 0 && nasosregim == 0 && securregim == 0 && menuregimvn == 0 && gsmselekt == 0 && balansregim == 0) 
       {
        titulmenu = titulmenu -1;
        if(titulmenu < 0)
        {
          titulmenu = 5;
         
          }
          fonmenu = xfonmenu;
        }
   
   if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 0 ) 
                {
        menuregimvn++;
        if(menuregimvn > 4)
        {
          menuregimvn = 0;
          }
        }
  

    if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 1  ) 
                {
                 
                 nasosregim++;
                 if(nasosregim > 3)
                 {
                  nasosregim = 0;
                  }



                   
            if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 1) 
       {
            nasosavto++;
            if(nasosavto > 1)
            {
              nasosavto = 0;
              }
              
        }

        if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 1) 
       {
            nasosavto = nasosavto -1;
            if(nasosavto < 0)
            {
              nasosavto = 1;
              }
              
        }

   

        if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 2)
       {
            tempnasosastart++;
            if(tempnasosastart > 85)
            {
            tempnasosastart = 85;
            }
           
              
        }

        if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 2) 
       {
           
           tempnasosastart = tempnasosastart -1;
            if(tempnasosastart < 50)
            {
            tempnasosastart = 50;
            }
           
              
        }
        

        if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 3) 
       {
           
           tempnasosastop++;
            if(tempnasosastop > 90)
            {
            tempnasosastop = 70;
            }
           
           
               
        }

        if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 3)
       {
           tempnasosastop = tempnasosastop -1;
            if(tempnasosastop < 60)
            {
            tempnasosastop = 60;
            }
                 
        }


                

    if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 2 )
                {
          securregim++;
          if(securregim > 5)
          {
            securregim = 0;
            }
                }
    if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 2 && securregim == 3 )
            
               {
                signsostpodduv++;
                if(signsostpodduv > 1)
                {
                  signsostpodduv = 0;
                  }
                }
    if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 2 && securregim == 3 )
            
               {
                signsostpodduv = signsostpodduv -1;
                if(signsostpodduv < 0)
                {
                  signsostpodduv = 1;
                  }           
               }

    if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 2 && securregim == 4 )
            
               {
                signnetelekt++;
                if(signnetelekt > 1)
                {
                  signnetelekt = 0;
                  }
                }
    if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 2 && securregim == 4 )
            
               {
                signnetelekt = signnetelekt -1;
                if(signnetelekt < 0)
                {
                  signnetelekt = 1;
                  }           
               }

               
     
                
    if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 3 )
                {
          gsmselekt++;
          if(gsmselekt > 5)
          {
            gsmselekt = 0;
            }
                }
    if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 3 && gsmselekt == 5 )
            
               {
                telefonvkl++;
                if(telefonvkl > 1)
                {
                  telefonvkl = 0;
                  }
                }
    if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 3 && gsmselekt == 5 )
            
               {
                telefonvkl = telefonvkl -1;
                if(telefonvkl < 0)
                {
                  telefonvkl = 1;
                  }           
               }



         

       
          

       if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 4 && oboiregim == 1) 
       {
        xfonmenu = xfonmenu -1;
                  if(xfonmenu < 0)
                   {
                 xfonmenu = 16;
                   }
                  fonmenu = xfonmenu;
        }

       if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 4 && oboiregim == 1) 
       {
        xfonmenu++;
                  if(xfonmenu > 16)
                   {
                 xfonmenu = 0;
                   }
                  fonmenu = xfonmenu;
        }
        
          

       if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 4 && oboiregim == 2)
       {
        xfonstol = xfonstol -1;
                  if(xfonstol < 0)
                   {
                 xfonstol = 16;
                   }
                  fonstol = xfonstol;
        } 

        if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 4 && oboiregim == 2)
       {
        xfonstol++;
                  if(xfonstol > 16)
                   {
                 xfonstol = 0;
                   }
                  fonstol = xfonstol;
        }


    if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 4 )
                {
                 oboiregim++;
                 if(oboiregim > 2)
                   {
                 oboiregim = 0;
                   }
            
                }

     if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 5 ) 
                {
          balansregim++;
          if(balansregim > 1)
          {
            balansregim = 0;
            }
                }

        
   
   if(menu == 0) 
   {
    
      

      if (BUTTON_SELECT.click_down && menu == 0)
       {
        menuselect++;
        if(menuselect > 4)
        {
          menuselect = 0;
          }
        }


    switch(fonstol){
     case 0:  
              myFiles.load(0, 0, 480, 320, "pi.raw");
              xfonstol = 0;
              break;
     case 1: 
              myFiles.load(0, 0, 480, 320, "a4.raw");
              xfonstol = 1;
              break;
               
     case 2:  
              myFiles.load(0, 0, 480, 320, "22.raw");
              xfonstol = 2;
              break;

     case 3:   
              myFiles.load(0, 0, 480, 320, "ma.raw");
              xfonstol = 3;
              break;

     case 4:  
              myFiles.load(0, 0, 480, 320, "a2.raw");
              xfonstol = 4;
              break;
                         
     case 5:  
              myFiles.load(0, 0, 480, 320, "a3.raw");
              xfonstol = 5;
              break;
     case 6:        
              myFiles.load(0, 0, 480, 320, "a4.raw");
              xfonstol = 6;
              break;
     case 7:
              myFiles.load(0, 0, 480, 320, "a5.raw");
              xfonstol = 7;
              break;
     case 8:         
              myFiles.load(0, 0, 480, 320, "ot.raw");
              xfonstol = 8;
              break;
     case 9:         
              myFiles.load(0, 0, 480, 320, "t3.raw");
              xfonstol = 9;
              break;

     case 10:   
              myFiles.load(0, 0, 480, 320, "a11.raw");
              xfonstol = 10;
              break;

     case 11:  
              myFiles.load(0, 0, 480, 320, "a2.raw");
              xfonstol = 11;
              break;
                         
     case 12:  
              myFiles.load(0, 0, 480, 320, "a3.raw");
              xfonstol = 12;
              break;
     case 13:        
              myFiles.load(0, 0, 480, 320, "a4.raw");
              xfonstol = 13;
              break;
     case 14:
              myFiles.load(0, 0, 480, 320, "a5.raw");
              xfonstol = 14;
              break;
     case 15:         
              myFiles.load(0, 0, 480, 320, "a6.raw");
              xfonstol = 15;
              break;
     case 16:         
              myFiles.load(0, 0, 480, 320, "a7.raw");
              xfonstol = 16;
              break;         
     
    }

    fonstol = 30;
        
    myFiles.load(5, 70, 55, 55, "reg.raw");
    myFiles.load(5, 130, 55, 55, "top.raw");
    myFiles.load(5, 190, 57, 52, "dom.raw");
    myFiles.load(5, 250, 55, 55, "ul.raw");
    


switch(menuselect){
     case 0:  
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("1",65, 78);
              break;
     case 1: 
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_GREEN);
              myGLCD.textRus("2",65, 78);
              myGLCD.setFont(SevenSegNumFont);
              break;
               
     case 2:  
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(255,165,0);
              myGLCD.textRus("3",65, 78);
              myGLCD.setFont(SevenSegNumFont);
              break;

     case 3:   
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(240,128,128);
              myGLCD.textRus("4",65, 78);
              myGLCD.setFont(SevenSegNumFont);
              break;

     case 4:  
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("5",65, 78);
              myGLCD.setFont(SevenSegNumFont);
              break;           
     }

    
    myGLCD.setFont(BigFontRus);
    myGLCD.setColor(VGA_LIME);
    myGLCD.textRus("Темп",65, 150);
    myGLCD.setColor(VGA_LIME);
    myGLCD.textRus("Темп",65, 210);
    myGLCD.setColor(VGA_LIME);
    myGLCD.textRus("Темп",65, 270);

    myGLCD.setFont(SevenSegNumFont);
    myGLCD.setColor(VGA_LIME);
    myGLCD.print("92",150,130);
    myGLCD.setColor(VGA_LIME);
    myGLCD.print("25",150,190);
    myGLCD.setColor(VGA_LIME);
    myGLCD.print("35",150,250);

    
    
    

     if(gsmsignal == 0) 
     {
       myFiles.load(435, 0, 45, 33, "minigreen0.raw");
      }
      
     if(gsmsignal > 0 && gsmsignal < 20)
     {
       myFiles.load(435, 0, 45, 33, "minigreen20.raw");
       }

      if(gsmsignal > 20 && gsmsignal < 40)
     {
       myFiles.load(435, 0, 45, 33, "minigreen40.raw");
       }

      if(gsmsignal > 40 && gsmsignal < 60)
     {
       myFiles.load(435, 0, 45, 33, "minigreen60.raw");
       }

      if(gsmsignal > 60 && gsmsignal < 80)
     {
       myFiles.load(435, 0, 45, 33, "minigreen80.raw");
       }

      if(gsmsignal > 80 && gsmsignal < 100)
     {
       myFiles.load(435, 0, 45, 33, "minigreen100.raw");
       }

       if(gsmsignal == 100)
     {
       myFiles.load(435, 0, 45, 33, "minigreen100.raw");
       }
       
    }

                                              


   if(menu == 1) 
   {
   
     

     switch(fonmenu){
     case 0:  
              myFiles.load(0, 0, 480, 320, "22b.raw");
              xfonmenu = 0;
              break;
     case 1: 
              myFiles.load(0, 0, 480, 320, "4b.raw");
              xfonmenu = 1;
              break;
               
     case 2:  
              myFiles.load(0, 0, 480, 320, "22b.raw");
              xfonmenu = 2;
              break;

     case 3:   
              myFiles.load(0, 0, 480, 320, "ab.raw");
              xfonmenu = 3;
              break;

     case 4:  
              myFiles.load(0, 0, 480, 320, "3b.raw");
              xfonmenu = 4;

              break;           
     case 5:  
              myFiles.load(0, 0, 480, 320, "ab.raw");
              xfonmenu = 5;

              break;
     case 6:        
              myFiles.load(0, 0, 480, 320, "3b.raw");
              xfonmenu = 6;

              break;
     case 7:
              myFiles.load(0, 0, 480, 320, "5b.raw");
              xfonmenu = 7;

              break;
     case 8:         
              myFiles.load(0, 0, 480, 320, "tb.raw");
              xfonmenu = 8;

              break;
     case 9:         
              myFiles.load(0, 0, 480, 320, "3b.raw");
              xfonmenu = 9;

              break;

      case 10:   
              myFiles.load(0, 0, 480, 320, "11b.raw");
              xfonmenu = 10;
              break;

     case 11:  
              myFiles.load(0, 0, 480, 320, "2b.raw");
              xfonmenu = 11;
              break;
                         
     case 12:  
              myFiles.load(0, 0, 480, 320, "3b.raw");
              xfonmenu = 12;
              break;
     case 13:        
              myFiles.load(0, 0, 480, 320, "4b.raw");
              xfonmenu = 13;
              break;
     case 14:
              myFiles.load(0, 0, 480, 320, "5b.raw");
              xfonmenu = 14;
              break;
     case 15:         
              myFiles.load(0, 0, 480, 320, "6b.raw");
              xfonmenu = 15;
              break;
     case 16:         
              myFiles.load(0, 0, 480, 320, "7b.raw");
              xfonmenu = 16;
              break;                 
    }        

     fonmenu = 30;
     
     myFiles.load(10, 255, 55, 55, "regim.raw");
     myFiles.load(75, 255, 55, 55, "nasos.raw");
     myFiles.load(140, 255, 55, 55, "secur.raw");
     myFiles.load(205, 255, 55, 55, "gpsst.raw");
     myFiles.load(270, 255, 55, 55, "ob.raw");
     myFiles.load(335, 255, 55, 55, "bal.raw");



     switch(titulmenu){     
     case 0:  
              myFiles.load(315, 5, 160, 51, "menu.raw");
              
              
              break;
     case 1: 
              myFiles.load(315, 5, 160, 51, "menu1.raw");
              
              break;
               
     case 2:  
              myFiles.load(315, 5, 160, 51, "menu2.raw");
              
              break;

     case 3:   
              myFiles.load(315, 5, 160, 51, "menu3.raw");
              
              break;

     case 4:  
              myFiles.load(315, 5, 160, 51, "menu4.raw");

              break;           
     case 5:  
              myFiles.load(315, 5, 160, 51, "menu5.raw");

              break;
     
    }        

    

     myFiles.load(5, 60, 30, 30, "tochka1.raw");

     myFiles.load(5, 95, 30, 30, "tochka2.raw");
  
     myFiles.load(5, 130, 30, 30, "tochka3.raw");

     myFiles.load(5, 165, 30, 30, "tochka4.raw");
  
     myFiles.load(5, 200, 30, 30, "tochka5.raw");
  
    

              
       

         if(titulmenu == 0)
         {
             switch(menuregimvn){            
     case 0:  
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("РЕЖИМ 1",40, 65);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 2",40, 100);
              myGLCD.textRus("РЕЖИМ 3",40, 135);
              myGLCD.textRus("РЕЖИМ 4",40, 170);
              myGLCD.textRus("РЕЖИМ 5",40, 205);
              
              
              break;
     case 1: 
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 1",40, 65);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("РЕЖИМ 2",40, 100);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 3",40, 135);
              myGLCD.textRus("РЕЖИМ 4",40, 170);
              myGLCD.textRus("РЕЖИМ 5",40, 205);
              
              break;
               
     case 2:  
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 1",40, 65);
              myGLCD.textRus("РЕЖИМ 2",40, 100);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("РЕЖИМ 3",40, 135);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 4",40, 170);
              myGLCD.textRus("РЕЖИМ 5",40, 205);

              
              break;

     case 3:  myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 1",40, 65);
              myGLCD.textRus("РЕЖИМ 2",40, 100);
              myGLCD.textRus("РЕЖИМ 3",40, 135);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("РЕЖИМ 4",40, 170);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 5",40, 205);
             
              
              break;

     case 4:  myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 1",40, 65);
              myGLCD.textRus("РЕЖИМ 2",40, 100);
              myGLCD.textRus("РЕЖИМ 3",40, 135);
              myGLCD.textRus("РЕЖИМ 4",40, 170);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("РЕЖИМ 5",40, 205);
              

              break;
             }

         }
             
           ///---------------------------------------------------------------------------------------------------------------

             if(titulmenu == 1)
             {
              switch(nasosregim){       
     case 0:  
            
                if(nasosavto == 0)
              {
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ НАСОСА АВТО",40, 65);
              }
              if(nasosavto == 1) 
              {   
               myGLCD.setFont(BigFontRus);
               myGLCD.setColor(VGA_LIME);
               myGLCD.textRus("РУЧНОЙ РЕЖИМ     ",40, 65);
              }
                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("ТЕМПЕРАТУРА ВКЛ=",40, 135);
                myGLCD.textRus("ТЕМПЕРАТУРА ВЫКЛ=",40, 205);
               
               break;
     case 1: 

             if(nasosavto == 0)
              {
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("РЕЖИМ НАСОСА АВТО",40, 65);
              }
              if(nasosavto == 1) 
              {   
               myGLCD.setFont(BigFontRus);
               myGLCD.setColor(VGA_RED);
               myGLCD.textRus("РУЧНОЙ РЕЖИМ     ",40, 65);
              } 
             
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("ТЕМПЕРАТУРА ВКЛ=",40, 135);
              myGLCD.textRus("ТЕМПЕРАТУРА ВЫКЛ=",40, 205);
             
             break;

     case 2: 
                  if(nasosavto == 0)
              {
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ НАСОСА АВТО",40, 65);
              }
              if(nasosavto == 1) 
              {   
               myGLCD.setFont(BigFontRus);
               myGLCD.setColor(VGA_LIME);
               myGLCD.textRus("РУЧНОЙ РЕЖИМ     ",40, 65);
              } 
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("ТЕМПЕРАТУРА ВКЛ=",40, 135);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("ТЕМПЕРАТУРА ВЫКЛ=",40, 205);
             
             break;
          case 3:  

                if(nasosavto == 0)
              {
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ НАСОСА АВТО",40, 65);
              }
              if(nasosavto == 1) 
              {   
               myGLCD.setFont(BigFontRus);
               myGLCD.setColor(VGA_LIME);
               myGLCD.textRus("РУЧНОЙ РЕЖИМ     ",40, 65);
              } 

                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("ТЕМПЕРАТУРА ВКЛ=",40, 135);
                myGLCD.setColor(VGA_RED);
                myGLCD.textRus("ТЕМПЕРАТУРА ВЫКЛ=",40, 205);
                
              
              break; 
              
              }
              myGLCD.setFont(SevenSegNumFont);
              myGLCD.setColor(VGA_LIME);
              myGLCD.printNumI(tempnasosastart,325,115);    

              myGLCD.setFont(SevenSegNumFont);
              myGLCD.setColor(VGA_LIME);
              myGLCD.printNumI(tempnasosastop,325,190); 

             }
             ///----------------------------------------------------------------------------------------------------
              if(titulmenu == 2)
             {
               switch(securregim)
               {
               case 0:
                      
                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ ",40, 65);
                myGLCD.textRus("СИГНАЛ ",40, 100);
                if(signsostpodduv == 0)
                 {
                myGLCD.textRus("СИГНАЛ  ",40, 135);                
                 }
                 if(signsostpodduv == 1)
                 {
                  myGLCD.textRus("СИГНАЛ ",40, 135);
                  }

                if(signnetelekt == 0)
                 {
                myGLCD.textRus("СИГНАЛ  ",40, 170);                
                 }
                 if(signnetelekt == 1)
                 {
                  myGLCD.textRus("СИГНАЛ ",40, 170);
                  } 
                myGLCD.textRus("ЗАЩИТА ",40, 205);               
                break;
                
               case 1:
                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_RED);
                myGLCD.textRus("СИГНАЛ ",40, 65);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ ",40, 100);
                if(signsostpodduv == 0)
                 {
                myGLCD.textRus("СИГНАЛ ",40, 135);                
                 }
                 if(signsostpodduv == 1)
                 {
                  myGLCD.textRus("СИГНАЛ ",40, 135);
                  }
                if(signnetelekt == 0)
                 {
                myGLCD.textRus("СИГНАЛ  ",40, 170);                
                 }
                 if(signnetelekt == 1)
                 {
                  myGLCD.textRus("СИГНАЛ",40, 170);
                  }
                myGLCD.textRus("ЗАЩИТА ",40, 205);
                 
                  break;
               case 2:
                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ ",40, 65);
                myGLCD.setColor(VGA_RED);
                myGLCD.textRus("СИГНАЛ ",40, 100);
                 myGLCD.setColor(VGA_LIME);
                if(signsostpodduv == 0)
                 {
                myGLCD.textRus("СИГНАЛ ",40, 135);                
                 }
                 if(signsostpodduv == 1)
                 {
                  myGLCD.textRus("СИГНАЛ ",40, 135);
                  }
                if(signnetelekt == 0)
                 {
                myGLCD.textRus("СИГНАЛ  ",40, 170);                
                 }
                 if(signnetelekt == 1)
                 {
                  myGLCD.textRus("СИГНАЛ ",40, 170);
                  }
                myGLCD.textRus("ЗАЩИТА ",40, 205);

               
                  break;

               case 3:
                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ ",40, 65);
                myGLCD.textRus("СИГНАЛ ",40, 100);
                 
                 if(signsostpodduv == 0)
                 {
                myGLCD.setColor(VGA_RED);
                myGLCD.textRus("СИГНАЛ ",40, 135);                
                 }
                 if(signsostpodduv == 1)
                 {
                  myGLCD.setColor(VGA_RED);
                  myGLCD.textRus("СИГНАЛ ",40, 135);
                  }
                
                if(signnetelekt == 0)
                 {
                  myGLCD.setColor(VGA_LIME);
                  myGLCD.textRus("СИГНАЛ  ",40, 170);                
                 }
                 if(signnetelekt == 1)
                 {
                  myGLCD.setColor(VGA_LIME);
                  myGLCD.textRus("СИГНАЛ ",40, 170);
                  }
                  
                  myGLCD.textRus("ЗАЩИТА ",40, 205);


                  break;
               case 4:
                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ ",40, 65);
                myGLCD.textRus("СИГНАЛ ",40, 100);
                
                if(signsostpodduv == 0)
                 {
                  myGLCD.setColor(VGA_LIME);
                  myGLCD.textRus("СИГНАЛ  ",40, 135);                
                 }
                 if(signsostpodduv == 1)
                 {
                  myGLCD.setColor(VGA_LIME);
                  myGLCD.textRus("СИГНАЛ ",40, 135);
                  }
                 
                if(signnetelekt == 0)
                 {
                  myGLCD.setColor(VGA_RED);
                  myGLCD.textRus("СИГНАЛ ",40, 170);                
                 }
                 if(signnetelekt == 1)
                 {
                  myGLCD.setColor(VGA_RED);
                  myGLCD.textRus("СИГНАЛ ",40, 170);
                  }
                  
                 myGLCD.setColor(VGA_LIME);
                 myGLCD.textRus("ЗАЩИТА ",40, 205);


                  break;
               case 5: 
                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ ",40, 65);
                myGLCD.textRus("СИГНАЛ ",40, 100);
                if(signsostpodduv == 0)
                 {
                  myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ ",40, 135);                
                 }
                if(signsostpodduv == 1)
                 {
                  myGLCD.setColor(VGA_LIME);
                  myGLCD.textRus("СИГНАЛ ",40, 135);
                  }
                if(signnetelekt == 0)
                 {
                  myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ  ",40, 170);                
                 }
                 if(signnetelekt == 1)
                 {
                  myGLCD.setColor(VGA_LIME);
                  myGLCD.textRus("СИГНАЛ ",40, 170);
                  }
                 myGLCD.setColor(VGA_RED);
                myGLCD.textRus("ЗАЩИТА ",40, 205); 


                  break;
             }  
              }


              
              



              }


              if(titulmenu == 4)  
             {

              switch(oboiregim){           
     case 0:  
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("МЕНЮ=",40, 65);
              myGLCD.textRus("СТОЛ=",40, 100);
              myGLCD.setFont(BigFont);
              myGLCD.setColor(VGA_LIME);
              myGLCD.printNumI(xfonmenu,202, 65);
              myGLCD.printNumI(xfonstol,330, 100);
              
              
              
              break;
     case 1: 
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("МЕНЮ=",40, 65);
              myGLCD.setFont(BigFont);
              myGLCD.setColor(VGA_RED);
              myGLCD.printNumI(xfonmenu,202, 65);
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("СТОЛ=",40, 100);
              myGLCD.setFont(BigFont);
              myGLCD.setColor(VGA_LIME);
              myGLCD.printNumI(xfonstol,330, 100);
              
              break;

     case 2: 
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("МЕНЮ=",40, 65);
              myGLCD.setColor(VGA_LIME);
              myGLCD.printNumI(xfonmenu,202, 65);
              myGLCD.setFont(BigFontRus);
     
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("СТОЛ=",40, 100);
              myGLCD.setColor(VGA_RED);
              myGLCD.printNumI(xfonstol,330, 100);
              
              break;          
              
              }
     
 
              
           }     
      
            
   }
    

       






    
}

 

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

Lexan пишет:

Вот код. Перемещение по меню

я просил код, демонстрирующий неполадки.

*ещё за запостишь простыню в 1200 строк и уйдёшь на йух.

Lexan пишет:

#include <class_BUTTON_01.h>

в библиотеке титановый велосипед для кнопки. (v 7.0) нет такого файла.

Lexan
Offline
Зарегистрирован: 12.02.2016

Эт я просто переименовал чтоб с первой версией библиотеки неспутать.

Lexan
Offline
Зарегистрирован: 12.02.2016

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

я просил код, демонстрирующий неполадки.

 

Ну этот код точно дает неполадки ... )

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

Lexan пишет:

Эт я просто переименовал чтоб с первой версией библиотеки неспутать.

ок. пиши демо неполадок для последней версии библиотеки.

*со светодиодиком, например - нажатием включаем/выключаем. digitalWrite(13, !digitalRead(13)); и оно у тебя нестабильно.

Lexan
Offline
Зарегистрирован: 12.02.2016

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

Lexan пишет:

Эт я просто переименовал чтоб с первой версией библиотеки неспутать.

ок. пиши демо неполадок для последней версии библиотеки.

*со светодиодиком, например - нажатием включаем/выключаем. digitalWrite(13, !digitalRead(13)); и оно у тебя нестабильно.

 

Хммм... Со светодиодиком говориш. А это мысль щас попробую...

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

Lexan пишет:

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

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

если тяжело нарисовать, то просто скажи - подключено так, но без резисторов

https://github.com/Klapautsiy/titanium-bicycle-for-button/wiki

Lexan
Offline
Зарегистрирован: 12.02.2016

Спасибо дружище. Ты был прав! Убрал из кода все ифы и свичи. Оставил только те что обрабатывали нажатие кнопок. И добавил  вывод в сериал. 

И вот все тормоза как рукой сняло. Велосипед отрабатывает просто идеально!!!!

А с кодом моим беда какаято. Блин чтож он так кнопки притормаживает. Неужели изза того что слишком длинный???  :/

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

Lexan пишет:

Блин чтож он так кнопки притормаживает. Неужели изза того что слишком длинный???  :/

не из-за того, что длинный, а из-за того, что медленный.

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

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

пока повозки, гружёные кодом пересекали маковые плантации, написал тебе проверочное - внезапно у тебя как-то не так:


#include <Button.h>

Button test;

void setup() {

pinMode(13, OUTPUT); // LED_01

test.button( 4, 5, 6, 7, 8, 9); // номера пинов, к которым подключены кнопки
test.duration_bounce(20);       // настройка длительности фильтра дребезга
test.pullUp();                  // подтяжка пинов кнопок к питанию

}

void loop() {
test.read();
if (test.button[0].event_click_Dn())  digitalWrite(13, !digitalRead(13));
if (test.button[1].event_click_Dn())  digitalWrite(13, !digitalRead(13));
if (test.button[2].event_click_Dn())  digitalWrite(13, !digitalRead(13));
if (test.button[3].event_click_Dn())  digitalWrite(13, !digitalRead(13));
if (test.button[4].event_click_Dn())  digitalWrite(13, !digitalRead(13));
if (test.button[5].event_click_Dn())  digitalWrite(13, !digitalRead(13));
}

 

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

del

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

del

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Всем желаю здравия. 

Клапауций 999  решил  поюзать твой велосипед, нужно сделать на одной кнопке 4 разных события:

1. Короткое нажатие

2. двойное нажатие

3. длинное нажатие

4. и ооочень длинное нажатие

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

 

 

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

переменные

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

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

https://github.com/Klapautsiy/titanium-bicycle-for-button/wiki

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

персональный цирк с конями будете строить сами #468

 

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Сразу цирк с канями :)

Все же просто решается, надо в Click.h добавить time_button = stop - start; по последнему событию.

И вывести её "на гара". Просто вам это проще было - бы встроить, вы библиотеку писали. Ну да ладно сам разберусь как там у вас из нутри.

И ни каких танцев с бубнами.

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

Dmti пишет:

Сразу цирк с канями :)

Все же просто решается, надо в Click.h добавить time_button = stop - start; по последнему событию.

И вывести её "на гара". Просто вам это проще было - бы встроить, вы библиотеку писали. Ну да ладно сам разберусь как там у вас из нутри.

И ни каких танцев с бубнами.

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

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

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

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Ну, первое понятно - сделать несколько событий при отпускании кнопки по времени. Второе - при длительном удержании счет числа увеличивается сначала на один, потом на 5, потом на 10, ну и т.д. Бывает удобно. Да и гибкости твоей библиотеке добавилось бы. Мне 100 кнопок не нужно хватит 9. :))

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

Dmti пишет:

Ну, первое понятно - сделать несколько событий при отпускании кнопки по времени. Второе - при длительном удержании счет числа увеличивается сначала на один, потом на 5, потом на 10, ну и т.д. Бывает удобно. Да и гибкости твоей библиотеке добавилось бы. Мне 100 кнопок не нужно хватит 9. :))

даже спорить уже скучно и что-то объяснять...

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

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

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Согласен можно и так. А "на гара" start увидеть можно?

 

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

Dmti пишет:

Согласен можно и так. А "на гара" start увидеть можно?

для примера https://github.com/Klapautsiy/titanium-bicycle-for-button/blob/BUTTON-v7.1/examples/Button/Button.ino будет звучать так test.button[0].start для первой кнопки. 

¯\_(ツ)_/¯

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Вот именно так сижу и пробую

 bt.read();
    if (bt.button[0].event_click_Dn () == 1) {
        float btt = bt.button[0].start;
        Serial.println(btt);
        }

  и почемуто пока только "0" получаю

Клапауций 112
Клапауций 112 аватар
Онлайн
Зарегистрирован: 01.03.2017

Dmti пишет:

и почемуто пока только "0" получаю

не знаю - лечи свой сериал. в индикатор всё красиво отображается

lcd.setCursor(0, 0);
if (test.matrix[0][0].event_click_Dn() == 1) {lcd.print(test.matrix[0][0].start);}