GyverPortal

J777

✩✩✩✩✩✩✩
30 Сен 2024
2
0
Респект автору за портал!
Подскажите, как программно обновить страницу (из моего кода)?
 

ASM

★★★★★✩✩
26 Окт 2018
1,558
303
@J777,
C++:
GP.RELOAD(имя);                     // скрытый блок перезагрузки страницы. Добавь его "имя" в UPDATE и ответь 1 на update, чтобы обновить страницу
GP.RELOAD_CLICK(список);            // клик по указанным в списке компонентам перезагружает страницу [пример: "id1,id2,id5"]
 
  • Лойс +1
Реакции: J777 и SoftFelix

J777

✩✩✩✩✩✩✩
30 Сен 2024
2
0
Подскажите, как увеличить ширину поля ввода GP.TEXT?
Можно ли программно перейти на другую страницу?
 

nostradamus

✩✩✩✩✩✩✩
11 Окт 2024
1
0
Подскажите пожалуйста, столкнулся с двумя проблемами сегодня:
1. Плата esp32 cam, после прошивки примера из библиотеки actionClick плата шлет в монитор порта ошибку
E (242) quad_psram: PSRAM ID read error: 0xffffffff, PSRAM chip not found or not supported.
плата не поддерживается библиотекой?
2.Плата esp32 wroom, после прошивки этого же примера в нее, wifi в режиме AP,
все работает, кроме последней кнопки в примере, выдает сообщение "offline"+ плашка сбоку что я оффлайн. При этом в консоль ничего не шлет при нажатии на кнопку.

версия библиотеки 3.6.6
 

MaxWhite

✩✩✩✩✩✩✩
12 Мар 2020
28
5
Помогите, пожалуйста, объединить ГП и его же форму ввода логина и пароли от вифи! всю голову сломал, десятки раз загружал разный код в вемос, все равно не пойму - можно ли сделать 2 функции build и build2 и в одной форма ввода WIFI будет (как в оригинале), в другой - мой код, вроде делал, но все равно после отключения портала ничего по нужному ип адресу. Не понимаю с ui.start, ui.attachBuild и прочими, доки не оч информативны... В идеале по нажатой кнопке и включении устройства - портал, если wifi данные сохранены, то сразу подключаться и запускать мой код.
 

Pussymonsta

✩✩✩✩✩✩✩
29 Апр 2022
2
0
Всех приветствую. Есть необходимость поднять на esp32 точку доступа и при подключении по логину/паролю получать веб морду, отрисованную при помощи GyverPortal. Подружить скетч для создания точки доступа и пример из портала не вышло. Есть ли у кого наработки по подобному направлению или кто то может подсказать, как по определенному IP в созданной точке доступа разместить страницу, отриcованную в портале?
 

kmarakov

✩✩✩✩✩✩✩
29 Июн 2024
3
0
Здравствуйте. Плата Weemos Mini на esp8266. Делаю форму сохранения настроек SSID и пароля в гайвер портале. В ходе разбирательств выяснил, что просто не могу получить текст из формы, ui.getString возвращает пустую строку, и все.

В примере все работает, а в моей программе нет. Прикладываю рабочий текст, и мой. Никак понять не могу, что не так.
Мой код, не работает, выводит пустую строку в консоль:
#define AP_SSID "???"
#define AP_PASS "???"

#include <GyverPortal.h>
GyverPortal ui;

void build() {
  GP.BUILD_BEGIN(600);
  GP.THEME(GP_LIGHT);
  GP.GRID_RESPONSIVE(700);

  M_GRID(
    M_BLOCK_TAB(
      "WiFi Setup",

      M_BOX(GP.LABEL("SSID:     "); GP.TEXT("ssid", "SSID", ""););
      M_BOX(GP.LABEL("Password: "); GP.TEXT("password", "Password", ""););
      M_BOX(GP.BUTTON_MINI("btn", "Submit"));
    );
  );

  GP.FORM_END();
  GP.BUILD_END();
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(AP_SSID, AP_PASS);

  ui.attachBuild(build);
  ui.attach(action);
  ui.start();
}

void action() {
  if (ui.click("btn")) {
    Serial.println(ui.getString("ssid"));
  }
}

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

Работающий пример с GitHub:
#define AP_SSID ""
#define AP_PASS ""

#include <GyverPortal.h>
GyverPortal ui;

// конструктор страницы
void build() {
  GP.BUILD_BEGIN();
  GP.THEME(GP_DARK);

  // ui.uri() возвращает текущий адрес страницы
  // используем его в конструкции с if для постройки страницы
  // переход на страницы может осуществляться в адресной строке браузера
  // или по кнопке-ссылке BUTTON_LINK

  // страница с формой
  // ВАЖНО: url страницы должен совпадать с именем формы!
  // чтобы форма отображалась в браузере после Submit
  if (ui.uri("/save")) {
    GP.FORM_BEGIN("/save");
    GP.TEXT("txt", "text", ""); GP.BREAK();
    GP.SUBMIT("Submit");
    GP.FORM_END();
    GP.BUTTON_LINK("/", "Back");

    // страница с кнопкой, на которую можно кликнуть
  } else if (ui.uri("/clicks")) {
    GP.BUTTON("btn", "Button");
    GP.BUTTON_LINK("/", "Back");

    // страница с лампочкой, которая сама переключается
  } else if (ui.uri("/updates")) {
    GP.UPDATE("led");
    GP.LABEL("LED: ");
    GP.LED_RED("led", 0);   GP.BREAK();
    GP.BUTTON_LINK("/", "Back");

    // главная страница, корень, "/"
  } else {
    GP.BUTTON_LINK("/save", "Form");
    GP.BUTTON_LINK("/clicks", "Clicks");
    GP.BUTTON_LINK("/updates", "Updates");
  }

  GP.BUILD_END();
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(AP_SSID, AP_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(WiFi.localIP());

  // подключаем конструктор и запускаем
  ui.attachBuild(build);
  ui.attach(action);
  ui.start();
}

bool led;
void action() {
  // имитация активности
  if (ui.form("/save")) Serial.println(ui.getString("txt"));
  if (ui.click("btn")) Serial.println("Button");
  if (ui.update("led")) ui.answer(led = !led);
}

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

kmarakov

✩✩✩✩✩✩✩
29 Июн 2024
3
0
Я тут переспал со своей проблемой, и вроде решил. Как я понимаю, последнее время многим нужно было примерно тоже самое. Текст прилагаю, проверьте, пожалуйста. Может позже более подробно комментарии расставлю.
По работе: в течении 10 секунд пытается подключиться к последней записанной точке доступа. Если не может, запускает свою. Подключаетесь к ней, там форма ввода SSID и пароля. Сохраняет в EEPROM, автоматически перезагружает. Потом снова пытается подключиться к уже новой точке доступа, которую вы ввели. Если не получится в течении 10 секунд, снова запустит портал настройки.

C++:
#include <LittleFS.h>
#include <GyverPortal.h>
#include <EEPROM.h>
GyverPortal ui(&LittleFS);

struct settings {
  char ssid[30];
  char password[30];
} user_wifi = {};

void build() {
  GP.BUILD_BEGIN(600);
  GP.THEME(GP_LIGHT);
  GP.GRID_RESPONSIVE(700);

  GP.FORM_BEGIN("/main");
  M_GRID(
    M_BLOCK_TAB(
      "Статус",

      M_BOX(GP.LABEL("WiFi connected"););
      M_BOX(GP.LABEL("SSID: "); GP.LABEL(user_wifi.ssid););
    );
  );

  GP.FORM_END();
  GP.BUILD_END();
}

void action() {
  if (ui.form("/setup")) {
    eepromput();
  }
}

void eepromput(){
  ui.copyStr("ssid", user_wifi.ssid);
  ui.copyStr("password", user_wifi.password);

  EEPROM.begin(sizeof(struct settings));
  EEPROM.put(0, user_wifi);
  EEPROM.commit();
  Serial.println("Reset...");
  delay(1000);
  WiFi.softAPdisconnect();
  ESP.restart();
}

void setup() {
  Serial.begin(115200);

  EEPROM.begin(sizeof(struct settings));
  EEPROM.get(0, user_wifi);

  WiFi.mode(WIFI_STA);
  WiFi.begin(user_wifi.ssid, user_wifi.password);

  byte tries = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
    if (tries++ > 10) {
      Serial.println("");
      Serial.println("Can't connect.");
      setupPortal();
      break;
    }
  }

  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  ui.attachBuild(build);
  ui.attach(action);
  ui.start();
  ui.enableOTA("admin", "pass");

  if (!LittleFS.begin()) Serial.println("FS Error");
  ui.downloadAuto(true);
}

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

void setupPortal() {
  Serial.println("Portal start");

  // запускаем точку доступа
  WiFi.mode(WIFI_AP);
  WiFi.softAP("WiFi Setup");

  ui.attachBuild(buildSetup);
  ui.attach(action);
  ui.start();

  // работа портала
  while (ui.tick());
}

void buildSetup() {
  GP.BUILD_BEGIN(600);
  GP.THEME(GP_LIGHT);
  GP.GRID_RESPONSIVE(700);

  GP.FORM_BEGIN("/setup");
  M_GRID(
    M_BLOCK_TAB(
      "WiFi Setup",

      M_BOX(GP.LABEL("SSID:     "); GP.TEXT("ssid", "SSID", ""););
      M_BOX(GP.LABEL("Password: "); GP.TEXT("password", "Password", ""););
      M_BOX(GP.SUBMIT("Submit"));
    );
  );

  GP.FORM_END();
  GP.BUILD_END();
}