Часы на esp8266 и max7219 + android управление

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

?

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

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

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

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

    123 голосов
    46,4%
Можно выбрать сразу несколько вариантов.
  1. Вложения:

  2. Всех с наступающим Новым Годом. Поделитесь библиотеками. В шапке их нет.
     
  3. IvanUA

    IvanUA Гуру

    Всем привет.
    Начал делать двухстрочную 4.5
    Кому интересно для тестов ссылка https://drive.google.com/file/d/1tQvvu5j1dnSUaeSjG5tSZUGYI1ZW2qj4/view?usp=sharing
    Визуально изменений не много, но код реально пришлось переписывать наверное под 50%)))

    Всех с наступающим НГ. Удачи во всех Ваших начинаниях)))
     
    max50a5 нравится это.
  4. max50a5

    max50a5 Гик

  5. klslab

    klslab Нерд

    библиотека для версии 4,х
    qr.png https://yadi.sk/d/SMlMWaGxkpz7vA

    Иван если возможно в новой 4.5 сделать корректировку давления получаемого с погодного сервера, а то от высоты показывает не коректно, разница с bmp280 очень большая.
     
    Последнее редактирование: 31 дек 2020
    Convix_Maximus нравится это.
  6. Pitruxa

    Pitruxa Гик

    Ну вот, ещё баги в 4.4 не по фиксили, уже 4.5 гоним...
     
  7. max50a5

    max50a5 Гик

    А что так грубо?
    Иван же написал:
    Не интересно, пойдите мимо и тихо.
     
    Последнее редактирование: 1 янв 2021
  8. Pitruxa

    Pitruxa Гик

    Вообще ни капли не грубо!
    Почему никто не любит правду? Как только звучит правда - сразу в грубости пытаются уличить.
    Просто думаю что нужно разобраться в багах в показаниями НародМона, а то с такими результатами народмон в часах что есть что его нет.
    Я бы с привеликим потестил, да только вот беда, знаете ли, так сложилось, что у меня (как наверное и большинства тут присутствующих) - однострочная версия...
     
  9. IvanUA

    IvanUA Гуру

    Не расстраивайтесь вы так))) По факту все одно пофиксим))))
    Дел много - времени мало)))
    Ну да ладно...
    Смотрите
    Код (C++):
    long timestamp = epochNM + (millis()/1000);

      for(byte i=0;i<3;i++){
        if(sensors_ID0 && sensors_id[i]==sensors_ID0){
          if((timestamp-sensors_time[i])>3600){
            nMon00=999;
          } else nMon00=value[i];
        }
    в таймштамп - мы получаем так сказать штамп времени. А в сенсор-тайм хранится время обновления данных. По условию если от текущего времени отнять время обновления сенсора и оно будет больше чем 3600 секунд то результат как раз будет 999.
    Теперь давайте попробуем разобраться... код глючит или данные с датчиков очень стары... Кстати если период обновления датчиков не критичен, то 999 можно убрать)))
     
  10. klslab

    klslab Нерд

    кстати сегодня глюк интересный каждый час напоминалка вместо "Новый Год!!!" - "Отведи ребенка в школу"; прикольно.
     
  11. IvanUA

    IvanUA Гуру

    Если добавить еще один модуль матриц - можно попробовать двухстрочную... Лично мне она нравится больше. Там часы всегда на экране))) Но, это дело вкуса...
    Да, и у меня такой же глюк, на однострочной... Проверю и постараюсь его исправить уже в новой прошивке... Тем более как показал опыт переделки двух строчной прошивки 4.5 - то есть смысл обновить до 4.5 и однострочную...
    Кстати вот обновленная ссылка не тестовую двухстрочную 4.5 https://drive.google.com/file/d/1-fAy8jOXdSRW7bNkDYVYZR9gbC04NTwn/view?usp=sharing (увы старое сообщение не могу отредактировать что бы поправить ссылку)

    Так вот. Переделка текущей 4.4 двухстрочной показала что если уже дальше модернизировать скетч, то нужно во первых менять сам подход хранения данных в ЕПРОМЕ... Часть функций работы с Json строкой убрать из скетча а вынести в веб интерфейс и там уже обрабатывать их средствами javascript. Естественно пришлось немного менять интерфейс + переписать все веб страницы... Зато теперь точно понимаешь что не нужно выделять много места в ЕПРОМЕ под данные - и можно спокойно выделить место под прошивку при помощи ОТА.... И еще остается достаточно места для своих хотелок... При желании, кто захочет сможет в память и перевод всех страниц и на разные языки впихнуть))))
    Совсем недавно с max50a5 делали внешний сенсор по примеру автора himikat123 с радиокота.... Так там мне понравилась идейка выбором и хранением Wifi сетей. Мы ее использовали в своем внешнем датчике, ну и сюда я ее тоже перенес. Довольно удобная вещь если часы не живут все время на одном месте с одним Wifiем))) Так же в проекте было много переменных которые был смысл перенести в масивы, чем собственно модифицировать код при помощи обработки этих переменных в циклах.... Мелочь, но это мне кажется правильнее...
    Вот так, казалось бы внешне практически ничего не изменилось, а почти неделя 5х8 часов времени просто ушли))))
    Остался правда еще один большой кусок работы - в вебе уже добавил возможность выбора времени и очередности отображения данных, а вот в саму механику, надо будет еще вносить...
     
    max50a5 нравится это.
  12. Pitruxa

    Pitruxa Гик

    Это условие уже присутствует и в предыдущем коде, без ID датчиков, но там показания выходят те, что отсылают датчики. А в поправленной версии всегда "999"
     
  13. DiMaro

    DiMaro Нерд

    кстати, если первая сеть отсутствует и мы подключились ко второй сети, при ресете в лог всегда уходит неверная информация о подключенной сети. это всегда ssid0

    попробовал исправить и в процессе увлекся и упаковал подключение к сетям в цикл с заданным кол-вом сетей

    Мне жутко не хватает в подобных устройствах статических настроек сети...
    без веб морды то прикрутил, не проблема... а вот с вебмордочкой...

    Код (C++):

    void wifiConnect() {
       if(WiFi.status() == WL_CONNECTED){
      WIFI_connected = true;
      if (printCom) PrintSerialNetParam();
      firstStart=1;
      timeUpdateNTP();
      amountNotStarts=0;
      return;
      }

      for (int wnc = 0; wnc < maxSSID; wnc++)
      {
      if (printCom) {
      printTime();
      Serial.print("Connecting to " + String(ssid[wnc].c_str()) + "  pass:" + String(password[wnc].c_str()));
      }

      if (!firstStart) printStringWithShift("WiFi", 15);
      WiFi.disconnect();
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid[wnc].c_str(), password[wnc].c_str());

      for (int i = 20; i != 0; i--) {
      if (WiFi.status() == WL_CONNECTED) {
      if (WiFi.getAutoConnect() != true) {
      WiFi.setAutoConnect(true);
      WiFi.setAutoReconnect(true);
      }

      WIFI_connected = true;
      if (printCom) PrintSerialNetParam();
      if (!firstStart) {
      String aaa = WiFi.localIP().toString() + space;
      clr();
      printStringWithShift(" IP: ", 15);
      printStringWithShift(aaa.c_str(), 25);
      }
      firstStart = 1;
      timeUpdateNTP();
      amountNotStarts = 0;
      return;
      }

      if (printCom) Serial.print(".");
      if (!firstStart) {
      int j = 0;
      while (j < 500) {
      if (j % 10 == 0) showAnimWifi(i);
      j++;
      delay(1);
      }
      }
      delay (800);
      }

      if (printCom) Serial.println(" Not connected!");
      }

      WiFi.disconnect();
      amountNotStarts++;
      if (printCom) {
      Serial.print("/tAmount of the unsuccessful connecting = ");
      Serial.println(amountNotStarts);
      }

      if (amountNotStarts > 21) {
      amountNotStarts = 0;
      firstStart = 0;
      ESP.reset();
      }

      if (!firstStart) {
      WiFi.mode(WIFI_AP);
      WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
      WiFi.softAP(ssidAP.c_str(), passwordAP.c_str());
      if (printCom) {
      printTime();
      Serial.println("Start AP mode!!!");
      Serial.print("WiFi AP IP : ");
      Serial.println(WiFi.softAPIP());
      }
      updateTime();
      String aaa = tPoint + " " + ssidAP;
      if (passwordAP != "") aaa += ",  " + tPass + ": " + passwordAP;
      aaa += ",  " + tIp + ": 192.168.4.1";
      clr();
      printStringWithShift(aaa.c_str(), 35);
      }
    }
     
     
  14. Pitruxa

    Pitruxa Гик

    Значит провёл эксперимент, увеличил время больше чем 3600 секунд и намерено отключил один датчик.
    Так вот, на не работающем датчике стабильно показывало температуру 0.0, а вот на работающем, который шлёт показания, стабильно выводило 999.
    Так что не работает код проверки ID датчиков. Где-то ошибочка притаилась.
     
    Последнее редактирование: 2 янв 2021
  15. Pitruxa

    Pitruxa Гик

    А кто мешает в роутере прописать каждому устройству статику?
    И каждое устройство всегда будет иметь один и тот же IP !
     
  16. DiMaro

    DiMaro Нерд

    Ни кто, а что... Как вариант, отключенный DHCP сервер на роутере...
     
  17. IvanUA

    IvanUA Гуру

    А смысл отключать DHCP на роутере?
    Со статикой думал, но вот незадача, если у вас 10 сетей прописаны в устройстве, то что, для каждой сети в устройстве прописывать статику (свою)?
     
  18. Pitruxa

    Pitruxa Гик

    Такое бывает ОЧЕНЬ редко, один случай на 1000
     
  19. max50a5

    max50a5 Гик

  20. DiMaro

    DiMaro Нерд

    и где же такая статистика опубликована? кухарка у плиты, понятное дело, даже не слышала про какой-то там DHCP
    а у меня соседка с отключенным DHCP, согласная на все, кроме пароля от админки своего роутера :D

    Иван, вы планируете использовать перебор из 10 беспроводных сетей?
    10 это уже перебор. :)
    для двух, почему бы и нет, это нормальная практика для законченных сетевых устройств.
    огромное количество памятных дат, настроек MQTT ведь не утруждают никого....
    и если позволяет программная память то почему бы и нет?
    тем более, что чекбокс для любителей DHCP решает все проблемы по энерго и трудозатратам
    но тут, как говориться - хозяин барин, решать Вам

    попутно родился вопрос
    меня заинтересовал интервал автоматической синхронизации RTCмодуля (или при его остуствии) с NTP сервером, а так как, в настройках времени не нашел установку этого интервала для пользователя, полез искать его в коде... мне откровенно говоря сложно это делать, так как, вся моя практика работы с микроконтроллерами преимущественно завязана в среде AVR и исключительно на ассемблере. глядя на ардуиновские скетчи некая ломка мозга присутствует. в общем смысл понятен, но из-за отсутствия опыта и практики приходиться в некоторые тонкости вникать...
    всего несколько дней изучаю пару открытых проектов на AIDE.

    как я это вижу
    синхронизация с NTP-сервером осуществляется при холодном старте или ресете после удачного подключения к сети вайфай в функции timeUpdateNTP()
    а так же в основном цикле, при условии, если ранее по какой-то причине не удалась синхронизация - каждый час в 2 минуты, 43 секунды
    и ручками через вебку в handle_ntp()

    после любой удачной синхронизации флаг, в лице statusUpdateNtpTime устанавливается, тем самым запрещает синхронизацию
    в чем хитрость? в логе не дождался...