GyverPortal

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@aidar_i, как бы Вам надо сделать форму. В форме может быть ввод GP.TEXT или GP.PASS. Есть так же варианты с маленькой кнопкой, то есть при нажатие на эту кнопку проходит обновление только определённого компонента. Вы сперва делаете GP.PASS и по клику на кнопку вы должны отправить данные этого поля и перерисовать компонент как GP.TEXT. Сам не пробовал, но скоро (в течении месяца наверное) буду этот портал мучить, пока изучаю документацию, там в принципе всё подробно описано.
 

aidar_i

✩✩✩✩✩✩✩
1 Май 2021
64
8
@DAK,Спасибо за ответ. Так пробовал , но не совсем это то. Есть код, как его вставить ?
C++:
<script src="https://snipp.ru/cdn/jquery/2.1.1/jquery.min.js"></script>
<script>
$('body').on('click', '.password-checkbox', function(){
    if ($(this).is(':checked')){
        $('#password-input').attr('type', 'text');
    } else {
        $('#password-input').attr('type', 'password');
    }
});
</script>
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@aidar_i, посмотри в библиотеке, где вставляются скрипты.
На примере графиков, AJAX.
 
Изменено:

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@aidar_i, Вы должны понимать, чтобы данный код работал, устройство, которое подключается должно иметь доступ к Интернету, это первое. Дальше идём в тот же гитхаб и читаем 11 пункт, скорей всего вам надо пойти по пути внесения вашего кода в шапку. вместо BUILD_BEGIN() можно использовать 3 функции:
C++:
GP.PAGE_BEGIN();
GP.AJAX_CLICK();
GP.PAGE_BLOCK_BEGIN();
между 1 и 2 надо вставить Ваш код
C++:
GP.PAGE_BEGIN();
*_GP += F("some HTML code");
GP.AJAX_CLICK();
GP.PAGE_BLOCK_BEGIN();
Только вот ссылку на jquery лучше использовать не с Бог знает какого сайта, тут более подробно.
В принципе файл не такой и тяжёлый, можно попробовать залить его на flash память и потом выводить целиком его код, это на случай если контроллер будет работать в сети без доступа к Интернету.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Пишу отдельным постом (Модераторы, не бейте меня, это иная проблема)
Допустим мне надо сделать циклом создать ряд пунктов меню с помощью GP.BUTTON_LINK()
Функция конструктора GP.BUTTON_LINK()
C++:
void BUTTON_LINK(const char* url, const char* value) {
        *_GP += F("<input type=\"button\" value=\"");
        *_GP += value;
        *_GP += F("\" onclick=\"location.href='");
        *_GP += url;
        *_GP += F("';\">\n");
    }
мне надо передать туда uri и имя реле. Массив с именами реле у меня глобальный:
char NameRelay[40][32];
Для того, чтобы всё правильно работало мне приходится проделывать следующее:
C++:
    char linkrelay[30];          //Подготавливаю строку нужной длины (вернее массив символов)
    char numlinkrelay[2];        //Делаю ещё одну для того, чтобы в неё передать переменную из цикла
    char nlink[]="/settings/system/relay/";    //ещё одна строка, это как бы начало ссылки
    for (byte h=0;h<RelayCount;h++){
      itoa(h, numlinkrelay, DEC);             //сперва инт впихиваю в одну строку
      strcpy(linkrelay,nlink);                  //в буфер кладу начало ссылки
      strcat(linkrelay,numlinkrelay);          //к началу добавляю то, что сгенерировал цикл
      GP.BUTTON_LINK(linkrelay, NameRelay[h]); GP.BREAK();
    }
Можно как то проще проделать то же самое?
Я просто сегодня еле осуществил сиё действие, по мне проще дописать функцию в библиотеку....
 

zoland

✩✩✩✩✩✩✩
7 Авг 2022
4
0
к вопросу об использовании favicon.ico

 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137

@ASM,
Скажем так, бывает массив символов char, бывают строки. Можно наверное отработать со строками а потом уже строку в чар переделывать. Но блин в 1000 раз проще в библиотеку дописать 5 строк и всё.

UPD:
Надоел мне этот изврат, не смог себя удержать от правки библиотеки, как бы мне этого не хотелось делать
C++:
    void BUTTON_LINK(const char* url, const char* value, int sub = INT32_MAX, bool sub_visible=false) {
        *_GP += F("<input type=\"button\" value=\"");
        if (sub_visible) {
            *_GP += sub;
            *_GP += F(". ");
        }
        *_GP += value;
        *_GP += F("\" onclick=\"location.href='");
        *_GP += url;
        if (sub != INT32_MAX) {
            *_GP += sub;
        }
        *_GP += F("';\">\n");
    }
Немного переделал 1 функцию, но сразу стало легче. Теперь всего то
C++:
 for (int h=0;h<RelayCount;h++){
      GP.BUTTON_LINK("/settings/system/relay/", NameRelay[h], h, true); GP.BREAK();
    }
И у меня выводится 40 кнопок, к имени кнопки спереди добавляется номер "0. ИмяНулевогоРеле"
Теперь думаю в класс добавить 1 метод для отслеживания нажатия форм созданных на сгенерированных страницах
 
Изменено:

Michael_074

✩✩✩✩✩✩✩
16 Дек 2021
8
0
Доброго дня!
Подскажите, как "включать-выключать" светодиод. Вроде на 1-й странице был подобный вопрос.
Нужно по событию в программе изменять состояние, "светится-не светится"
Если делаю так, при объявлении, то работает
void build()
{
BUILD_BEGIN();
....
if(...)
add.LED_GREEN("web_led", 1);
else
add.LED_GREEN("web_led", 0);
...
А как потом в void loop() {... управлять светодиодом?
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
105
112
www.1812.ru
@Michael_074, создайте в web-форме элемент SWITCH с переменной состояния этого элемента (вкл./выкл.).
Отслеживайте событие Click для этого элемента и, в зависимости от значения переменной состояния, включайте или выключайте светодиод.
Посмотрите внимательно примеры к гайверовской библиотеке. Там есть как управлять светодиодом.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@Michael_074,
При запуске портал вы должны подключить функции конструктора и обработчика событий, например
portal.attachBuild(build);
portal.attach(action);
Логика следующая, функция
void build() "рисует интерфейс"
а в функцию
void action() приходят все события, которые произошли в интерфейсе
Так что управлять светодиодом надо не в loop, а в action
В loop надо опрашивать портал через portal.tick()
Посмотрите в примерах на гитхабе


UPD:
Может кому пригодится.
На Esp32 есть такая штука, как "многозадачность". Можно создать пару задач, запихать их на разные ядра. Тогда опрос портала не будет влиять на основной код программы. Как это использовать пусть каждый решит сам, но мне очень понравилось так делать.
C++:
#include "GyverPortal.h"

TaskHandle_t Task1, Task2;
GyverPortal portal;

void action(GyverPortal& portal) {
    //тут обработчик событий пришедших с портала
}
void build() {
    //тут конструктор форм портала
}
void taskCore0(void * pvParameters) {
    for (;;){
        //Тут код первой задачи
        //Здесь можно основной код Вашего алгоритма работы
    }
}
void taskCore1(void * pvParameters) {
    for (;;){
        //Тут код для опроса портала
        //Это будет работать параллельно первой задачи. Сюда больше не надо писать ничего
          portal.start();
        portal.attachBuild(build);
          portal.attach(action);

          Serial.println("Portal run");
          while (portal.tick());
    }
}
void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_AP);                 //В примере запуск Esp32 в режиме AP
  WiFi.softAP("PRIMER");            //Тут кому как хочется

    xTaskCreatePinnedToCore(taskCore0,"Task1",10000,NULL,1,&Task1,0);   //Запускаем 2 задачи
    delay(500);
      xTaskCreatePinnedToCore(taskCore1,"Task2",10000,NULL,1,&Task2,1);

}

void loop() {
// тут никакой код писать не надо
}
 
Изменено:
  • Лойс +1
Реакции: mihail_nik и ASM

Michael_074

✩✩✩✩✩✩✩
16 Дек 2021
8
0
Именно так и делаю
portal.attachBuild(build);
portal.attach(action);
portal.start();
Просмотрел 16 примеров и 3 проекта, которые идут с библиотекой. Не нахожу никак управление светодиодом, именно управление.
Если вдруг кого нибудь не затруднит, ткните меня носом.
Объявлен GP.LED_GREEN("web_led", 0);
Какой командой его "зажечь"?
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Просто как пример. Должно работать.


@Michael_074,
C++:
#define AP_SSID "NameSSID"
#define AP_PASS "password123"
#define Led_Pin 5              //Введите свой пин на светодиод

#include <GyverPortal.h>
GyverPortal portal;


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

  GP.TITLE("Primer");
  GP.HR();
  GP.BUTTON("btn_on", "Включить");
  GP.BUTTON("btn_off", "Выключить");

  BUILD_END();
}

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

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

void action() {
  // был клик по компоненту
  if (portal.click()) {
    // проверяем компоненты и обновляем переменные
    if (portal.click("btn_on")) digitalWrite(Led_Pin, 1);
    if (portal.click("btn_off")) digitalWrite(Led_Pin, 0);
  }
}

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

Michael_074

✩✩✩✩✩✩✩
16 Дек 2021
8
0
Оформи код соответствующим тэгом
Спасибо!
Но только или я не правильно спрашиваю или меня не понимают :(
Нужен "светодиод" который на WEB-интерфейсе.
Вот фрагменты моего кода. Если синхронизация с NTP серверами прошла успешно - хочу чтобы "светодиод горел"

void build() {
...
GP.LABEL("Date: ");
GP.DATE("web_date", rtc_date);
GP.BREAK();
GP.LABEL("Time: ");
GP.TIME("web_time", rtc_time);
GP.BREAK();

GP.LABEL("NTP Server: ");
GP.TEXT("web_ntp_server", "pool.ntp.org", ntp_server);
GP.BUTTON_MINI("web_button_ntp_sync", "Sync");
GP.LED_GREEN("web_led_ntp", 0);
GP.BREAK();

GP.LABEL("UTC: ");
GP.NUMBER("web_utc", "0", utc);
GP.BREAK();
...
void action(){
...
if(portal.click("web_button_ntp_sync"))
{
bitSet(flag, FLAG_GET_NTP_SYNC);
...
void loop() {
...
// где-то здесь запускаю timeClient.update() и если удачно - как "зажечь" GP.LED_GREEN ?
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Определите глобальную переменную bool flag_synk=false
Надо сделать так, чтобы при синхронизации данная переменная стала true, при ошибке синхронизации опять false
Далее в конструкторе
GP.LED_GREEN("web_led_ntp", flag_synk);


И не забудьте добавить авто обновление GP.AJAX_UPDATE("web_led_ntp") сразу после BUILD_BEGIN(); GP.THEME(GP_DARK);

Остальное не хочу комментировать.
 
  • Лойс +1
Реакции: Олег Поляков

sermanger

✩✩✩✩✩✩✩
31 Июл 2022
3
0
Может кто знает, что надо изменить в библиотеке, чтобы при выборе времени на веб странице предлагалось выбрать только "часы" без последующего предложения выбрать "минуты"?
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137

@sermanger,
Не много не понял. Брось код конструктора этого элемента, как сейчас вызываешь.... Может смогу помочь


@ASM,
На сколько знаю следующая версия ещё в работе. Возможно скоро обновление приедет.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Вообще это как то странно звучит. По факту сервер даёт ответ на запрос, нет запроса - нет ответа. По факту Вам надо делать автоматическое обновление всей страницы. А в конструкторе надо делать иное условие. В определённое время Вы в своём коде включаете некий флаг (чтобы флаг дошёл в функции конструктора определите его глобально). В конструкторе Вам необходимо делать страницу в зависимости от значения флага.
C++:
void build() {
  GP.PAGE_BEGIN();
  GP.AJAX_CLICK();
  *_GP += F("<script>ТУТ СКРИПТ НА ОБНОВЛЕНИЕ СТРАНИЦЫ, В ГУГЛЕ МАССА ВАРИАНТОВ </script>");
  GP.PAGE_BLOCK_BEGIN();
  GP.THEME(GP_DARK);

  // страница с формой
  if (flag){
      GP.LABEL("Страница которая должноя появляться");
  } else {
      GP.LABEL("Другая страница");
  }
Такое подход прямо говоря - полная ж...па, лучше так не делать. Надо как то более конкретизировать задачу, не понятно что именно Вам посоветовать.
 

Sam_jakson

✩✩✩✩✩✩✩
13 Май 2020
19
0
Комрады привет. Можете нубу подсказать не могу понять как на кнопку повесить отправку данных на ик передатчик(проект удаленного управления кондиционером. Использую библиотеку
#include <IRsend.h>
#include <IRremoteESP8266.h>
Не пойму как правильно сделать метод передачи, пробую вот таким методом if (portal.click("btn_onkond")) digitalWrite(IRsend, uint16_t rawData_on);
но чет все равно не получается, если не сложно можете подсказать или дать пример как это сделать.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Лучше код. Надо глянуть на код конструктора. С первого взгляда - метод
на портале правильный. А вот с irsend не подскажу
 

Sam_jakson

✩✩✩✩✩✩✩
13 Май 2020
19
0
@DAK,
C++:
#define Led_Pin 14              //Введите свой пин на светодиод

#include <IRsend.h>
#include <GyverPortal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <IRremoteESP8266.h>


#define ONE_WIRE_BUS D2
// Настройка объекта oneWire для связи с любыми устройствами OneWire
OneWire oneWire(ONE_WIRE_BUS);

// Передаем ссылку на объект oneWire объекту Dallas Temperature.
DallasTemperature sensors(&oneWire);


uint8_t sensor1[8] = { 0x28, 0xAE, 0x46, 0x79, 0x97, 0x02, 0x03, 0x3E  };


const uint16_t kIrLed = 12; // D5, рекомендованный ПИН ИК передатчика
IRsend irsend(kIrLed);




uint16_t rawData_on[243] = {8446, 4152,  594, 504,  540, 1570,  596, 1544,  570, 530,  538, 1570,  566, 530,  566, 1544,  594, 504,  540, 530,  566, 504,  564, 504,  540, 526,  540, 1576,  590, 1546,  568, 1570,  570, 526,  538, 530,  564, 506,  564, 504,  540, 530,  564, 504,  540, 530,  538, 530,  538, 526,  540, 530,  538, 532,  564, 504,  566, 504,  564, 504,  540, 530,  540, 530,  538, 526,  542, 526,  540, 530,  566, 504,  538, 530,  540, 530,  540, 1570,  564, 530,  564, 504,  566, 504,  564, 506,  538, 530,  540, 524,  540, 530,  538, 530,  564, 504,  564, 504,  566, 504,  538, 526,  540, 530,  566, 504,  564, 504,  564, 504,  536, 530,  538, 530,  566, 504,  540, 530,  564, 504,  540, 530,  536, 530,  566, 504,  566, 504,  538, 530,  540, 530,  564, 504,  536, 530,  540, 530,  564, 504,  564, 504,  540, 530,  564, 504,  540, 526,  540, 530,  566, 504,  564, 504,  538, 530,  540, 530,  540, 530,  540, 530,  534, 530,  538, 530,  540, 530,  538, 530,  564, 504,  566, 504,  538, 530,  538, 532,  534, 530,  540, 530,  540, 530,  540, 530,  566, 504,  538, 530,  540, 530,  534, 530,  540, 530,  538, 530,  538, 530,  540, 530,  536, 530,  540, 530,  540, 530,  564, 504,  540, 530,  540, 530,  538, 530,  534, 534,  534, 530,  564, 504,  566, 504,  566, 504,  538, 530,  538, 532,  538, 1574,  560, 530,  566, 1548,  590, 504,  538, 530,  540, 530,  536};
uint16_t rawData_off[243] = {8424, 4182,  590, 504,  566, 1548,  564, 1574,  562, 528,  564, 1574,  540, 530,  564, 1548,  564, 530,  540, 530,  540, 530,  540, 526,  542, 526,  538, 1600,  538, 1562,  578, 1600,  564, 504,  538, 530,  538, 530,  538, 526,  538, 530,  540, 530,  566, 504,  540, 530,  540, 530,  540, 530,  538, 530,  540, 530,  540, 530,  540, 530,  540, 530,  534, 530,  538, 530,  538, 530,  540, 530,  540, 530,  538, 530,  538, 530,  538, 1574,  566, 530,  564, 504,  540, 530,  538, 530,  534, 530,  538, 530,  540, 530,  540, 530,  538, 1576,  590, 1548,  590, 504,  564, 504,  538, 530,  538, 530,  538, 530,  534, 530,  538, 530,  538, 530,  538, 530,  540, 530,  540, 530,  564, 504,  564, 504,  564, 504,  564, 504,  538, 530,  564, 504,  538, 530,  538, 530,  534, 534,  534, 530,  538, 530,  538, 530,  540, 530,  564, 504,  540, 530,  564, 504,  540, 530,  540, 530,  538, 530,  538, 532,  534, 530,  540, 530,  540, 530,  566, 504,  538, 530,  540, 530,  540, 530,  538, 530,  536, 530,  540, 530,  566, 504,  538, 530,  538, 530,  540, 530,  540, 526,  538, 530,  538, 530,  564, 506,  564, 504,  540, 530,  540, 530,  540, 530,  536, 530,  540, 530,  540, 530,  538, 530,  540, 530,  538, 530,  538, 530,  538, 530,  534, 530,  538, 530,  564, 504,  538, 530,  540, 530,  538, 530,  536, 534,  534, 530,  564, 1548,  594, 474,  566, 530,  540};
uint16_t rawData_19[243] = {8450, 4150,  594, 474,  596, 1540,  568, 1572,  594, 474,  594, 1546,  568, 500,  570, 1566,  568, 500,  594, 1544,  594, 1544,  570, 1566,  596, 1544,  570, 500,  570, 1566,  570, 1570,  594, 474,  568, 500,  568, 500,  564, 500,  596, 474,  570, 500,  594, 474,  570, 500,  570, 500,  570, 500,  566, 504,  564, 500,  594, 474,  568, 500,  594, 474,  568, 502,  564, 506,  564, 500,  594, 474,  594, 474,  568, 500,  596, 474,  570, 1566,  568, 500,  594, 474,  594, 474,  594, 476,  568, 500,  570, 500,  568, 500,  564, 500,  568, 500,  594, 474,  568, 500,  594, 474,  594, 474,  570, 500,  566, 504,  590, 474,  594, 474,  594, 474,  594, 474,  568, 500,  568, 502,  568, 500,  564, 504,  564, 500,  594, 474,  570, 500,  596, 474,  570, 500,  568, 500,  566, 504,  590, 474,  594, 474,  570, 500,  570, 500,  568, 500,  564, 504,  564, 500,  596, 474,  568, 500,  594, 474,  568, 500,  564, 506,  590, 474,  596, 474,  568, 500,  568, 500,  564, 504,  590, 474,  594, 474,  594, 474,  594, 474,  568, 500,  564, 504,  590, 480,  590, 474,  594, 474,  594, 474,  570, 500,  594, 476,  568, 500,  564, 504,  590, 474,  594, 474,  594, 474,  594, 474,  570, 500,  590, 478,  564, 500,  594, 476,  568, 500,  568, 500,  568, 500,  566, 504,  564, 504,  590, 474,  596, 1544,  594, 474,  570, 500,  564, 504,  590, 1544,  570, 500,  594, 474,  568};
uint16_t rawData_18[243] = {8418, 4182,  564, 504,  564, 1570,  594, 1544,  596, 474,  596, 1544,  568, 500,  564, 1570,  594, 474,  594, 474,  568, 1570,  564, 1570,  594, 1544,  596, 474,  570, 1570,  570, 1566,  594, 478,  590, 478,  590, 474,  594, 474,  568, 500,  596, 474,  568, 500,  566, 504,  590, 478,  590, 474,  594, 474,  594, 474,  594, 476,  568, 500,  568, 500,  566, 504,  566, 504,  590, 478,  590, 474,  596, 474,  570, 500,  596, 474,  568, 1570,  564, 504,  590, 478,  590, 474,  596, 474,  596, 474,  596, 474,  570, 500,  568, 500,  568, 500,  564, 504,  564, 504,  564, 504,  564, 504,  590, 474,  594, 474,  594, 474,  570, 500,  570, 500,  568, 500,  564, 504,  564, 504,  590, 480,  590, 474,  568, 500,  594, 474,  570, 500,  566, 504,  564, 506,  564, 504,  590, 474,  594, 474,  568, 500,  594, 474,  568, 500,  564, 506,  564, 504,  590, 478,  590, 474,  594, 474,  570, 500,  594, 474,  570, 500,  568, 500,  568, 500,  564, 504,  564, 504,  566, 504,  590, 478,  590, 474,  594, 474,  570, 500,  570, 500,  564, 504,  564, 504,  566, 504,  564, 504,  590, 480,  590, 474,  594, 474,  570, 500,  568, 500,  568, 500,  564, 504,  590, 478,  590, 478,  590, 478,  564, 500,  594, 474,  568, 500,  568, 500,  564, 504,  566, 504,  590, 478,  590, 478,  590, 1544,  570, 500,  568, 500,  568, 500,  568, 500,  568, 1570,  564, 504,  590, 478,  564};
uint16_t rawData_17[243] = {8420, 4182,  538, 530,  564, 1570,  570, 1570,  568, 500,  538, 1600,  540, 530,  566, 1574,  566, 504,  564, 1570,  568, 500,  544, 1596,  540, 1600,  564, 504,  564, 1570,  570, 1570,  540, 530,  538, 530,  564, 504,  564, 504,  564, 504,  566, 504,  566, 500,  570, 500,  540, 530,  540, 530,  564, 504,  564, 504,  564, 504,  564, 504,  564, 500,  570, 500,  540, 530,  566, 504,  566, 504,  566, 504,  564, 500,  568, 500,  544, 1596,  538, 530,  564, 504,  564, 504,  564, 504,  566, 500,  570, 500,  540, 530,  538, 530,  564, 504,  564, 504,  566, 504,  564, 500,  544, 526,  564, 504,  566, 504,  566, 504,  564, 504,  566, 500,  544, 526,  540, 530,  564, 504,  566, 504,  564, 504,  564, 500,  568, 500,  540, 530,  564, 504,  566, 504,  564, 504,  564, 504,  564, 500,  568, 500,  538, 530,  566, 504,  564, 506,  564, 504,  564, 500,  542, 528,  564, 504,  564, 504,  566, 504,  566, 504,  566, 500,  544, 526,  540, 530,  564, 504,  566, 504,  566, 504,  566, 500,  544, 526,  566, 504,  566, 504,  566, 504,  564, 504,  564, 504,  540, 526,  544, 524,  564, 504,  566, 504,  564, 506,  564, 504,  564, 504,  540, 526,  544, 526,  566, 504,  564, 504,  564, 504,  564, 504,  564, 506,  538, 530,  540, 526,  538, 530,  564, 504,  564, 504,  564, 504,  566, 504,  540, 530,  540, 524,  540, 530,  564, 1574,  564, 504,  564, 504,  564};
uint16_t rawData_16[243] = {8414, 4214,  530, 540,  556, 1578,  560, 1578,  560, 508,  530, 1608,  556, 512,  532, 1604,  534, 534,  530, 538,  530, 540,  556, 1582,  530, 1604,  534, 534,  530, 1608,  530, 1604,  536, 534,  560, 510,  534, 534,  560, 508,  534, 534,  532, 538,  556, 512,  556, 512,  556, 510,  534, 534,  560, 508,  534, 534,  560, 508,  536, 534,  556, 512,  532, 538,  556, 508,  560, 508,  560, 508,  534, 536,  530, 538,  530, 538,  556, 1582,  556, 512,  530, 536,  534, 534,  534, 534,  560, 508,  536, 534,  530, 538,  530, 538,  530, 540,  556, 512,  532, 534,  560, 508,  560, 508,  534, 534,  534, 534,  556, 514,  530, 538,  556, 514,  556, 514,  530, 534,  534, 534,  534, 534,  530, 538,  556, 514,  530, 540,  556, 508,  536, 534,  530, 538,  530, 538,  556, 514,  556, 514,  556, 514,  556, 508,  530, 538,  556, 512,  530, 540,  556, 512,  556, 512,  556, 508,  556, 512,  556, 512,  530, 538,  530, 538,  530, 538,  530, 534,  556, 514,  556, 512,  556, 512,  556, 514,  530, 538,  530, 538,  530, 534,  530, 538,  532, 538,  530, 538,  530, 538,  556, 508,  534, 534,  534, 534,  530, 538,  556, 514,  530, 538,  530, 538,  530, 534,  530, 538,  532, 538,  530, 538,  530, 538,  530, 538,  556, 514,  528, 534,  530, 538,  530, 538,  532, 538,  530, 1608,  530, 1604,  534, 1604,  556, 1582,  530, 1608,  530, 538,  556, 512,  556, 510,  556};
uint16_t rawData_swingON[243] = {8422, 4178,  570, 500,  594, 1544,  596, 1544,  568, 500,  570, 1566,  570, 500,  570, 1570,  596, 474,  594, 474,  568, 500,  568, 1566,  568, 1570,  596, 474,  568, 1570,  570, 1566,  568, 502,  594, 474,  596, 474,  596, 474,  568, 500,  568, 500,  568, 500,  564, 500,  594, 474,  596, 474,  594, 474,  568, 500,  594, 474,  570, 500,  570, 500,  570, 500,  564, 504,  566, 500,  594, 474,  596, 474,  596, 474,  568, 500,  594, 1544,  568, 500,  570, 500,  564, 504,  566, 1570,  594, 474,  596, 474,  568, 502,  568, 500,  570, 500,  570, 500,  566, 504,  564, 504,  590, 474,  594, 474,  594, 474,  570, 500,  594, 474,  570, 500,  564, 504,  590, 478,  590, 478,  590, 474,  594, 476,  594, 474,  594, 474,  568, 500,  568, 500,  564, 504,  564, 504,  566, 500,  594, 474,  596, 474,  570, 500,  594, 474,  568, 500,  592, 478,  590, 480,  590, 474,  594, 474,  596, 474,  570, 500,  566, 504,  590, 478,  590, 474,  568, 500,  570, 500,  570, 500,  570, 500,  590, 478,  590, 476,  594, 474,  568, 500,  568, 500,  570, 500,  564, 504,  590, 478,  566, 500,  570, 500,  570, 500,  594, 474,  568, 500,  564, 504,  590, 478,  566, 500,  594, 474,  568, 500,  568, 500,  590, 478,  590, 478,  590, 478,  566, 500,  594, 474,  568, 500,  568, 500,  570, 1570,  566, 504,  592, 478,  590, 478,  590, 474,  568, 1570,  566, 504,  590, 480,  590};
uint16_t rawData_swingOFF[243] = {8418, 4182,  568, 500,  568, 1570,  564, 1574,  564, 504,  564, 1570,  568, 504,  564, 1570,  568, 500,  568, 500,  568, 500,  568, 1570,  564, 1574,  564, 504,  564, 1570,  568, 1572,  564, 504,  564, 504,  564, 504,  564, 504,  566, 504,  564, 500,  570, 500,  568, 500,  566, 504,  564, 504,  564, 504,  564, 506,  564, 500,  568, 500,  568, 500,  568, 500,  564, 504,  566, 504,  564, 504,  564, 504,  566, 504,  564, 500,  570, 1570,  566, 504,  564, 506,  564, 504,  566, 504,  564, 504,  566, 498,  570, 500,  568, 500,  564, 506,  564, 506,  564, 504,  566, 504,  566, 500,  570, 500,  570, 500,  564, 504,  564, 504,  566, 504,  566, 504,  566, 504,  564, 500,  568, 500,  564, 504,  564, 504,  564, 504,  564, 504,  566, 504,  564, 504,  566, 500,  564, 504,  566, 504,  566, 504,  566, 504,  564, 504,  564, 504,  566, 500,  564, 504,  564, 504,  564, 504,  564, 504,  564, 506,  564, 506,  564, 500,  564, 504,  564, 504,  564, 504,  564, 504,  564, 504,  564, 504,  564, 506,  564, 500,  568, 500,  564, 504,  564, 504,  564, 504,  564, 504,  564, 504,  564, 500,  570, 500,  564, 504,  564, 504,  564, 504,  564, 504,  564, 504,  564, 506,  564, 504,  564, 500,  568, 500,  564, 504,  566, 504,  564, 504,  564, 504,  564, 504,  564, 504,  566, 1574,  564, 1570,  568, 1570,  566, 1574,  564, 1574,  564, 504,  564, 504,  564, 500,  570};

GyverPortal portal;

float tempSensor1 = sensors.getTempC(sensor1);

// конструктор страницы
void build() {
  BUILD_BEGIN();
  GP.THEME(GP_DARK);
  GP.AJAX_UPDATE("val");
  GP.TITLE("Primer");
  GP.LABEL("Value: ");
  GP.LABEL("NAN", "val");
 
  GP.HR();

  GP.BUTTON("btn_on", "Включить");
  GP.BUTTON("btn_off", "Выключить");
  GP.BUTTON("btn_onkond", "Включить кондиционер");
  GP.BUTTON("btn_offkond", "Выключить кондиционер");
  BUILD_END();
}

void setup() {
  sensors.begin();
  irsend.begin();  // Инициализируем ИК передатчик
  Serial.begin(115200);
  pinMode(Led_Pin,OUTPUT);
 
  WiFi.mode(WIFI_STA);
  WiFi.begin(AP_SSID, AP_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(WiFi.localIP());



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



void action() {
  tempSensor1 = sensors.getTempC(sensor1); // Получить значение температуры
  if (portal.update("val")) portal.answer(tempSensor1);
  // был клик по компоненту
  if (portal.click()) {
    // проверяем компоненты и обновляем переменные
    if (portal.click("btn_on")) digitalWrite(Led_Pin, 0);
    if (portal.click("btn_off")) digitalWrite(Led_Pin, 1);
    if (portal.click("btn_onkond")) digitalWrite(IRsend, uint16_t rawData_on);
    if (portal.click("btn_offkond")) digitalWrite(Led_Pin, 1);
    }

}

void loop() {
  sensors.requestTemperatures();
  portal.tick();
  Serial.println(tempSensor1);
}
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@Sam_jakson, С точки зрения работы портала, всё правильно. мне единственно кажется что 77 строка лишняя.
@ASM, сомневаюсь, у меня именно так и работает...
Есть сомнение по вот этой строчке
digitalWrite(IRsend, uint16_t rawData_on);