ESP, IoT [MatrixClock] Большие часы 64х32, ESP32

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
РЕЛИЗ 2 в разработке с 16.04.23

  • переход на GyverHub​
  • обновление интерфейса​
  • замена библиотек датчиков​
  • обновление интерфейса вывода информации на дисплее​
  • оптимизация кода вывода показаний с датчиков​

 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
ntpClient.setTimeOffset(zome*3600)
C++:
    ntpClient.setUpdateInterval(600000);
    ntpClient.setTimeOffset(3600 * zone);
есть это все, думаешь вынести тогда их?)
раскомментировал их, были ранее для тестирования, потом все свел в одно место, в данном случае пришлось вернуть обратно...
используя int8_t можно задать все зоны , ну кроме половинных
об том я уже думал, вроде даже обсуждал с кем-то в предыдущей теме) что бывают и получасовые зоны, вероятность что это будет нужно кому-то мала, но все же есть)
Все же не пойму зачем хранить зону в символьном виде char t_z[3] = "";
пример из библиотеки...
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,253
1,297
Москва
1 ую строку можно не трогать, обновление задается при инициализации объекта.
2 ую добавить после считывания зоны и перевода ее в целое число.

Опять же! если использовать целые числа, то какие могут быть половинки ? без модификации все равно не выйдет.
Но! Если взять целое число. скажем 2 и считать , что единица это полузона, то 3-я зона будет 6 и надо будет умножать 6 на 1800. Но уже нужен будет перевод целого в зоны с точкой и обратно.
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
и еще, по поводу char, не разрешает считывать ни в чем, кроме char
посмотрим, что будет дальше, когда начну записывать и считывать настройки со скринов, будут нужны char или нет...
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,253
1,297
Москва
Убрал кое что лишнее, надеюсь нигде не напутал со скобками

setDefWiFiCFG(); - функция устанавливает настройки по умолчанию


C++:
struct WiFiConfig
{
  char ssid[32] = DEF_WIFI;
  char pass[15] = DEF_PASS;
  char ntp[32] = DEF_NTP;
  uint8_t tz = DEF_TZ;
};

...
 
void loadWiFiCFG()
{
  File file = FFat.open(WIFI_CFG_FILE, "r");
  if (file)
  {
    StaticJsonDocument<300> doc;
    DeserializationError error = deserializeJson(doc, file);
    file.close();
    if (error)
    {
      Serial.println("Error loading cfg");
      setDefWiFiCFG();
    }
    else
    {
      strlcpy(wifi_cfg.ssid, doc["wifiname"], sizeof(wifi_cfg.ssid));
      strlcpy(wifi_cfg.pass, doc["pass"], sizeof(wifi_cfg.pass));
      strlcpy(wifi_cfg.ntp, doc["ntp"], sizeof(wifi_cfg.ntp));
      wifi_cfg.tz = doc["tz"];
    }
  }
  Serial.println(wifi_cfg.ssid);
  Serial.println(wifi_cfg.pass);
  Serial.println(wifi_cfg.ntp);
  Serial.println(wifi_cfg.tz);
}

...
 
bool saveWiFiCfg(const String filename)
{
  FFat.remove(filename);
  File file = FFat.open(filename, "w");
  if (!file) return false;

  StaticJsonDocument<300> doc;
  doc["wifiname"] = wifi_cfg.ssid;
  doc["pass"] = wifi_cfg.pass;
  doc["ntp"] = wifi_cfg.ntp;
  doc["tz"] = String(wifi_cfg.tz);
  bool r = (serializeJson(doc, file) != 0);
  file.flush();
  file.close();
  return r;
}
 
  • Лойс +1
Реакции: ASM

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Старик Похабыч, в одном файле можно выполнять разные операции?
Например, изначально при старте записываю 3 параметра, логин, пасс и тайм зона. Потом захожу в рабочий интерфейс и устанавливаю другие настройки, в т.ч. если захочу поменять временную зону, если ошибся или переход на летнее, не важно...
Или оперировать несколькими файлами?
Если несколькими, то как быть, можно ли внести правку только временной зоны, в тот файл, не повредив логин и пароль?)
setDefWiFiCFG(); - функция устанавливает настройки по умолчанию
если повредятся настройки, то перезаписать изначальными, тут понятно...
Убрал кое что лишнее, надеюсь нигде не напутал со скобками
у тебя используется чисто файл, я пишу с LittleFS.open("/config.json", "w"); а так посмотрю, может что и найду нужное)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,253
1,297
Москва
На самом деле у меня сейчас "на столе" 2 файла, один с настройками сети (структура для него выше) , при его записи я перегружаю esp
А второй с настройками программы для работы, они принимаются без перезагрузки.
1652201376384.png
Я это сделал сознательно, т.к. настройки сети как правило остаются постоянными на долгое время, а вот с параметрами для работы можно играть достаточно долго, выбирая нужные.

у тебя используется чисто файл, я пишу с LittleFS.open("/config.json", "w"); а так посмотрю, может что и найду нужное)
Один фиг. Это работает и с литл, с FFat только
Я как то давно делал
#define FAT FFat
или
#define FAT LittleFS
- это даже в каком то примере было
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
настройки сети как правило остаются постоянными на долгое время
как быть с вариантом, неправильно указал тайм зону, которая сохраняется в этом конфиге?
инициализировать кнопку сброса в интерфейсе и вводить заново?

опять же, надо вынести и название сервера, пользуясь библиотекой https://github.com/arduino-libraries/NTPClient/blob/master/NTPClient.cpp
вижу, что это ntpClient.setPoolServerName(ntp_srv);
тогда надо использовать char, да еще и с указателем...
а с ними одни проблемы, да и bort ругается на них))
C++:
void NTPClient::setPoolServerName(const char* poolServerName) {
    this->_poolServerName = poolServerName;
}
C++:
 const char* ntp_srv = "ru.pool.ntp.org";
GyverPortal тоже на char))))
C++:
    void TEXT(const char* name, const char* place, String& value) {
        TEXT(name, place, (const char*)value.c_str());
    }
    void TEXT(const char* name, const char* place, char* value) {
        TEXT(name, place, (const char*)value);
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,253
1,297
Москва
Это как сам задумаешь. Можно ограничить минимально и максимально значение, можно вычислить ближайшее подходящее и принудительно поставить его.
Сколько бы вариантов не было всегда найдется тип, что введет что то несоответствующее.
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
интересная загадка)
сайт...
C++:
  add.TEXT("sens_tempH", "", sens_tempH); add.LABEL("Темп. вн."); add.BREAK();
  add.TEXT("sens_tempS", "", sens_tempS); add.LABEL("Темп. нар."); add.BREAK();
  add.TEXT("sens_presH", "", sens_presH); add.LABEL("Давление"); add.BREAK();
парсинг
C++:
  sens_tempH = portal.getChars("sens_tempH");
  sens_tempS = portal.getChars("sens_tempS");
  sens_presH = portal.getChars("sens_presH");
ввожу в форму 1 2 3
и смотрю в монитор
C++:
Serial.println((String)"H: " + sens_tempH + " S: " + sens_tempS + " P: " + sens_presH);
ожидаю увидеть
Код:
H: 1 S: 2 P: 3
а вижу
Код:
H: 3 S: 3 P: 3
во как :)
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Старик Похабыч,
HTML:
<input type="text" name="sens_tempH" id="sens_tempH" value="-2" placeholder="">
<label id="">Темп. вн.</label><br>
<input type="text" name="sens_tempS" id="sens_tempS" value="0" placeholder="">
<label id="">Темп. нар.</label><br>
<input type="text" name="sens_presH" id="sens_presH" value="0" placeholder="">
<label id="">Давление</label><br>
<input type="submit" value="Сохранить">
С телефона по другому себя ведёт)
Не сохраняет значения, просто обновляет страницу и заводские показания...
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,253
1,297
Москва
Хм.. так то оно все правильно вроде. При нажатии сохранить в строке броузера видно весь текст get запроса ?
Вообще лучше показать весь код страницы, но я не уверен, что ошибка на стороне html, это что бы убедиться
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Старик Похабыч, в консоли ничего не видно. Проблема с браузером пропала, сегодня такого нет, просто перезагружает страницу. Но с монитором проблема осталась. Полную строку не показывает браузер, какой можно поставить, для просмотра?)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,253
1,297
Москва
В теге формы запрос POST идет видимо?
Какой не подскажу, html не совсем моя тема.
Покажи все от <form> до </form>.
Скрипты есть какие в странице ?
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Старик Похабыч,
HTML:
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><link rel="stylesheet" type="text/css" href="cid:[email protected]" /><link rel="stylesheet" type="text/css" href="cid:[email protected]" />
<meta name="viewport" content="width=device-width, initial-scale=1">
</head><body>
<div align="center" style="margin:auto;max-width:1000px;">
<h2 id="">Различные настройки</h2><br>
<form action="http://192.168.1.66/save_other" method="POST">
<label id="">Корректировка показаний</label><br><hr>
<input type="text" name="sens_tempH" id="sens_tempH" value="-2" placeholder="">
<label id="">Темп. вн.</label><br>
<input type="text" name="sens_tempS" id="sens_tempS" value="0" placeholder="">
<label id="">Темп. нар.</label><br>
<input type="text" name="sens_presH" id="sens_presH" value="0" placeholder="">
<label id="">Давление</label><br>
<input type="submit" value="Сохранить">
</form>
<form action="http://192.168.1.66/index" method="POST">
<input type="submit" value="На главную">
</form>
</div></body></html>
Добавлю загруженную страницу полностью.
 

Вложения

Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,253
1,297
Москва
Данные передаются честно и правильно, значит ошибка где то в приеме данных.
Надо смотреть как обрабатывается save_other
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Старик Похабыч,
Скетч использует 352764 байт (33%) памяти устройства. Всего доступно 1044464 байт.
Глобальные переменные используют 37868 байт (46%) динамической памяти,
оставляя 44052 байт для локальных переменных. Максимум: 81920 байт.
Надо смотреть как обрабатывается save_other
C++:
    if (portal.form("/save_other")) {
      Serial.println("FORM save_other");
      sens_tempH = portal.getChars("sens_tempH");
      sens_tempS = portal.getChars("sens_tempS");
      sens_presH = portal.getChars("sens_presH");
      Serial.println((String)"H: " + sens_tempH + " S: " + sens_tempS + " P: " + sens_presH);
      //saveConfigOther();
    }
сейчас буду разбирать по частичкам)
блин, вечерняя аномалия в браузере снова, днем ее не было, что дал выше упоминание)
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
Все беды в char'ах) почему библиотеки пишут на них...
Нужно вводить дополнительные переменные чтобы перезаписать изменившееся значение, иначе получается как получается...
Потом уже дополнительную переменную походу записывать в основную или как там выйдет, увижу в следующий раз...
на сегодня все... не буду заглубляться)))