GyverPortal

Shakshukka035

✩✩✩✩✩✩✩
26 Апр 2022
4
1
Коллеги, всех приветствую, не знаю почему, но никак не могу запустить AJAX график в режиме точки доступа.
Добавил кнопку загрузкии загружал файлы в корень AJAX_PLOT.js и дарк, они были в папке gp_data
Ядро esp32 2.0.1
Версия GP 3.5.2

C++:
// тест графиков AJAX_PLOT, вывод случайных значений

#define AP_SSID "IoTik32"
#define AP_PASS ""
#include <LittleFS.h>
#include <GyverPortal.h>
GyverPortal ui(&LittleFS);

const char *names[] = {
  "temp", "humidity", "kek"
};

// конструктор
void build() {
  GP.BUILD_BEGIN();
  GP.THEME(GP_DARK);
  GP.FOLDER_UPLOAD("folder_upl");// кнопка загрузки
  GP.AJAX_PLOT("plot1", 1, 20, 1000, 400, 1);
  GP.AJAX_PLOT_DARK("plot3", names, 3, 20, 1000, 400, 1);
  GP.BUILD_END();
}

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

  WiFi.mode(WIFI_AP);
  WiFi.softAP(AP_SSID, AP_PASS);
  Serial.println(WiFi.softAPIP());

  if (!LittleFS.begin(true)) {
    Serial.println("LittleFS Mount Failed");
    return;
  }
  ui.uploadAuto(true);
  ui.downloadAuto(true);
  // подключаем конструктор и запускаем
  ui.attachBuild(build);
  ui.attach(action);
  ui.start();
}

void action() {
  if (ui.update("plot1")) ui.answer(random(200));
  if (ui.update("plot3")) {
    int answ[] = { random(200), random(200), random(200) };
    ui.answer(answ, 3);
  }
    if (ui.uploadEnd()) {
    Serial.print("Uploaded file: ");
    Serial.print(ui.fileName());      // имя файла
    Serial.print(", from: ");
    Serial.println(ui.uploadName());  // имя формы загрузки
    // файл сохранится В КОРЕНЬ, С ИМЕНЕМ fileName()
    // или с сохранением пути вложенных папок
  }
}

void loop() {
  ui.tick();
}
 
  • Лойс +1
Реакции: -=FISHER=-

Shakshukka035

✩✩✩✩✩✩✩
26 Апр 2022
4
1
@gorlanovmax,подключай Little fs таким образом

C++:
  if (!LittleFS.begin(true)) {
    Serial.println("LittleFS Mount Failed");
    return;
  }
 

Dimastis

✩✩✩✩✩✩✩
12 Дек 2022
10
0
Подскажите почему переменная GP.setTimeout вызывает ошибку wdt reset load 0x4010f000 ?

1674766938320.png
1674766962433.png
 

aidar_i

✩✩✩✩✩✩✩
1 Май 2021
64
8
Появился вопрос: как изменить фавикон вкладки браузера, сейчас там иконка стоит Гувера и надпись Gyverportal.
Что то не могу найти, где прописано.
 

aidar_i

✩✩✩✩✩✩✩
1 Май 2021
64
8
Появился вопрос: как изменить фавикон вкладки браузера, сейчас там иконка стоит Гувера и надпись Gyverportal.
Что то не могу найти, где прописано.
Научился заголовок менять:
C++:
void build() {
GP.BUILD_BEGIN();
GP.THEME(GP_DARK);
GP.SEND("<title> HELLO </title>"); // Эта строка меняет 
GP.BUILD_END();
}
НО! Нужно обязательно удалить историю открытия этой страницы в браузере! А то на этом адресе всегда будет заголовок прежде открытой страницы.
До иконок не добрался еще.
 

gorlanovmax

✩✩✩✩✩✩✩
26 Окт 2022
69
6
@aidar_i,

Странный метод
а GP.PAGE_TITLE("HELLO") не пробовали использовать?

favicon можно поменять файлом, если используете spiffs или littefs
 
Изменено:

aidar_i

✩✩✩✩✩✩✩
1 Май 2021
64
8
@gorlanovmax, есть , оказывается, штатная функция GP.PAGE_TITLE("HELLO") работает хорошо, не нужно удалять историю браузера.
 

gorlanovmax

✩✩✩✩✩✩✩
26 Окт 2022
69
6
@aidar_i,

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

aidar_i

✩✩✩✩✩✩✩
1 Май 2021
64
8
Избыточное цитирование, см. Правила. Отредактируй или сообщение будет удалено
Разобрался, спасибо, просто, оказывается.

Я сперва не понял, что он меняет. Исправьте на отписался :)

Сделал пользовательские блоки для программы FLProg по версии библиотеки 3.5.2 здесь.
 
Изменено:

aidar_i

✩✩✩✩✩✩✩
1 Май 2021
64
8
Не нашел описания как использовать
void HIDDEN(const String& id, const String& name, const String& value)
GP.HIDDEN(ID, name, value);

Как с помощью него скрыть компоненты?

Не работает адекватно функция GP.BUILD_BEGIN(GP_LIGHT, 400); всегда темная тема, если прошить сперва темной темой, в скетче поменять на светлую и прошить, все равно всегда темная тема и наоборот.
Обнаружил, если удалить историю браузера полностью, то работает.
Так
GP.BUILD_BEGIN(400);
GP.THEME(GP_LIGHT);
работает без удаления истории.

Сжимается кнопка (проверял мини) до размера надписи, ставлю ширину 300 и надпись ВКЛ, она и сжимается в размер надписи. Нужно, чтобы кнопка не уменьшался в ширине с установленного размера.
 
Изменено:

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
104
38
esp в режиме AP. Требуется подключиться, попасть на страницу регистрации где прикручен портал и загрузить файл из fs телефона в esp. Собственно OTA сделать. Но на андроиде диалог загрузки файла не появляется. Я так подозреваю, что у captiveportallogin нет разрешения на файловую систему. Как выкрутиться? Или я что то не правильно делаю?
 

Daber

✩✩✩✩✩✩✩
13 Дек 2022
10
0
Всем привет!
Появился вопрос, есть авторизация, все работает и хорошо.
Вопрос в следующем, возможно я плохо смотрел и не нашел в wiki, но как разлогиниться?
 

Maxx1200

★✩✩✩✩✩✩
11 Фев 2022
94
18
Управление освещением через Wi-Fi и с помощью физической кнопки



NEW_light_ESP_0.2.ino:
#include "Constants.h"
#include "ESP8266WiFi.h"
#include <LittleFS.h>
#include <GyverPortal.h>
GyverPortal ui(&LittleFS);
#include <WiFiClient.h>
#include <EEManager.h>
EEManager mem1(w);


/////////////////////////////////////////////
void setup() {
  Serial.begin(115200);
  pinMode(Led_Pin,OUTPUT);    // устанавливаем режим работы вывода, как "выход"
  //digitalWrite(Led_Pin, LOW); // LOW или HIGH при старте

  // подтянем внутренней подтяжкой
  pinMode(BTN_PIN, INPUT_PULLUP);

  EEPROM.begin(2000);
  mem1.begin(0, 'a');
  wifi_connected();

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

/////////////////////////////////////////////
void loop() {
  mem1.tick();
  ui.tick();

   // узнаем, отпущена ли кнопка сейчас
   boolean buttonIsUp = digitalRead(BTN_PIN);

   // если кнопка была отпущена и не отпущена сейчас
   if (buttonWasUp && !buttonIsUp) {

    // и считываем сигнал с кнопки снова
    buttonIsUp = digitalRead(BTN_PIN);

      // если кнопка нажата, то переворачиваем сигнал светодиода
      if (!buttonIsUp) {
         valSwitch = !valSwitch;
         digitalWrite(Led_Pin, valSwitch);
         Serial.print("Switch: "); //для отладки
         Serial.println(valSwitch); //Отправляет в порт значение val
      }
   }

   // запоминаем состояние кнопки для новой итерации
   buttonWasUp = buttonIsUp;

}
Constants.h:
//////////// НАСТРОЙКИ ////////////

//Настройки OTA
#define GP_OTA_LIGHT
#define ota_name "admin"
#define ota_pass "pass"
#define web_start "light"  //Адрес портала http://light.local/ или по IP адресу, выданному роутером

//Настройки точки доступа, IP 192.168.4.1
#define ssidAP "Light_ESP"
#define passAP "administrator"  // не менее 8 символов

struct Wifi {
  char ssid[32] = "ssid"; // имя роутера
  char pass[32] = "pass"; // пароль от роутера
};
Wifi w;

#define Led_Pin D1   //пин светодиода или реле
#define BTN_PIN D2 // кнопка подключена на D2 и GND
// переменные
bool valSwitch;
bool buttonWasUp = false; // кнопка Была поднята, по умолчанию false. true (истина) и false (ложь)
bool ledEnabled = false; // светодиод включен, по умолчанию false. true (истина) и false (ложь)


/////////////////// КОНЕЦ НАСТРОЕК /////////////////
portal.ino:
//////////// Функция Web страницы
void build() {
  GP.BUILD_BEGIN(GP_LIGHT);
  GP.PAGE_TITLE("WEB Light");
  GP.UI_BEGIN("Меню", "/,/wifi,/light,/ota,/restart", "Начало,Настройки WiFi,Настройки Свет,Прошивка,Перезагрузка", GP_GREEN, 400);

  /////WIFI Настройки WiFi
  if (ui.uri() == "/wifi") {
    GP.TITLE("Настройки WiFi");
    GP.FORM_BEGIN("/wifi");
    M_BLOCK(GP_THIN, "", "Настройки WIFI",
            M_TABLE("50px,170px", GP_ALS(GP_LEFT, GP_RIGHT),
                    M_TR(GP.LABEL("SSID"), GP.TEXT("ssid", "", w.ssid, "190px"));
                    M_TR(GP.LABEL("PASS"), GP.PASS("pass", "", w.pass, "190px"));););
    GP.SUBMIT("Сохранить");
    GP.FORM_END();
  }

  /////Light Настройки Свет
  if (ui.uri() == "/light") {
  GP.TITLE("Настройки Свет");
  GP.HR();

  GP.LABEL("Switch: ");
  GP.SWITCH("sw", valSwitch);   GP.BREAK();

  GP.BUILD_END();

  }

  /////OTA Прошивка
  else if (ui.uri() == "/ota") {
    GP.TITLE("Прошивка");
    GP.OTA_FIRMWARE("Файл прошивки");
    //GP.LABEL (String(error()));
  }

  /////RESTART Перезагрузка
  else if (ui.uri() == "/restart") {
    GP.TITLE("Перезагрузить ESP?");
    GP.BREAK();
    GP.FORM_BEGIN("/restart");
    GP.SUBMIT("Да", GP_GREEN_B);
    GP.FORM_END();
    GP.BUTTON_LINK("/", "Нет", GP_RED_B);
  }

  /////INDEX Начало
  else {
    GP.TITLE("Системная информация.");
    GP.FILE_MANAGER(&LittleFS);  // передать ссылку на свою ф. систему (&LittleFS) выводит список файлов из Flash памяти с кнопками для удаления (нужно настроить delete)
    GP.BREAK();
    GP.SYSTEM_INFO();  // выводит таблицу системной информации
    GP_VERSION;
  }

  GP.UI_END();
  GP.BUILD_END();
}


void action() {
  // был клик по компоненту
  if (ui.click()) {
    // проверяем компоненты и обновляем переменные

    // 2. автоматическое обновление переменной
    if (ui.clickBool("sw", valSwitch)) {
      Serial.print("Switch: "); //для отладки
      Serial.println(valSwitch); //Отправляет в порт значение val
      digitalWrite(Led_Pin, valSwitch); // вкл-выкл > valSwitch
    }

  }


  if (ui.form()) {
    if (ui.form("/wifi")) {
      ui.copyStr("ssid", w.ssid);
      ui.copyStr("pass", w.pass);
      mem1.updateNow();
      ESP.restart();
    }


    if (ui.form("/restart")) {
      ESP.restart();
    }
  }

}
wifi.ino:
//////////// Функция WiFi и RTC
void wifi_connected() {
  WiFi.mode(WIFI_STA);
  byte tries = 60;
  WiFi.begin(w.ssid, w.pass);
  while (--tries && WiFi.status() != WL_CONNECTED) {
    Serial.print F(".");
    delay(1000);
  }
  if (WiFi.status() != WL_CONNECTED) {
    // Если не удалось подключиться запускаем в режиме AP
    IPAddress apIP(192, 168, 4, 1);
    IPAddress subnet(255, 255, 255, 0);
    Serial.println F("");
    Serial.print F("WiFi up ACCESS POINT: ");
    Serial.println(ssidAP);
    Serial.print F("Start Settings IP: ");
    Serial.println(apIP);
    // Отключаем WIFI
    WiFi.disconnect();
    // Меняем режим на режим точки доступа
    WiFi.mode(WIFI_AP);
    // Задаем настройки сети
    WiFi.softAPConfig(apIP, apIP, subnet);
    // Включаем WIFI в режиме точки доступа с именем и паролем
    // хранящихся в переменных _ssidAP _passwordAP
    WiFi.softAP(ssidAP, passAP);
    ui.attachBuild(build);
    ui.attach(action);
    ui.start();
    ui.enableOTA(ota_name, ota_pass);
  } else {
    Serial.println F("");
    Serial.println F("WiFi запущен");
    Serial.print("IP адрес: ");
    Serial.println(WiFi.localIP());
    ui.attachBuild(build);
    ui.attach(action);
    ui.start(web_start);
    ui.enableOTA(ota_name, ota_pass);
  }
}
 
Изменено:

t_sa

✩✩✩✩✩✩✩
12 Мар 2021
7
1
Прошу не бить больно. Подскажите как поднять web сервер если esp8266 в режиме AP.
 

Daber

✩✩✩✩✩✩✩
13 Дек 2022
10
0
@t_sa,Я реализовал так, код из моего проекта
C++:
bool startWifiAp() {
  const char* ssid_ap = "Aqua";
  const char* password_ap = "";

  IPAddress apIP(192, 168, 1, 185);
  IPAddress apGW(192, 168, 1, 0);
  IPAddress apSM(255, 255, 255, 0);

  WiFi.disconnect();
  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(apIP, apGW, apSM);
  WiFi.softAP(ssid_ap, password_ap);

  flagWifiAP = true;

  return true;
}
 

t_sa

✩✩✩✩✩✩✩
12 Мар 2021
7
1
Как создать AP вопросов нет. Меня интересует есть ли какая-то разница в GyverPortal ? Где-то на форумах встречал что-то типа ui.start(MODE_AP).
 

F4ntik

✩✩✩✩✩✩✩
7 Фев 2022
4
0
@Maxx1200, Решили проблему в вашем примере с удалением файлов в GP.FILE_MANAGER ? в portal.ino - 51 строка
 

Maxx1200

★✩✩✩✩✩✩
11 Фев 2022
94
18

@F4ntik,
Я копировать код с этого проекта.
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
Кто-нибудь реализовывал в своих проектах всплывающие подсказки, аналогично этого?
В GP.SEND запихивать это все плохая идея, автоформатирование весь код ломает)
Как лучше поступить, чтобы добавить этот код в свой проект?)
 

Denon

✩✩✩✩✩✩✩
27 Фев 2023
2
0
Всем привет! У меня беда. Все примеры в GyverPortal под режим WIFI_STA. А мне надо точку доступа поднять.

WiFi.mode(WIFI_AP);
WiFi.softAP(AP_SSID, AP_PASS);
WiFi.softAPConfig(local_ip, gateway, subnet);

И в браузере получаю invalid request. Почему?
Arduino IDE 1.8.19
esp32 (SDK v2.0.2)