LiquidMenu для создания меню
- Войдите на сайт для отправки комментариев
Чт, 30/04/2020 - 04:57
Приветствую знатоки, возможно кому то приходилось разбираться с этой библиотекой?
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 */
// }
}
брось каку. Библиотека написано каким-то пионером, привыкшим к гигабайтам оперативки, на AVR так не делают.
И, кстати, в твоем коде так писать нельзя
if( menuSetup.get_currentScreen() =="BoxReset")эта функция не String возвращает. Вопщем, это не для начинающих, забуть.
Да с удовольствием, бросил бы каку )) Но по сути осталось одно действие и все закончил )) Или переписать на другой может какой либе подскажи?
Вот этот метод,
LiquidScreen* LiquidSystem::get_currentScreen() const { return _p_liquidMenu[_currentMenu]->get_currentScreen(); }брось каку. Библиотека написано каким-то пионером, привыкшим к гигабайтам оперативки, на AVR так не делают.
И, кстати, в твоем коде так писать нельзя
if( menuSetup.get_currentScreen() =="BoxReset")эта функция не String возвращает. Вопщем, это не для начинающих, забуть.
Подскажи примером, может разберусь,
Вот этот метод,
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++; }обьясни, нафига проверять значение переменной, если в любом случае ты ты делаешь одно и то же ?:))))
Подскажи примером, может разберусь,
Нет. Настолько глубоко, чтобы подсказывать, я в это изделие не лазил. Но проблем то нет, кто лучше автора знает, что там у него понакручено, спроси у него, тем более, он свой, а не заграничный.