GyverPortal

J777

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

ASM

★★★★★✩✩
26 Окт 2018
1,693
339
@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
29
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();
}
 

Xao_Asakura

✩✩✩✩✩✩✩
27 Окт 2024
1
0
Здраствуйте, сижу над проектом солнечного трекера, столкнулся с проблемой не реагируют кнопки нажатия "◄", "►", решил поискать в документации вдруг в новой версии кнопки создаються по новым ключевым словами, но ничего не смог найти, сможет кто подсказать что делать?

GP_MAKE_BLOCK_TAB(
"MANUAL",
GP_MAKE_BOX(GP.LABEL("Duty"); GP.SLIDER("spd", duty, 0, 1023);
GP_MAKE_BOX(GP.BUTTON("bkw", "◄"); GP.BUTTON("frw", "►");
);
);
 
Изменено:

anr69

✩✩✩✩✩✩✩
25 Ноя 2024
3
0
подскажите...
на esp8266 все норм, долго использую
пробую несколько esp32 ,поставил для плат сборку последнюю Arduino core for the ESP32 Release v3.0.7
примеры при нажатие на любую кнопку на форме .. всплывает попап окно - плата офлайн
сейчас попробую понизить сборку под плату
может кому тоже поможет ... в портале написано
  • esp32 (SDK v2+)
ну а то что 3+ это уже много чего поменяли и оно много чего не работает
на последней 2.0.18 вроде заработало
 
Изменено:

NaLex

✩✩✩✩✩✩✩
10 Май 2022
4
0
Приветствую! В каком виде файлы отправлять, чтобы обновить файловую систему (по ссылке /ota_update)? Отправляю какой-нибудь BIN и вся файловая система сбрасывается в ноль. Использую SPIFFS на ESP8266. Прошивка обновляется как положено.
 
Изменено:

anr69

✩✩✩✩✩✩✩
25 Ноя 2024
3
0
@NaLex,я могу ошибаться , но прошивка это отдельно а SPIFFS или чем вы отформатируете часть флешки это другое...в настройках контроллера вы указываете сколько под прошивку а сколько под фалы отдать...и работать с этими файлами надо уже не через /ota_update ... в портале есть примеры....
 

NaLex

✩✩✩✩✩✩✩
10 Май 2022
4
0
@anr69,
Портал позволяет загружать и файловую систему отдельно.

Разобрался.

Вариант номер 1.
Скачиваю область SPIFFS (или LittleFS) с помощью esptool и получается BIN для загрузки файловой системы через портал. Стартовый адрес узнаю с помощью инструмента (плагина) для загрузки файлов.
C++:
E:\esptool-win64\esptool -b 921600 -p COM3 read_flash 0x00200000 0x1FA000 c:\spiffs.bin
Вариант номер 2.
Создаю образ из папки с файлами с помощью mkspiffs или mklittlefs, в зависимости от используемой системы.
C++:
C:\...\mklittlefs -b 0x2000 -p 0x100 -s 0x1FA000 -c c:\data c:\littlefs.bin
Размер блока, страницы и общий размер узнаю с помощью этого скетча:
C++:
//#include <FS.h>
#include <LittleFS.h>

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

  if (!LittleFS.begin()) {
    Serial.println("Failed to mount file system");
  }
  else Serial.println("Mounted");

  FSInfo fs_info;
  LittleFS.info(fs_info);

  Serial.println();
  Serial.println("totalBytes");
  Serial.println(fs_info.totalBytes, HEX);
  Serial.println();
  Serial.println("usedBytes");
  Serial.println(fs_info.usedBytes, HEX);
  Serial.println();
  Serial.println("blockSize");
  Serial.println(fs_info.blockSize, HEX);
  Serial.println();
  Serial.println("pageSize");
  Serial.println(fs_info.pageSize, HEX);
  Serial.println();
  Serial.println("maxOpenFiles");
  Serial.println(fs_info.maxOpenFiles, HEX);
  Serial.println();
  Serial.println("maxPathLength");
  Serial.println(fs_info.maxPathLength, HEX);
}

void loop() {

}
 
Изменено:

Владлэн

✩✩✩✩✩✩✩
28 Авг 2023
23
6
Зачем всё это?
При компиляции в Arduino IDE (2.3) выбираю разбивку сколько под программу, сколько под файловую систему.
В папке (например, C:\Users\Username\AppData\Local\arduino\sketches\6A0EE9D80D67621DE2852B3DD8B18B3F\) получаю бинарник прошивки, который нормально через портал обновляется. Файловая система не слетает. А чтоб создать образ файловой системы нужны сторонние инструменты. Но я ими не пользуюсь, чаще просто через фалменеджер в портале файлы закидываю.
 
  • Лойс +1
Реакции: NaLex

NaLex

✩✩✩✩✩✩✩
10 Май 2022
4
0
@Владлэн, чтобы пользователь мог обновить файловую систему. Планируется периодическая смена файлов.
 

Владлэн

✩✩✩✩✩✩✩
28 Авг 2023
23
6
@NaLex, не, я говорю зачем так сложно.
Вот сейчас перепроверил на IDE 1.8.19.
Компилирую скетч, получаю bin файл прошивки. В инструментах установлен ESP8266 LittleFS Data Uload, нажимаю на него. Рядом с бинарником прошивки появляется бинарник файловой системы.
 
  • Лойс +1
Реакции: NaLex

NaLex

✩✩✩✩✩✩✩
10 Май 2022
4
0
@Владлэн, да, точно. Спасибо! Только в моём случае BIN файловой системы сохраняется в C:\Users\User\AppData\Local\Temp\arduino_build_709460\
 

anr69

✩✩✩✩✩✩✩
25 Ноя 2024
3
0
Оформи код соответствующим тэгом, см. Правила
void AREA(const String& name, int rows = 1, const String& value = "", const String& width = "", bool dis = false) {
*_GPP += F("<textarea onchange='GP_click(this)' style='height:auto");
if (width.length()) {
*_GPP += F("; width:");
*_GPP += width;
*_GPP += F(";");
}
*_GPP += F("' name='");
*_GPP += name;
*_GPP += F("' id='");
*_GPP += name;
*_GPP += F("' rows='");
*_GPP += rows;
*_GPP += "'";
if (dis) *_GPP += F(" disabled");
*_GPP += ">";
if (value.length()) *_GPP += value;
*_GPP += F("</textarea>\n");
send();
}
чуть подправил чтобы width работал....