Часы на ESP-12(NodeMCU) + MAX7219 + WEB интерфейс

Тема в разделе "Глядите, что я сделал", создана пользователем IvanUA, 28 авг 2017.

?

Вы повторили это проект?

  1. Нет (просто ознакомился)

    19 голосов
    11,0%
  2. Да, один раз (попробовал)

    72 голосов
    41,9%
  3. Да, не однократно

    82 голосов
    47,7%
Можно выбрать сразу несколько вариантов.
  1. volkodav34rus

    volkodav34rus Нерд

    Безымянный4.jpg
    Всё вопрос решён, установил VPN и всё ок зашел через него
     
  2. лкще7

    лкще7 Нуб

    Нашел глюк , когда часы находятся в ночном режиме (показывают часы на два дисплея ) приходит строка с mqtt нижний дисплей дергается.
     
  3. max50a5

    max50a5 Гик

    Тоже такое заметил, хотя не знаю от чего.
     
  4. IvanUA

    IvanUA Гуру

    Поправил. Перезалил на гитхаб
     
  5. SteinMark

    SteinMark Гик

    С наступающим новым Годом Друзья!
    Besinnliche Feiertage und einen guten Start ins neue Jahr, alle Eure Wünsche sollen werden wahr!
    Незабываемые праздники и хорошее начало нового года, все ваши пожелания должны сбыться!
     
    yri26 нравится это.
  6. dorinik

    dorinik Нерд

    С Новым Годом всех участников!
    Большая сила работы для новых идей, одна более захватывающая, чем другая!
     
  7. Deniskyn

    Deniskyn Гик

    Всех с наступающим!
    Последний софт на гите, версия плат 2.6.3, библиотеки https://drive.google.com/file/d/19_eOIZUR-WMRL-ovP-EqqbTqhG8j27ns/view
    Всех благ всем, ловим баги в новом коде=))))
    to ALL переписки по поводу VPN и т.д. в личку, тема засрана =(

    PS
    Идей очень много.....
     
  8. SteinMark

    SteinMark Гик

    При выводе информацион с MQTT нижняя строка не уходит полностью, последний символ остается.
     
  9. IvanUA

    IvanUA Гуру

    Я так понимаю что это при количестве матриц второго ряда больше 4-х?
     
    Последнее редактирование: 1 янв 2020
  10. SteinMark

    SteinMark Гик

    Здравствуйте Ivan! Нет 4х4 это в дневном режиме в момент показаний с датчиков,
    пробегает сообщение не до конца, 4 последних столбца остаются на 7 секунд.
    как бы зависая Далее штатный режим. Приходится делать 4 пробела в конце сообщения.
    И еще заметил разделительная точка даты, (месяц год) вплотную подвинута к году
     
    Последнее редактирование: 2 янв 2020
  11. Madcat

    Madcat Нуб

    Глюк с отображением размера часов и погоды если ночь не с "переходом через полночь"(8-23), а без(1-8).
    Вместо строки номер 490(вроде)....
    if (timeNight >= timeDay) // ночное время c переходом через полночь

    Но мы еще в выводе на экран погоды сверяемся еще раз с ошибкой...

    P.S. Не. Фигня получается. Надо переменную "ночь/день" вводить и от нее плясать.
    UPD:
    Вместо строки "bigCklock = ..." добавить
    Код (C++):
      bool DayTime = 0;
      if (timeNight >= timeDay)  // ночное время c переходом через полночь
      {
      DayTime = hour>=timeDay && hour<timeNight;
      }
      else  //  ночное время без перехода через полночь
    {
      DayTime = hour>=timeDay || hour<timeNight;
      }
      bigCklock = ((bigCklock_x2 == 1 && !DayTime) || bigCklock_x2 == 2) && butMode == 0;  
    И в остальных местах, где была проверка на время:
    Код (C++):
          if(DayTime) sendCmdAll(CMD_INTENSITY, volBrightnessD);

          if(hour >= timeScrollStart && hour < timeScrollStop && !(bigCklock_x2 && !DayTime) && butMode == 0) {        // працує тілки в дозволений час
    И в P_setup.h Добавить 0 часов и убрать 24 часа.
    Код (C++):
      <td align = "right"><span class="opt_cn">до:</span></td>
      <td><select id = "tbn">
      <option value = "0"> 0 </option>
      ....
      <option value = "23"> 23 </option>
    P.P.S. Все не проверял. Еще такая же фигня есть с определением времени вывода погоды.
     
    Последнее редактирование: 2 янв 2020
  12. IvanUA

    IvanUA Гуру

    Добавил в функцию принимаемых сообщений "добавку" 3-х пробелов на каждую матрицу))))
    Код (C++):
    for(byte i = 0; i < NUM_MAX1; i++) {
          Text += "   ";
        }
    К сожалению этого не избежать. Не хватило просто столбца при 4-х матрицах. Можно конечно изменить формат даты или еще что.
    Если будут идеи по данному вопросу прошу озвучить)))
     
  13. IvanUA

    IvanUA Гуру

    Если можно по подробнее, что то не совсем уловил как выражается этот глюк
    Не помню зачем это специально было сделано. Конечно можно потом вместо <24 использовать <=23, но не суть. Мне кажется что формулировка 24 подразумевает как раз ДО 23:59
    Ну если так конечно критично, то слово "до 24" можно заменить на "до полуночи". Может так действительно будет корректно?
     
  14. Madcat

    Madcat Нуб

    У вас в коде hour<timeDay || hour>=timeNight
    Предположим я выставил "дневное время с 8 утра до 1 ночи. Ну не засыпаю я раньше.
    hour<8 || hour>=1. B итоге "ночь" всегда.

    Если день с 8 до 0, например, то мы идем по второй ветке условия. Когда ночь без перехода через полночь.

    А если знак >= применять к началу дня, а < к концу, то получается вполне логичное "со скольки и до скольки". А 24 часов не бывает и нелогично их вводить :)

    Не. С погодой надо переписывать по тому же принципу.
     
    Последнее редактирование: 2 янв 2020
  15. Madcat

    Madcat Нуб

    Нашел у себя по свежей голове ошибку
    надо не
    Код (C++):
    if (timeNight >= timeDay)  // ночное время c переходом через полночь
    а
    Код (C++):
    if (timeNight > timeDay)  // ночное время c переходом через полночь
    Иначе нельзя отключить ночной режим полностью.
    P.S. Впрочем все равно мог накосячить. :) Я совсем не гуру в программировании :) Но вроде корректно работает.
    P.P.S. Вообще это цикл с проверкой надо засунуть куда-то, где он будет проверяться хотя бы раз в минуту. Незачем его пересчитывать постоянно. Лишние тормоза.
    P.P.P.S. Хотя тогда нужно засунуть его и в действия после применения настроек. Иначе задержка будет при изменении настроек.
    UPD. Думаю идеальное место - внутри условия if(second != lastSecond) {
    Раз в секунду достаточно. :) И код выполняется на 2-3% быстрее :)
    Вместе с bigCklock = ...
    Код (C++):
    void loop() {
      if(updateOTA) ArduinoOTA.handle();
      server.handleClient();                                                                // дозволяємо HTTP серверу відповідать на запити
      updateTime();                                                                         // оновлюємо час
      buttonInter();
      if(second != lastSecond) {                                                            // на початку нової секунди скидаємо secFr в "0"
        if (timeNight > timeDay){                          // ночное время c переходом через полночь
          DayTime = hour>=timeDay && hour<timeNight;  
          } else {                                         //  ночное время без перехода через полночь
          DayTime = hour>=timeDay || hour<timeNight;
          }
        bool oldBigCklok = bigCklock;
        bigCklock = ((bigCklock_x2 == 1 && !DayTime) || bigCklock_x2 == 2) && butMode == 0;
        if(oldBigCklok != bigCklock){
          clr(0);
          clr(1);
          refreshAll();  
          }
        lastSecond = second;
    И объявление переменной DayTime вынести в самое начало скетча.
     
    Последнее редактирование: 2 янв 2020
  16. IvanUA

    IvanUA Гуру

    Зачем вам еще одна переменная? не проще все нюансы жизненных циклов пользователей учесть в условии?
    Скажем так:
    Код (C++):
    bigCklock = ((bigCklock_x2 == 1 && (timeDay<timeNight?(hour<timeDay || hour>=timeNight):(hour<timeDay && hour>=timeNight)))|| bigCklock_x2 == 2) && butMode == 0;
    И для яркости тоже так:
    Код (C++):
    } else {
          if(timeDay<timeNight?(hour >= timeDay && hour < timeNight):(hour>=timeDay || hour<timeNight)) sendCmdAll(CMD_INTENSITY, volBrightnessD);
          else sendCmdAll(CMD_INTENSITY, volBrightnessN);
        }
    Событие bigCklock - обрабатывается в каждом цикле лупа - а то если сделать его раз в минуту, а вы вдруг среди минуты решили в вебе включить большие часы, сохранились, а часы до конца минуты будут маленькими.... Можно конечно засунуть его где-то под проверку if(secFr==0) или к примеру туда же где меняется яркость дисплея - но думаю что это уже не так критично для процессорного времени применимо к данной модели.

    Вариантов решения одной и той же задачи - великое множество. Все зависит от целей. Кто экономит прецессорное время, а кому его хватает и он просто не заморачивается и делает более удобо читаемый код.

    К слову об удобочитаемости - с этим у меня как раз таки есть проблемы. Через пол года посмотришь на такое условие с кучей переменных и вообще не понимаешь зачем оно и за что отвечает...
     
  17. Madcat

    Madcat Нуб

    15000(а то и больше) раз в секунду гонять достаточно сложное условие трижды? Обратиться к переменной проще и нет повторяющихся кусков сложного кода. К тому же во других местах его надо еще и в инвертированном виде смотреть.
    У меня дурацкая привычка постоянно дополнять комментарий:) Я вон выше как раз дополнил. Мне кажется что и просто, и удобочитаемо и выполняется с достаточной и необходимой частотой. Уж секунду пользователь точно потерпит :)

    Так усложнять код.... :) Коротко и красиво, не спорю. Но новичку вроде меня очень сложно :)
     
  18. Madcat

    Madcat Нуб

    Кстати, забыл спросить. А нету функции вывода на экран просто температуры из инета? А то я датчки пока прикручивать(и тем более тянуть до улицы) не собираюсь, а температуру видеть хочется.
    P.S. Зато собираюсь прикрутить датчик углекислого газа и "прочих органических газов"(читай природного газа). :)
     
  19. IvanUA

    IvanUA Гуру

    Есть, это температура улицы, можно получать по MQTT и через narodmon
     
  20. Madcat

    Madcat Нуб

    Спасибо. Нашел уже. Вроде location_temp
    Уже переписал одну из функций, только объявление переменных надо в начало вынести:
    Код (C++):
    //==========ВИВІД НА ЕКРАН ТЕМПЕРАТУРИ НА ВУЛИЦІ из прогноза========================================
    void showSimpleTempUF() {
      if(WiFi.status() == WL_CONNECTED) {
        int t_street_forecast_int = 0;    // температура на улице из прогноза целая беззнаковая часть
        int t_street_forecast_fract = 0;     // температура на улице из прогноза дробная беззнаковая часть
        t_street_forecast_int = int(location_temp*-1);
        t_street_forecast_fract = int(location_temp*10*(location_temp>0?1:-1))%10;
        byte indent = (NUM_MAX1 * 8) - 32;
        dx = dy = 0;
        clr(1);
        showDigit((location_temp < 0.0 ? 6 : 5), 0 + indent, (fontSizeData?znaki5x7:znaki5x8), 1); //друкуємо U+ альбо U-
        if(t_street_forecast_int <= -10.0 || t_street_forecast_int >= 10) showDigit((t_street_forecast_int < 0 ? (t_street_forecast_int * -1) / 10 : t_street_forecast_int / 10), 4 + indent, (fontSizeData?dig5x7:dig5x8), 1);
        showDigit((t_street_forecast_int < 0 ? (t_street_forecast_int * -1) % 10 : t_street_forecast_int % 10), 10 + indent, (fontSizeData?dig5x7:dig5x8), 1);
        showDigit(2, 16 + indent, (fontSizeData?znaki5x7:znaki5x8), 1);
        showDigit(t_street_forecast_fract, 18 + indent, (fontSizeData?dig5x7:dig5x8), 1);
        showDigit(0, 24 + indent, (fontSizeData?znaki5x7:znaki5x8), 1);
        showDigit(1, 27 + indent, (fontSizeData?znaki5x7:znaki5x8), 1);
        if(dataDown) scrollDown(1);
        refreshAll();
      }
    }
    Значок только другой подобрать надо, чтобы не путаться с датчиком.