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

ASM

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

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

 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
2,859
849
стоило перейти на миллис, чтобы все функции работали независимо, у меня не только часы, то начались мерцания)
надеюсь вы понимаете, что причина не в миллис, а в плохом коде? Покажите код, не стесняйтесь. Только целиком.
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Если попробовать обновлять адреRGB ленту очень часто ,то тоже можно получить мерцание.
Пример:
Лента Н светодиодов обновляется за 10мс
1000 / 10 = 100 обновлений в секунду. Но это значит, что лента будет обновляться постоянно и может быть заметно мерцание
А если обновлять ленту 50 раз в сек, то это значит надор обновить и выждать 10 мс. - тут мерцание уже не будет так заметно , т.к. будет стадия покоя.
при 25 обновлениях в сек мерцание будет еще меньше.
Т.е. стадия покоя должна быть, и чем она больше, тем меньше будет заметно мерцание
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
@bort707, понимаю, тот момент исправлен вроде в #51. Есть ещё пару идей. Код выложу позже, пока не до него)
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
642
148
55
Таганрог
forum.wisecomp.ru
@ASM, Обновление ленты можно привязать к морганию точек: будет обновляться с частотой примерно два раза в секунду.По идее мерцание тогда уйдет вообще.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
@Leon111_09, неудачный вариант. Мигание точек в отдельном потоке, там не надо делать очистку, включать основной цвет, включить 0 цвет (т.е. выключить), работает идеально) а вот саму матрицу перерисовывать при изменении минуты, вместе с этим и проводить чтение с датчиков, идеальное решение) мониторинг будет также в отдельном потоке)
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
Решил посидеть сегодня))
Нарисовал вэб интерфейс для настроек)
Но смотрю в часах баг, возможно из-за обновленных библиотек, хотя такое не должно быть)
раньше пример тот работал)
конвертация char в int
C++:
int zone = t_z[0] - '0';
сейчас не работает))
C++:
  Serial.println(t_z);
  Serial.println(zone);
показывает
Код:
3
-48
тройка считывается верно, но откуда минус сорок восемь?))
*****
похоже дело в библиотеке, раньше такой вариант компилятор не принимал)
C++:
int zone = t_z[0];
но с ним монитор выдает
C++:
3
0
IMG_20220509_200928.jpgIMG_20220509_201140.jpgIMG_20220509_201150.jpgIMG_20220509_201210.jpg
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Так все верно. Символ 0 это как раз код 48 в десятичном виде байт. ВОт и получаешь -48.
если из '0' надо получить 0, то что то типа String('0').toInt или как то так.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
@Старик Похабыч, надо из gson (char) засунуть значение в zone (int). Пример этот работал, но сегодня обновил библиотеку NtpClient и перестало работать)
Если ноль это сорок восемь, то три минус сорок восемь, это минус 45...
Да и почему-то на форумах такой пример предлагают для конвертации. Был ещё с parseInt, но он походу устарел, либо не подходит, непонятно...
Да даже если сделать
C++:
int zone = t_z[0] * 3600;
не помню результат, то тоже не подошёл, либо не компилирует)
Может покопать либы библиотеки, добавить кроме записи в char другие варианты?)

Попробую ещё так, через .as
JsonDocument::as<T>()
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Тут печать идет
Serial.println(t_z);
а, в вычислении t_z[0]

Я пока не дом, позже гляну что у меня с json, но точно помню, что у меня в json числа хранятся как текст, и при извлечении вроде перевожу в целое. Почему то отказался от хранения числа как число. Не помню сейчас.
 

bort707

★★★★★★✩
21 Сен 2020
2,859
849
Выполните
Serial.print((uint8_t) t_z[0])
и скажите результат
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
Изменено:

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
tz[0] Это символ 3 (код 51)
Короче получается байда с путаницей кодов и символов. Приводите все к одному виду, не надеясь , что прокатит.
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Складывать и вычитать надо числа. Переводите строки в числа.
Считали строку зоны из jsona - далее ее в число и уже его храните в настройках. Не будет таких проблем.
ЗЫ.
Вот даже так отлично у меня работает:
uint8_t tz = DEF_TZ;
Чтение:
wifi_cfg.tz = doc["tz"];
Запись:
doc["tz"] = String(wifi_cfg.tz);

Библиотека ArduinoJson 6.19.4
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
@Старик Похабыч, сделал так)
C++:
  String zone = (String) t_z;
  int timezone = zone.toInt();
C++:
  Serial.println(t_z);
  Serial.println(zone);
  Serial.println(timezone);
Код:
3

0
Чтение:
wifi_cfg.tz = doc["tz"];
нельзя так делать в
C++:
  String timezone;
  strcpy(timezone, doc["j_zone"]);
Код:
cannot convert 'String' to 'char*' for argument '1' to 'char* strcpy(char*, const char*)'
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
а вот такой вариант намного интереснее))
C++:
int zone = (int) t_z;
C++:
  Serial.println(t_z);
  Serial.println(zone);
Код:
3
1073678024
 

Sergo_ST

★★★★★★✩
15 Мар 2020
798
731
Как и сказал @bort707, пробуйте явно привести тип элемента массива символов:
C++:
 uint8_t zone = (uint8_t)t_z[0] - '0';
И используйте переменные той размерности, что требуются в конкретном случае. Для значений 0-9 явно int избыточен...
 
Изменено:

Sergo_ST

★★★★★★✩
15 Мар 2020
798
731
Приведите участок кода полностью, от объявления переменной zone до вывода данных в монитор порта. Строка t_z явно пустая в момент объявления переменной zone, но уже заполнена при выводе данных в отладку.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
@Sergo_ST,
в заголовке задаются
C++:
char ssid[32] = "";
char pass[32] = "";
char t_z[3] = "";
которые через вэб интерфейс, при отсутствия интернета вводятся на сайте и сохраняются в gson
также в заголовке идет настройка NTP
C++:
uint8_t zone = (uint8_t)t_z[0] - '0';
NTPClient ntpClient(udp, ntp_srv, (zone * 3600), Period);
считывание конфига происходит тут, интернет работает
C++:
bool loadConfig() {
    ...
  strcpy(ssid, doc["j_ssid"]);
  strcpy(pass, doc["j_pass"]);
  strcpy(t_z, doc["j_zone"]);
    ...
    }
вывод в монитор идет в последнюю очередь в setup, когда все считано и настроено
C++:
void setup() {
  Serial.begin(115200);
  LittleFS.begin();
  ntpClient.begin();
  wifi_connected();
  portal.attachBuild(build_index);
  portal.start();
  TempHome();
  TempStreet();
  Press();

  Serial.println(t_z);
  Serial.println(zone);
  //Serial.println(timezone);
}
 

Sergo_ST

★★★★★★✩
15 Мар 2020
798
731
Если считывание конфига происходит ниже объявления переменной zone, то не мудрено что строка пустая в момент объявления переменной zone.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
@Sergo_ST, и в каком месте тогда записать в zone переменную t_z, в loadConfig?
 

Sergo_ST

★★★★★★✩
15 Мар 2020
798
731
В каком месте это уже решать Вам, последовательность должна быть такая: сначала читаем конфиг strcpy(t_z, doc["j_zone"]), затем только что-то пытаемся сделать со строкой t_z.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
@Sergo_ST, сделал так
C++:
  strcpy(t_z, doc["j_zone"]);
  zone = (uint8_t)t_z[0] - '0';
  Serial.println(t_z);
  Serial.println(zone);
работает правильно, но теперь каким образом zone попадет в заголовок, где происходят изначальные настройки?
C++:
NTPClient ntpClient(udp, ntp_srv, (zone * 3600), Period);
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
посмотри есть ли такая функция :
ntpClient.setTimeOffset(zome*3600)

Все же не пойму зачем хранить зону в символьном виде char t_z[3] = "";
используя int8_t можно задать все зоны , ну кроме половинных, но это редкость.