LiquidMenu для создания меню

LelSPB
Offline
Зарегистрирован: 13.04.2020

Приветствую знатоки, возможно кому то приходилось разбираться с этой библиотекой? 

https://radioprog.ru/post/354

github: https://github.com/VaSe7u/LiquidMenu

Необходимо реализовать меню с возможностью изменения параметров. Все это должно работать через энкодер.

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

Дальше хотел использовать : get_currentScreen()

if ( menuSetup.get_currentScreen() == "BoxReset" )
      {
        grovDay++;
        digitalWrite(in1, LOW);
      }

но ничего не получается.


#include <Wire.h> 
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <dht.h>
#include <DallasTemperature.h>
#include <iarduino_RTC.h> 
#include <RBDdimmer.h>
#include <GyverEncoder.h>
#include <LiquidMenu.h>


// подключаем encoder
#define CLK 8
#define DT 9
#define SW 10
Encoder enc(CLK, DT, SW);

int value = 0; // переменная для энкодера

// Определяем экран
LiquidCrystal_I2C lcd(0x27, 16, 2); 

// определяем часы
iarduino_RTC time(RTC_DS3231); 

// диммер
#define zerocross  2
#define outputPin  13
dimmerLamp dimmer(outputPin); 

// DHT22 температурный датчик
dht DHT; 

// герметичный датчик
#define ONE_WIRE_BUS 1
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// модуль реле
int in1 = 4; // реле контакт 1
int in2 = 5; // реле контакт 2
int in3 = 6; // реле контакт 3
int in4 = 7; // реле контакт 4

// переменные для управления системой

int w,i = 0;
int flag = 0;

int grovDay = 10; // количество дней
char* grovStep = "VEGA";
char* grovType = "auto "; // photo
int lightDay = 18; // свет
float tempWather = 0; // температура воды
float tempBox = 0; // температура
float hBox = 0; // влажность


// Меню

// Меню состояние системы
LiquidLine welcomLine(3,0, " Box ");

LiquidLine welcomLine1(0,1,"Step:", grovStep ," Day:", grovDay);
LiquidScreen welcomScreen (welcomLine,welcomLine1);

LiquidLine typeGrove(0,1,"Type:", grovType," H:", lightDay);
LiquidScreen typeGroveScrean (welcomLine,typeGrove);

LiquidLine tempConesBox1(0,1,"t:", tempBox, " h:", hBox);
LiquidScreen tempBoxScreen (welcomLine,tempConesBox1);

LiquidLine tempWatherBox(3,0, "Hudroponic");
LiquidLine tempWatherBox1(0,1, "T:", tempWather, " PH:");
LiquidScreen tempWatherBoxScrean (tempWatherBox,tempWatherBox1);

LiquidMenu menu(lcd, welcomScreen, typeGroveScrean, tempWatherBoxScrean, tempBoxScreen);

// меню настройки системы
LiquidLine conesBoxSetup(0,0, " Box Setup ");
LiquidLine conesBoxSetup1(0,1,"Type:A", " Light:", lightDay);
LiquidScreen BoxSetup (conesBoxSetup,conesBoxSetup1);


LiquidLine conesBoxReset(0,0, " Box Reset ");
LiquidLine conesBoxReset1(0,1,"New Grow?", lightDay);
LiquidScreen BoxReset (conesBoxReset,conesBoxReset1);

//добавляем экраны в меню
LiquidMenu menuSetup(lcd, BoxSetup, BoxReset);
//добавляем меню в систему
LiquidSystem menu_system(menu, menuSetup);

// Вернемся на основной экран
void go_back() {
	menu_system.change_menu(menu);
}
// ротация меню
void switchScrean(){
  if (i == 25)
  {
    menu.next_screen();
  }
  if (i == 50)
  {
    menu.next_screen();
  }
  if (i == 75)
  {
    menu.next_screen();
  }
  if (i == 100)
  {
    menu.next_screen();
    i=0;
  }
  i++;
}
// получаем температуры по датчикам и в глобальные переменные
void getTemperature(){
  DHT.read2302(22);
  sensors.requestTemperatures();
  tempBox = DHT.temperature;
  hBox = DHT.humidity;
  tempWather = sensors.getTempCByIndex(0);
}

void testMenu(){
  
    grovDay++;
   
}


void setup()
{
  // Инициализируем экран
  lcd.begin();

  // Инициализируем модуль времени 
  time.begin();

  // подключение энкодера
  
  enc.setType(TYPE2);
  enc.setTickMode(AUTO);

  // подключение диммера
  dimmer.begin(NORMAL_MODE, ON);
  dimmer.setPower(20);

  // инициализация контактов для модуля реле
  pinMode(in1, OUTPUT);
  digitalWrite(in1, HIGH);

  // меню
  // инициализируем меню
 
  conesBoxReset1.attach_function(2,testMenu);
  
  menu_system.update(); 
}
void loop()
{
  getTemperature();

  if (flag == 0)
  {
    switchScrean();
    menu.softUpdate();
  }
  
  if (enc.isRight()) {
    menuSetup.next_screen();
    // flag =0;
    };      // если был поворот направо, увеличиваем на 1
  // if (enc.isLeft()) menu.previous_screen();      // если был поворот налево, уменьшаем на 1
  // // dimmer.setPower(value);
  // if (enc.isRightH()) value += 5;    // если было удержание + поворот направо, увеличиваем на 5
  // if (enc.isLeftH()) value -= 5;     // если было удержание + поворот налево, уменьшаем на 5
  if (enc.isPress()) {
    // value = 0; 
    // dimmer.setPower(20);
    // menu.next_screen();
    if ( menuSetup.get_currentScreen() == "BoxReset" )
      {
        grovDay++;
        digitalWrite(in1, LOW);
      }
    flag =1;
    menu_system.change_menu(menuSetup);
    };

  if (enc.isHolded()) {
    go_back();
  };

   
  if (tempWather > 26){
    digitalWrite(in1, LOW);
    dimmer.setPower(40);
  }

  if (tempWather < 25){
    digitalWrite(in1, HIGH);
    dimmer.setPower(10);
  }

  // if (time.Hours == 0 && time.minutes == 49)
  // {
  //   digitalWrite(in1, LOW);
  //   dimmer.setPower(80);
  //   /* code */
  // }
  
  // if (time.Hours == 0 && time.minutes == 53)
  // {
  //   digitalWrite(in1, HIGH);
  //   dimmer.setPower(10);
    
  //   /* code */
  // }

}

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

брось каку.   Библиотека написано каким-то пионером, привыкшим к гигабайтам оперативки, на AVR так не делают.

И, кстати, в твоем коде так писать нельзя

if ( menuSetup.get_currentScreen() == "BoxReset" )

эта функция не String возвращает.  Вопщем, это не для начинающих, забуть. 

LelSPB
Offline
Зарегистрирован: 13.04.2020

Да с удовольствием, бросил бы каку )) Но по сути осталось одно действие и все закончил )) Или переписать на другой может какой либе подскажи? 

Вот этот метод,

LiquidScreen* LiquidSystem::get_currentScreen() const {
	return _p_liquidMenu[_currentMenu]->get_currentScreen();
}

 

LelSPB
Offline
Зарегистрирован: 13.04.2020

DetSimen пишет:

брось каку.   Библиотека написано каким-то пионером, привыкшим к гигабайтам оперативки, на AVR так не делают.

И, кстати, в твоем коде так писать нельзя

if ( menuSetup.get_currentScreen() == "BoxReset" )

эта функция не String возвращает.  Вопщем, это не для начинающих, забуть. 

Подскажи примером, может разберусь,

b707
Offline
Зарегистрирован: 26.05.2017

LelSPB пишет:

Вот этот метод,

LiquidScreen* LiquidSystem::get_currentScreen() const {
	return _p_liquidMenu[_currentMenu]->get_currentScreen();
}

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

Если пишешь, что осталось только это - то проще всего будет переписать код так, чтобы этот метод был не нужен, например, отслеживать переход от меню к меню по числовому ID

Но вообще ты пейсатель кода еще тот :) Вот это что за бредятина у тебя?

// ротация меню
void switchScrean(){
  if (i == 25)
  {
    menu.next_screen();
  }
  if (i == 50)
  {
    menu.next_screen();
  }
  if (i == 75)
  {
    menu.next_screen();
  }
  if (i == 100)
  {
    menu.next_screen();
    i=0;
  }
  i++;
}

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

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

LelSPB пишет:

Подскажи примером, может разберусь,

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