ESP, IoT [BigClock] Большие часы на WS2812, ESP8266, Народный мониторинг

Какой вариант датчика используется у вас? Интересно, использует ли кто BME280, как у меня?)

  • BMP280

    Голосов: 26 26.8%
  • BME280

    Голосов: 71 73.2%

  • Всего проголосовало
    97

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

★★★★★★★
14 Авг 2019
4,323
1,319
Москва
Не совсем то. Флаг надо не просто выставлять, а только если были изменения. Так ты возвращаешься к частому отображению.

Вот у тебя функция:
displayTime(TemperToString());
что она делает ?
Что делают функции :
TemperToString()
timeToStringDots()
timeToString()?
Если я тебя правильно понял, то они переводят значение температур, времени и т.д. в строку, которую ты будешь выводить на экран. Не совсем понятно , что с точками, ну да ладно.
Тогда можно сделать так
newStroka=TemperToString();
newStroka=TimeToString();
Тогда надо завести статическую переменну oldStrika, которая будет хранить последнее выведенное на экран значение.
И тогда:
если (oldStrika!=newStroka)
{
oldStrika=newStroka;
displayTime(newStroka);
фастлед.шоу(маст го он);
}
 
  • Лойс +1
Реакции: ASM

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
@maksland, схема описана в коде в настройках)
а так все стандартно, I2C пины D2, D1, питание есть откуда брать, земля тоже везде) только плату запитать)
 

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
@maksland, схема в настройках самое удобное, не надо искать и спрашивать, все под рукой) потом для оформления первого поста можно будет и нарисовать) а пока в стадии разработки и улучшения нет времени на оформление, да и понять бы в чем тут рисуют схемы)) расположение конечно же классическое))
пипец просто, как у тебя хватает терпения только
ну что не так)) уехали из общей темы, не нервируем никого)) новый крупный проект, которого на форуме нет) кто желает поучаствовать и/или имеет навыки, пусть присоединяется)
 

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

★★★★★★★
14 Авг 2019
4,323
1,319
Москва
@ASM,
это ваш код, я тут причем))
Ну обезьянку то не надо включать! Надо под себя делать. Я показывал общий пример, направление куда двигаться.
у меня эта функция как раз и выводит в монитор порта готовую текстовую строку.
У тебя же функция должна получать данные с часов, термометров и датчиков давления, и если данные отличаются от предыдущих выставлять флаг и заливать их в массив для фаст лед. Но без вывода!
После того как основные данные (цифры-буквы) залиты надо тоже самое сделать с точками

А уже в конце проверить менялось ли что то? было ли что то залито в матрицу ? Ах было! Тогда на тебе фастлед новая матрица, выводи ее немедленно!

Я практически никогда не даю код, который можно скопировать. Его всегда надо обдумать и понять и тогда будет просто
 
  • Лойс +1
Реакции: foka44

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
не выдержал, взял исходник и вырезал displaytime)) код перекинул в функции, компилятор одобрил, ну неужели)
C++:
/*
   (с) Старик Похабыч, апрель, 2021 год.
*/
bool hasChange = false;                     
uint8_t periodDisplay[] = {4, 2, 2, 2};     
uint8_t orderDisplay[] = {0, 1, 0, 2, 0, 3};
uint8_t mode = 0;
bool showDot = false;                       

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

void loop() {
  static uint32_t ch_tmr = millis(); 
  if ((millis() - ch_tmr) < (periodDisplay[orderDisplay[mode]] * 1000))
  {
    switch (orderDisplay[mode]) {
      case 0:
        timeToStringDots();
        break;
      case 1:
        TemperToString();
        break;
      case 2:
        TemperOutToString();
        break;
      case 3:
        PressToString();
        break;
    }
  }
  else
  {
    ch_tmr = millis();
    mode++;
    if (sizeof(orderDisplay) == mode) mode = 0;
  }
}
void TemperToString()
{
  if (!hasChange) return;
  hasChange = false;
  static uint32_t tmr1 = millis() - periodDisplay[1] * 1000;
  if (millis() - tmr1 < (periodDisplay[1] * 1100)) return;
  tmr1 = millis();
  hasChange = true;
}

void TemperOutToString()
{
  if (!hasChange) return;
  hasChange = false;
  static uint32_t tmr1 = millis() - periodDisplay[2] * 1000;
  if (millis() - tmr1 < (periodDisplay[2] * 1100)) return;
  tmr1 = millis();
  hasChange = true;
}

void PressToString()
{
  if (!hasChange) return;
  hasChange = false;
  static uint32_t tmr1 = millis() - periodDisplay[3] * 1000;
  if (millis() - tmr1 < (periodDisplay[3] * 1100)) return;
  tmr1 = millis();
  hasChange = true;
}

void timeToString()
{
  if (!hasChange) return;
  hasChange = false;
  static uint32_t tmr1 = millis();
  if (millis() - tmr1 < 500) return;
  tmr1 = millis();

  char temp[10];
  uint32_t nt = millis() / 1000; //получили секунды
  static int8_t old_s = 255;
  int8_t s = nt % 60;
  if (s != old_s)
  {
    old_s = s;
    hasChange = true;
  }
  else return;
}
void timeToStringDots()
{
  if (!hasChange) return;
  hasChange = false;
  static uint32_t tmr1 = millis();
  if (millis() - tmr1 < 500) return;
  tmr1 = millis();
  char temp[10];
  uint32_t nt = millis() / 1000;
  static int8_t old_s = 255;
  int8_t s = nt % 60;
  showDot = !showDot;
  hasChange = true;
  int8_t m = nt / 60 % 60;
  int8_t h = nt / 3600 % 24;
}
так можно?)
 

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

★★★★★★★
14 Авг 2019
4,323
1,319
Москва
Можно как хочешь, только не всегда работать будет , вот эта строка не даст:
if (!hasChange) return;
по моему представлению hasChange становится тру, когда матрице есть что обновлять. И когда фастлед обновила матрицу (сделав шоу), то hasChange надо сбрасывать в фальш.
А тут получается что то непонятно.
 

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
Я не про ограничения вывода матрицы, с этим позже займусь, надо избавиться от displaytime, который не даёт привязать флаг к функции) Ругается на String.
Displaytime сам участвовал в выводе показаний с датчиков, проверяя изменения...
Чтобы убрать посредника, в виде displaytime, условие от него перенес в каждую функцию, заменив String на void.
 

vortigont

★★★★★★✩
24 Апр 2020
1,020
543
Saint-Petersburg, Russia
а где сами часы-то? Или это пока только концепт? У меня вот такие есть, с датчиками, погодой из инета бегущей строкой, часовыми зонами и пр. если интересно
 

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
@vortigont, сами часы показаны в другой теме) здесь мы переходим с ардуино на ESP)
 

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
Ура, переделал код, вроде все работает))
FastLED с флагами мне не понравилось как работает, не корректно)
Сделал проще, раз кое-кто пишет, что часто вызываю, 10 раз в секунду, поставил на 2 вызова в секунду, это немного))
Датчик BME уже доставлен в ПО, оперативно, 5 дней ПР) завтра схожу, сегодня лень)
Мелкие доработки доделаю и можно публиковать изменения)
 

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

★★★★★★★
14 Авг 2019
4,323
1,319
Москва
10 раз тоже не много. Если этого требует логика. Ну не шмог флаги выставить... бывает... :p
2 раза без секунду нормально, точки вряд ли будут чаще мигать. я на часах ГРИ поставил 1 горят 1 нет. Мне так нравиться. Тут дело вкуса.
Пробовал делать разный период мигания точек ?
 

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
точки появляются в датчиках...
поставил FastLED на 10 раз в сек, не помогло)
ставить Dots(!Dot); в датчиках принудительно?) по идее они должны быть только в первом режиме)
 

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
Обновление прошивки))

Получил BME280, добавил в прошивку вывод влажности, обнаружил некоторые баги, исправил, осталось перепаять на свой проект и проверить работу)
Символ влажности добавлю)
 
Изменено:

razwal

✩✩✩✩✩✩✩
20 Янв 2020
22
3
Здравствуйте ASM. Чтобы не выводить на дисплей влажность , достаточно в 391 строке поставить для неё 0 ?
 

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
@razwal,
uint8_t periodDisplay[] = {6, 2, 2, 2};
uint8_t orderDisplay[] = {0, 1, 2, 3};
Лучше так) Хотя, по идее, должен и ноль сработать, ну лучше убрать и там и там)
 
Изменено: