• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Как задать переменную на веб сервере и сохранить ее во flash

Cadil

New member
Собрал метеостанцию (ESP8266, BME280), которая отсылает информацию о температуре, влажности, давлении на е-мейл с помощью php-скрипта. Ниже приведена команда из скетча, которая выполняет эту работу -
Код:
http.begin("http://skorovoda.in.ua/php/un37.php?mymail="+String(address)+"&t="+String(t) +"&h="+String(h) +"&pHg="+String(p));
Кроме того, в при первом включении устройства - создается новая точка доступа, подключившись к которой, пользователь имеет возможность ввести имя своей Wi-Fi сети и пароль.
Хотелось бы переменную address (адрес е-мейла) задавать не в скетче, а считывать с окна предварительных настроек на этой же веб-странице, которую в скетче формирует библиотека WiFiManager.h - тут задаются имя Wi-Fi сети и пароль доступа. Как это сделать?
Подкорректировал код библиотеки WiFiManager.h. Теперь окно для переменной address выводится на веб-страницу, а дальше - проблемы, решить которые мне не под силу. Одна из них - не читается символ "@".
Подскажите, пожалуйста, ссылку, пример, фрагмент кода, где решена аналогичная задача - значение переменной задается на веб-сервере и в дальнейшем используется в скетче.
Заранее благодарен.

 

Вложения

Последнее редактирование:
Собрал метеостанцию (ESP8266, BME280), которая отсылает информацию о температуре, влажности, давлении на е-мейл с помощью php-скрипта. Ниже приведена команда из скетча, которая выполняет эту работу -
Код:
http.begin("http://skorovoda.in.ua/php/un37.php?mymail="+String(address)+"&t="+String(t) +"&h="+String(h) +"&pHg="+String(p));
Кроме того, в при первом включении устройства - создается новая точка доступа, подключившись к которой, пользователь имеет возможность ввести имя своей Wi-Fi сети и пароль.
Хотелось бы переменную address (адрес е-мейла) задавать не в скетче, а считывать с окна предварительных настроек на этой же веб-странице, которую в скетче формирует библиотека WiFiManager.h - тут задаются имя Wi-Fi сети и пароль доступа. Как это сделать?
Подкорректировал код библиотеки WiFiManager.h. Теперь окно для переменной address выводится на веб-страницу, а дальше - проблемы, решить которые мне не под силу. Одна из них - не читается символ "@".
Подскажите, пожалуйста, ссылку, пример, фрагмент кода, где решена аналогичная задача - значение переменной задается на веб-сервере и в дальнейшем используется в скетче.
Заранее благодарен.
Добрый день.
Вот работающая у меня программа: (исправил замечания)

#define SSID2 = "ENTER_NEW_SSID"; // SSID по умолчанию
#define PASS2 = "Enter_New_Password"; //Password по умолчанию

handle_setup_page - выводятся текущие настройки
handle_confirm_Setup - сохраняются введенные данные
 

Вложения

Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
lookingooder, впервые вижу/слышу об использовании знака "=" внутри #define, использовании точки с запятой и комментария после него - это запрещено классическим синтаксисом! Внимательно прочитайте правила использования директив препроцессора! Ну... или дайте внятное обоснование этого нарушения...
 
lookingooder, впервые вижу/слышу об использовании знака "=" внутри #define, использовании точки с запятой и комментария после него - это запрещено классическим синтаксисом! Внимательно прочитайте правила использования директив препроцессора! Ну... или дайте внятное обоснование этого нарушения...
Опс. А я думал, чегойто у меня такой способ не заработал. Там ниже есть переменные, которые я когда-то скопипастил в дефайны, написал имена большими буквами, а знаки "=" , ";" и комментарии так и остались. хотя и не вижу ничего плохого в комментариях.. MVS не возражает :)
 

Юрий Ботов

Moderator
Команда форума
не вижу ничего плохого в комментариях.. MVS не возражает :)
А чего ему возражать то? Он это оставляет на вашей совести...

давайте просто разберем что получится. Итак define:
#define AAA 123 // kaka

вызов в теле программы:
a = AAA+1;

после препроцессора:
a = 123 // kaka+1;

компилятор:
"Ошибка в строке a = AAA+1; - ожидается точка с запятой!!!"
 
А чего ему возражать то? Он это оставляет на вашей совести...

давайте просто разберем что получится. Итак define:
#define AAA 123 // kaka

вызов в теле программы:
a = AAA+1;

после препроцессора:
a = 123 // kaka+1;

компилятор:
"Ошибка в строке a = AAA+1; - ожидается точка с запятой!!!"
Может, в теории...
На практике все работает, как ожидается:
 

Вложения

Сергей_Ф

Moderator
Команда форума
@lookingooder зачем ориентироваться на неправильных пчел? Они и мед могут делать неправильный.
Стандартный вид директивы следующий:

#define имя_макроса последовательность_символов

Обратим внимание, что в данном операторе отсутствует точка с запятой. Между идентификатором и последовательностью символов может быть любое число пробелов. Макрос завершается только переходом на следующую строку.
 
@lookingooder зачем ориентироваться на неправильных пчел? Они и мед могут делать неправильный.
Ок, ребята. Заставили порыться в стандартах С++ (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf):

Вот про директивы:
"The only white-space characters that shall appear between preprocessing tokens within a preprocessing
directive (from just after the introducing # preprocessing token through just before the terminating new-line
character) are space and horizontal-tab (including spaces that have replaced comments or possibly other
white-space characters in translation phase 3)."
Как я с трудом понял этот сухой английский текст - в строке директивы могут присутствовать пробелы, которыми были заменены комментарии.

Вот про комментарии:
2.8 Comments [lex.comment]
1 The characters /* start a comment, which terminates with the characters */. These comments do not
nest. The characters // start a comment, which terminates with the next new-line character. If there is a
form-feed or a vertical-tab character in such a comment, only white-space characters shall appear between it
and the new-line that terminates the comment; no diagnostic is required. [ Note: The comment characters
//, /*, and */ have no special meaning within a // comment and are treated just like other characters.
Similarly, the comment characters // and /* have no special meaning within a /* comment. —end note ]
Здесь - комментарием считается все начиная с /* и заканчивая */ , а также все, начиная с // и заканчивая концом строки.

Хотя работает такое объявление (самому стало интересно) и // не интерпретируется как комментарий:
#define SSID0 "ssid // 0"
Но и здесь есть строчка в стандарте:
"A string literal is a sequence of characters (as defined in 2.14.3) surrounded by double quotes..."

Так или иначе, себя я убедил. :)
 
Сверху Снизу