Попытался скрестить два скетча из примеров: GyverPortal - WiFiLogin и GyverHub - Basic

Teh-nick

✩✩✩✩✩✩✩
9 Ноя 2023
14
1
Здравствуйте!

Попытался скрестить два скетча из примеров: GyverPortal - WiFiLogin и GyverHub - Basic
Идея в том, что бы при старте и нажатой кнопке забить настройки сети, а при старте и отжатой кнопке - запустить основное тело программы.
Примеры запускал по отдельности - все работает, но при скрещивании ошибка компиляции.
Подскажите куда копать!
Текст программы и отчета ошибок приложил.

C++:
// быстрый старт
#include <GyverPortal.h>
#include <EEPROM.h>

struct LoginPass {
  char ssid[20];
  char pass[20];
};

LoginPass lp;



#include <Arduino.h>


// подключаем библиотеку и настраиваем устройство
#include <GyverHub.h>
uint8_t tab = 0;
GHbutton b1, b2;
GyverHub hub("MyDevices", "ESP8266", "");
// иконки
// https://fontawesome.com/v5/cheatsheet/free/solid
// https://fontawesome.com/v5/search?o=r&m=free&s=solid



void buildsetup() {
  GP.BUILD_BEGIN();
  GP.THEME(GP_DARK);

  GP.FORM_BEGIN("/login");
  GP.TEXT("lg", "Login", lp.ssid);
  GP.BREAK();
  GP.TEXT("ps", "Password", lp.pass);
  GP.SUBMIT("Submit");
  GP.FORM_END();

  GP.BUILD_END();
}



void build() {
  hub.BeginWidgets();
  hub.Tabs(&tab, F("Ручное,Автоматическое"));
  hub.WidgetSize(50);
  hub.Button(&b1, F("Открыть"), GH_GREEN);
  hub.Button(&b2, F("Закрыть"), GH_RED);
  hub.WidgetSize(100);
  hub.LED(0, F("Протечка"));

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



     // читаем логин пароль из памяти
  EEPROM.begin(100);
  EEPROM.get(0, lp);

  // если кнопка нажата - открываем портал
  pinMode(D1, INPUT_PULLUP);
  if (digitalRead(D1)) loginPortal();

  // пытаемся подключиться
  Serial.print("Connect to: ");
  Serial.println(lp.ssid);
  #ifdef GH_ESP_BUILD
  WiFi.mode(WIFI_STA);
  WiFi.begin(lp.ssid, lp.pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Connected! Local IP: ");

  Serial.println(WiFi.localIP());
  #endif
    hub.onBuild(build);     // подключаем билдер
    hub.begin();

}


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

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

  // запускаем портал
  GyverPortal ui;
  ui.attachBuild(buildsetup);
  ui.start();
  ui.attach(action);

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

void action(GyverPortal& p) {
  if (p.form("/login")) {      // кнопка нажата
    p.copyStr("lg", lp.ssid);  // копируем себе
    p.copyStr("ps", lp.pass);
    EEPROM.put(0, lp);              // сохраняем
    EEPROM.commit();                // записываем
    WiFi.softAPdisconnect();        // отключаем AP
  }
}

void loop() {
    hub.tick();  // обязательно тикаем тут
     Serial.print(tab);
     Serial.print(b1);
     Serial.println(b2);
}
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Текст программы и отчета ошибок приложил.
Как минимум ошибки выложите в ветку как текст, скачивать файлы никто не станет.

А вообще, обьединение двух скетчей - дело не простое, просто склеить два текста вместе никогда не работает, одну или обе исходные программы придется переписывать почти полностью
 

Teh-nick

✩✩✩✩✩✩✩
9 Ноя 2023
14
1
Код:
from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/GyverHub.h:6,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:18:
c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/canvas.h:37:5: error: 'CV_DST_OUT' redeclared as different kind of entity
   37 |     CV_DST_OUT,
      |     ^~~~~~~~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/objects.h:5,
                 from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/GyverPortal.h:56,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:2:
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/canvas.h:38:8: note: previous declaration 'const char CV_DST_OUT [18]'
   38 | GP_PGM(CV_DST_OUT, "'destination-out'");
      |        ^~~~~~~~~~
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/utils.h:7:45: note: in definition of macro 'GP_PGM'
    7 | #define GP_PGM(name, val) static const char name[] PROGMEM = val
      |                                             ^~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/builder.h:4,
                 from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/GyverHub.h:6,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:18:
c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/canvas.h:38:5: error: 'CV_LIGHTER' redeclared as different kind of entity
   38 |     CV_LIGHTER,
      |     ^~~~~~~~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/objects.h:5,
                 from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/GyverPortal.h:56,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:2:
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/canvas.h:39:8: note: previous declaration 'const char CV_LIGHTER [10]'
   39 | GP_PGM(CV_LIGHTER, "'lighter'");
      |        ^~~~~~~~~~
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/utils.h:7:45: note: in definition of macro 'GP_PGM'
    7 | #define GP_PGM(name, val) static const char name[] PROGMEM = val
      |                                             ^~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/builder.h:4,
                 from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/GyverHub.h:6,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:18:
c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/canvas.h:39:5: error: 'CV_COPY' redeclared as different kind of entity
   39 |     CV_COPY,
      |     ^~~~~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/objects.h:5,
                 from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/GyverPortal.h:56,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:2:
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/canvas.h:40:8: note: previous declaration 'const char CV_COPY [7]'
   40 | GP_PGM(CV_COPY, "'copy'");
      |        ^~~~~~~
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/utils.h:7:45: note: in definition of macro 'GP_PGM'
    7 | #define GP_PGM(name, val) static const char name[] PROGMEM = val
      |                                             ^~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/builder.h:4,
                 from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/GyverHub.h:6,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:18:
c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/canvas.h:40:5: error: 'CV_XOR' redeclared as different kind of entity
   40 |     CV_XOR,
      |     ^~~~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/objects.h:5,
                 from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/GyverPortal.h:56,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:2:
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/canvas.h:41:8: note: previous declaration 'const char CV_XOR [6]'
   41 | GP_PGM(CV_XOR, "'xor'");
      |        ^~~~~~
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/utils.h:7:45: note: in definition of macro 'GP_PGM'
    7 | #define GP_PGM(name, val) static const char name[] PROGMEM = val
      |                                             ^~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/builder.h:4,
                 from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/GyverHub.h:6,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:18:
c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/canvas.h:41:5: error: 'TXT_TOP' redeclared as different kind of entity
   41 |     TXT_TOP,
      |     ^~~~~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/objects.h:5,
                 from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/GyverPortal.h:56,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:2:
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/canvas.h:43:8: note: previous declaration 'const char TXT_TOP [6]'
   43 | GP_PGM(TXT_TOP, "'top'");
      |        ^~~~~~~
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/utils.h:7:45: note: in definition of macro 'GP_PGM'
    7 | #define GP_PGM(name, val) static const char name[] PROGMEM = val
      |                                             ^~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/builder.h:4,
                 from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/GyverHub.h:6,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:18:
c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/canvas.h:42:5: error: 'TXT_BOTTOM' redeclared as different kind of entity
   42 |     TXT_BOTTOM,
      |     ^~~~~~~~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/objects.h:5,
                 from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/GyverPortal.h:56,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:2:
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/canvas.h:44:8: note: previous declaration 'const char TXT_BOTTOM [9]'
   44 | GP_PGM(TXT_BOTTOM, "'bottom'");
      |        ^~~~~~~~~~
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/utils.h:7:45: note: in definition of macro 'GP_PGM'
    7 | #define GP_PGM(name, val) static const char name[] PROGMEM = val
      |                                             ^~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/builder.h:4,
                 from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/GyverHub.h:6,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:18:
c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/canvas.h:43:5: error: 'TXT_CENTER' redeclared as different kind of entity
   43 |     TXT_CENTER,
      |     ^~~~~~~~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/objects.h:5,
                 from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/GyverPortal.h:56,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:2:
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/canvas.h:45:8: note: previous declaration 'const char TXT_CENTER [9]'
   45 | GP_PGM(TXT_CENTER, "'middle'");
      |        ^~~~~~~~~~
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/utils.h:7:45: note: in definition of macro 'GP_PGM'
    7 | #define GP_PGM(name, val) static const char name[] PROGMEM = val
      |                                             ^~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/builder.h:4,
                 from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/GyverHub.h:6,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:18:
c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/canvas.h:44:5: error: 'TXT_BASELINE' redeclared as different kind of entity
   44 |     TXT_BASELINE,
      |     ^~~~~~~~~~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/objects.h:5,
                 from c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/GyverPortal.h:56,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:2:
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/canvas.h:46:8: note: previous declaration 'const char TXT_BASELINE [13]'
   46 | GP_PGM(TXT_BASELINE, "'alphabetic'");
      |        ^~~~~~~~~~~~
c:\Users\���\Documents\Arduino\libraries\GyverPortal\src/utils.h:7:45: note: in definition of macro 'GP_PGM'
    7 | #define GP_PGM(name, val) static const char name[] PROGMEM = val
      |                                             ^~~~
In file included from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/builder.h:4,
                 from c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/GyverHub.h:6,
                 from C:\Users\КЛС\Documents\Arduino\FP_copy_20231109193429\FP_copy_20231109193429.ino:18:
c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/canvas.h: In member function 'void GHcanvas::rect(int, int, int, int, int, int, int, int)':
c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/canvas.h:211:18: error: conversion from 'const char*' to 'int' in a converted constant expression
  211 |             case CV_CENTER:
      |                  ^~~~~~~~~
c:\Users\���\Documents\Arduino\libraries\GyverHub-main\src/canvas.h:211:18: error: could not convert 'CV_CENTER' from 'const char [9]' to 'int'

exit status 1

Compilation error: exit status 1
Весь текст ошибки не вмещается, выложил фрагмент.
Как я понял суть проблемы в том, что не исполняется какая-то инструкция из библиотеки, но тогда вопрос: почему эти же библиотеки работают в скетчах из примеров?
Бывают конфликты библиотек при применении их в одном скетче?
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Как я понял суть проблемы в том, что не исполняется какая-то инструкция
Нет, суть в том что эти библиотеки используют переменные с одними и теми же именами, причем переменные определены в .h файлах
почему эти же библиотеки работают в скетчах из примеров?
потому что в примерах библиотеки использованы поодиночке.
Бывают конфликты библиотек при применении их в одном скетче?
конечно. Особенно если библиотеки написаны криво
 
  • Лойс +1
Реакции: Teh-nick

Teh-nick

✩✩✩✩✩✩✩
9 Ноя 2023
14
1
Нет, суть в том что эти библиотеки используют переменные с одними и теми же именами, причем переменные определены в .h файлах

потому что в примерах библиотеки использованы поодиночке.

конечно. Особенно если библиотеки написаны криво
Правильно я понимаю варианты:
1. Ждать когда AlexGyver исправит конфликт двух библиотек
2. Отказаться от использования одной из библиотек

Есть ли примеры, где основное тело программы использует GyverHub, но при старте и нажатой кнопке запустится подпрограмма с точкой доступа и окном для конфигурирования сети, при этом используя библиотеки совместимые с GyverHub?
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Правильно я понимаю варианты:
1. Ждать когда AlexGyver исправит конфликт двух библиотек
2. Отказаться от использования одной из библиотек
Да, примерно так.
Я не очень разбираюсь что эти либы делают, посмотрел их исключительно с точки зрения синтаксиса. Но похоже что обе примерно для одного и того же, поэтому надо выбрать какую-то одну и ее использовать.
 

Cherence

✩✩✩✩✩✩✩
28 Окт 2023
11
7
Можно попробовать добавить static перед глобальными переменными. Если дело действительно в этом

Да, так оно должно нормально работать.

Нет, это не поможет, дело тут не в них
 
Изменено:

Teh-nick

✩✩✩✩✩✩✩
9 Ноя 2023
14
1
Нашел таки способ обойтись одной библиотекой GyverHub
протечка:
// быстрый старт

#include <Arduino.h>
#include <EEPROM.h>
struct LoginPass {
  char ssid[20];
  char pass[20];
};

LoginPass lp;

bool flag = false;
uint32_t btnTimer = 0;
bool hold = 0;
bool valve = 0;



// подключаем библиотеку и настраиваем устройство
#include <GyverHub.h>
GyverHub hub("MyDevices", "ESP8266", "");
// иконки
// https://fontawesome.com/v5/cheatsheet/free/solid
// https://fontawesome.com/v5/search?o=r&m=free&s=solid

// переменные для интерфейса
GHbutton b2;
GHbutton open;   //переменная для программной кнопки открыть
GHbutton close;  //переменная для программной кнопки закрыть
GHbutton save;   //переменная для программной кнопки сохранить настройки сети
bool start;      //переменная-флаг для запуска настройки сети если при старте нажата кнопка
uint8_t sld_i;
float sld_f;
bool button = 0;

String inp_str;
char inp_cstr[11];  // строка на 10 символов (+1 нулевой)
int16_t inp_int;

// это наш билдер. Он будет вызываться библиотекой
// для сборки интерфейса, чтения значений и проч.
void build() {
  if (start) {                                              //если при запуске была нажата кнопка, запускаем настройщик сети
    hub.Input(lp.ssid, GH_CSTR, F("название сети"));        //поле с назаванием сети, после ввода, нужно нажать стрелочку в конце поля
    hub.Input(lp.pass, GH_CSTR, F("пароль сети"), GH_RED);  //поле для ввода пароля, после ввода, нужно нажать стрелочку в конце поля
    hub.Button(&save, F("сохранить"), GH_RED);              //кнока сохранить настройки
    if (save) {                                             //если кнопку таки надавили...
      EEPROM.put(0, lp);                                    // сохраняем
      EEPROM.commit();                                      // записываем
      Serial.println();
      Serial.println(lp.ssid);
      Serial.println(lp.pass);
      WiFi.softAPdisconnect();  // отключаем AP
      start = 0;                //убираем флаг
    }
  } else {  //если кнопку при старте не давили, то запускаем основную морду
    // сделаем интерфейс в виде стильных виджетов
    // BeginWidgets() начинает новую горизонтальную строку виджетов
    hub.BeginWidgets();

    // ширина следующих виджетов задаётся в %
    hub.WidgetSize(50);

    // это кнопка без настроек
    // Кнопка - активный компонент: вернёт 1 если нажата
    if (hub.Button(&open, F("Открыть"), GH_GREEN)) valve = 1;

    // ко второй кнопке подключим переменную b2
    // она будет true, пока кнопка удерживается. Опросим её ниже в loop
    // добавим название и цвет
    if (hub.Button(&close, F("Закрыть"), GH_PINK)) valve = 0;
    hub.WidgetSize(50);
    hub.LED_(F("valveopen"), 0, "Открыто");
    hub.LED_(F("valveclose"), 0, "Закрыто");
    hub.WidgetSize(50);

    hub.LED_(F("button"), 0, "кнопка");  //индикатор нажатой кнопки

    hub.EndWidgets();
  }
}
void setup() {
  // читаем логин пароль из памяти
  EEPROM.begin(100);
  EEPROM.get(0, lp);
  Serial.begin(115200);
  pinMode(D1, INPUT_PULLUP);      //кнопка сидит тут
  pinMode(D4, OUTPUT);            // реле сидит тут
  if (digitalRead(D1)) {          //если кнопка нажата...
    start = 1;                    //поворачиваем флаг для выбора морды конфигурации сети
    WiFi.mode(WIFI_AP);           // сеть как точка доступа
    WiFi.softAP("Vankin_Wi-FI");  //название сети
    Serial.println();
    Serial.println("Точка доступа создана");
    Serial.println(WiFi.localIP());
  } else {  //если кнопка не нажата...


    // если это ESP - подключаемся к WiFI
    //#ifdef GH_ESP_BUILD

    start = 0;                     //флаг для выбора морды основной программы
    WiFi.mode(WIFI_STA);           //сеть как клиент
    WiFi.begin(lp.ssid, lp.pass);  //параметры сети берем из памяти
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println();
    Serial.println(lp.ssid);
    Serial.println(lp.pass);
    Serial.println(WiFi.localIP());
    //#endif
  }
  // можно подключить обработчик веб-консоли
  // зайди в info/cli в приложении
  // или нажми ~ при открытом устройстве
  hub.onCLI([](String& s) {
    Serial.println(s);
    hub.print(s);  // отправить обратно
    // вдогонку отправим строку из Input inp_str
    hub.print(inp_str, GH_BLUE);
  });

  hub.onBuild(build);  // подключаем билдер
  hub.begin();         // запускаем систему
}

void loop() {
  hub.tick();  // обязательно тикаем тут

  button = digitalRead(D1);  //читаем состояние кнопки
                             // Serial.println(button);
  static GHtimer tmr(1000);  //таймер обновления состояния 1 сек
  if (tmr) {
    hub.sendUpdate("button", String(button));  //отправляем на морду состояние кноки
    hub.sendUpdate("valveopen", String(valve));
    hub.sendUpdate("valveclose", String(!valve));
  }

  if (open) valve = 1;
  if (close) valve = 0;
  // читаем инвертированное значение для удобства
  bool btnState = digitalRead(D1);
  if (btnState && !flag && millis() - btnTimer > 100) {
    flag = 1;
    valve = !valve;
    btnTimer = millis();
    Serial.println(valve);
  }
  if (!btnState && flag && millis() - btnTimer > 100) {
    flag = false;
    btnTimer = millis();
  }
  if (valve) digitalWrite(D4, 1);
  else digitalWrite(D4, 0);
}
Всем спасибо!
 
  • Лойс +1
Реакции: bort707

Владлэн

✩✩✩✩✩✩✩
28 Авг 2023
20
4
Давно уже использую GyverPortal и WiFiManager. Нормально работает. При первом запуске ESP создаёт точку доступа 192.168.4.1 с WiFiManager. Потом уже цепляется к сети. Если при перезапуске вайфая нет, то работает как точка доступа с основной программой, через час перезапускается.
C++:
#define ESPSSID1     "ESPconfig"  // SSID устройства
#define ESPSSID2     "ESPwork"  // SSID устройства
#define PASSWORD    "password"// пароль устройства


#include <GyverPortal.h>
#include "WiFiManager.h"
#include "SimpleTimer.h"
#include <LittleFS.h>
#include <GyverPortal.h>
#include <ESP8266HTTPClient.h>

WiFiManager wm;
SimpleTimer myTimer;
GyverPortal ui(&LittleFS); // для проверки файлов

// Begin setup() functions //
void setup(){
Serial.begin(74880);

//wm.resetSettings();

wm.setCaptivePortalEnable(true);//автоматическая переадресация на страничку ESP
wm.setCleanConnect(1); //костыль

wm.setConfigPortalTimeout(60); //закрыть портал конфигурации через столько секунд
wm.setConnectTimeout(60);


//подключение к WiFi
bool res;
res = wm.autoConnect(ESPSSID1, PASSWORD); //создать точку доступа
if(!res) {//если не смог соединиться с роутером
        
    delay(3000);
    WiFi.softAPdisconnect(1);
    delay(3000);
    
    WiFi.mode(WIFI_AP);
    WiFi.softAP("***", PASSWORD,6,1);//создать скрытую точку доступа, костыль

    delay(3000);
    WiFi.softAPdisconnect(1);
    delay(3000);
    
    WiFi.mode(WIFI_AP);
    WiFi.softAP(ESPSSID2, PASSWORD,1,0);//создать точку доступа
    
    myTimer.setTimeout(3600000, resetESP);//сброс ESP через час
    }


//Gyver Portal
ui.start();
ui.attachBuild(build);
ui.attach(action);
ui.log.start(1500);   // размер буфера
ui.enableOTA();   // без пароля
ui.downloadAuto(true);
} // End of setup() //


//строим WEB интерфейс
void build() {
}

//обработчик нажатий на WEB морду
void action() {
}

//сброс ESP
void resetESP(){
ESP.restart();
}


// ======================  Main loop() =======================
void loop(){
myTimer.run();
ui.tick();
} // end of loop
 

MaxWhite

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