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

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

?

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

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

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

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

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

    Deniskyn Гик

    Есть интересный проект ESPEasy с блек джеком и шл... с вебмордой и выбором кучи сенсоров, здесь можно много чего под себя подстроить.[/QUOTE]
    Смотрел, но как это подружить с CloudMQTT так и не понял =(
     
  2. Evg33

    Evg33 Нерд

    Фикс на погоду LED_clock_weath_v11.11.2018

    Поправить файл LED_clock_weath_v11.11.2018.ino в 2х местах:

    в "void getWeatherData" и void getWeatherDataz в этом файле поменять такое:
    Код (C++):

    while (ESPclient.connected() && ESPclient.available()) {
     
    на такое:
    Код (C++):

    while (ESPclient.available()) {
     
    У меня на wemos d1 в корпусе https://www.thingiverse.com/thing:2867294 .
     
    Последнее редактирование: 12 дек 2018
  3. IvanUA

    IvanUA Гуру

    Простите, а в чем фикс то заключается? Глубоко не вникал, в чем проблема то была в прошивке 11.11? Что именно пофиксали?
     
  4. MIchaell

    MIchaell Нерд

    И я тогда оставлю корпус для часов на 6 панелей. Есть ещё на 4, но немного другой. Max7219 Case found on #Thingiverse https://www.thingiverse.com/thing:3199715
     
  5. buba911

    buba911 Гик

    Там вроде всё написанно https://esp8266.ru/forum/threads/espeasy-knopka-reakcija-na-knopu-nagruzka-mqtt-v-obe-storony.3209/, через веб интерфейс,с той лишь разницей, что автором был использован брокер OpenHAB MQTT
    Тот же самый ..., только в левой руке.
    upload_2018-12-11_22-21-47.png
     
  6. IvanUA

    IvanUA Гуру

    ОК. Спасибо, буду ждать.
     
  7. IvanUA

    IvanUA Гуру

    Немного не понял, поясните чем это не подходит?
    Код (C++):
      while(ESPclient.connected() && ESPclient.available()) {
        char c = ESPclient.read();
        if(c == '{') startJson = true;
        if(startJson) line += c;
      }
     
  8. Evg33

    Evg33 Нерд

    К этому времени ESPclient.connected() уже равно нулю (сервер ответил и разорвал соединение), следовательно код внутри условия не выполняется и в line мы получаем пустую строку. Отдебажил выводом в серийник ESPclient.connected() и переменной c.

    p.s.
    потом я ещё поменял
    Код (C++):
     
      int  repeatCounter = 0;
      while (!ESPclient.available() && repeatCounter < 10) {
        delay(500);
        repeatCounter++;
      }
     
    на
    Код (C++):
     
    while (ESPclient.connected() && !ESPclient.available()) delay(1);
     
    т.к. delay(500) расточительство :)
    но работает и без этого. Достаточно того, что в 1м абзаце.
     
  9. IvanUA

    IvanUA Гуру

    Как вижу это я:
    Вы запускаете цикл в котором проверяете есть ли соединение - ESPclient.connected()
    и есть ли в ответе сервера данные - ESPclient.available()
    до получения ответа подвешиваете процессор на delay(1)
    Я так понимаю что или до получения полных данных или до обрыва соединения.

    Код (C++):
      while(!ESPclient.available() && repeatCounter < 10) {
        delay(500);
        repeatCounter++;
      }
    Здесь идет как бы пауза в 5000 ваших циклов (delay(1)) или до получения полного ответа.
    Код (C++):
      while(ESPclient.connected() && ESPclient.available()) {
        char c = ESPclient.read();
        if(c == '{') startJson = true;
        if(startJson) line += c;
      }
    Здесь проверяем есть ли коннект с сервером... наверное уже зря))))
    Если есть коннект и данные получены, то откусываем хидер.

    Думаю что если убрать проверку на ESPclient.connected() - то расшифровка ответа сервера будет с большей вероятностью доступна.
    А если эту проверку коннекта добавить в первый цикл, то можно будет сократить время работы функции если вдруг рассконнектится соединение с сервером.

    Я правильно понял вашу мысль)))))
    ПС... Не обращал на это внимание. Может мне конечно повезло с железом или ИДЕ, но после компиляции и прошивки, данные залетают мгновенно и вот только сегодня увидел одну мигающую точку и то в правом углу)))
     
  10. Evg33

    Evg33 Нерд

    С NTP можно гораздо проще и правильнее работать на ESP.
    Оно уже там всё есть внутри в отличии от ардуинки.
    Код (C++):

    #include <sntp.h>
    #define NTPZ 3                                // Таймзона (для Москвы +3)
    #define NTP0 "ru.pool.ntp.org"                // Основной сервер времени
    #define NTP1 "europe.pool.ntp.org"           // Дополнительный сервер времени
    #define NTP2 "pool.ntp.org"                   // Дополнительный сервер времени
    sntp_stop();
    sntp_setservername(0, (char*)NTP0);
    sntp_setservername(1, (char*)NTP1);
    sntp_setservername(2, (char*)NTP2);
    sntp_set_timezone(NTPZ);
    sntp_init();
     
    Далее где надо время используем например такое:
    String(sntp_get_current_timestamp) для получения таймштампа
    String(sntp_get_real_time(sntp_get_current_timestamp())) для получения времени с датой
    Во первых код меньше, во вторых может использовать несколько NTP-серверов.

    https://www.ntppool.org/zone/europe
    Europe — europe.pool.ntp.org
    To use this specific pool zone, add the following to your ntp.conf file:

    server 0.europe.pool.ntp.org
    server 1.europe.pool.ntp.org
    server 2.europe.pool.ntp.org
    server 3.europe.pool.ntp.org

    In most cases it's best to use pool.ntp.org to find an NTP server (or 0.pool.ntp.org, 1.pool.ntp.org, etc if you need multiple server names). The system will try finding the closest available servers for you. If you distribute software or equipment that uses NTP, please see our information for vendors.

    Russian Federation — ru.pool.ntp.org (115)
    Ukraine — ua.pool.ntp.org (69)

    Т.е. под именем ru.pool.ntp.org скрывается 115 серверов. под именем ua.pool.ntp.org - 69.
    Достаточно использовать одно из этих имён. Или europe.pool.ntp.org. Или вообще pool.ntp.org.
     
    Последнее редактирование: 12 дек 2018
  11. Evg33

    Evg33 Нерд

    По всем пунктам да.
    И видите и поняли верно и не вешает проц на delay(500). (что аж точки замирают при обновлении погоды).

    p.s.
    Раз у нас сервер хранится в переменной weatherHost, то и в
    "Host: api.apixu.com\r\n" +
    д.б. по идее
    "Host: " + weatherHost + "\r\n" +
    Иначе если забить другой сервер, то у этого другого сервера будет запрашиваться хост api.apixu.com, которого там нет. Но api.apixu.com будет работать и так и так. Т.е. можно и вообще убрать эту настройку на погодный сервер :) один фиг на старом рега уже закрыта, а под другие сервера скорее всего понадобится джэйсона по другому разбирать.
     
    Последнее редактирование: 12 дек 2018
  12. IvanUA

    IvanUA Гуру

    Возможно. Давайте пример. Если действительно все так, то добавим его в код.
    Тогда, если у вас нет возражений, добавим эти изменения в скетч.
    Сейчас допиливаю информер на 8-10 матриц. Вот там (по совету форумчанина из этой ветки) время выводится через таймер. Точки мигают всегда)))))))
    А замирание в основном происходит во время ожидания ответа MQTT сервера. Есть идеи по этому поводу?
    Ну да, согласен. Быстро вклеил, думал потом поправить, так и осталось)))
     
  13. IvanUA

    IvanUA Гуру

    Поправил у себя скетч.... и.... пропал прогноз. Ну тобишь на сейчас есть, а на сегодня/завтра нет.
    У меня мысли только одни... Данные о разрыве соединения приходят быстрее чем загружается тяжеленный прогноз...
    Если убрать проверку на конец соединения и оставить только проверку на данные, то можем завесить цикл.
    По этому вернул все таки назад. И сразу стал прилетать прогноз.
    Думаю что функция получения ответа от сервера работает по прерываниям и не зависит от delay.
    Соответственно при более слабом интернете ответ идет долго, а мы с delay(1) посылаем все новые и новые запросы, пока сервер не разорвет соединение и мы от него не отстанем.
    А вот когда паза в программе в 0,5 секунды, то ЕСП акурат успевает получить ответ сервера, и по этому у меня теперь есть прогноз.
    А попробуйте в прошивке с моим вариантом просто убрать ESPclient.connected() - думаю что прогноз прилети и к вам))))
     
  14. Evg33

    Evg33 Нерд

    Что-то поменялось во втором джэйсоне погодника.....
    Был буффер 2614, а стал 2694.
    ArduinoJson Assistant теперь выдаёт:
    JSON_ARRAY_SIZE(2) + JSON_OBJECT_SIZE(1) + 4*JSON_OBJECT_SIZE(3) + 4*JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(8) + 2*JSON_OBJECT_SIZE(12) + JSON_OBJECT_SIZE(20) + 1262;j
     
  15. Evg33

    Evg33 Нерд

    Вот так вот стало замечательно : :)
    Код (C++):
      int  repeatCounter = 0;
      while (ESPclient.connected() && !ESPclient.available() && repeatCounter < 50) {  //увеличил на 5 и перенёс  в эту строку ESPclient.connected()
        delay(100); //уменьшил на 5
        repeatCounter++;
      }
     
      String line;
      bool startJson = false;
      //while (ESPclient.connected() && ESPclient.available()) {
      while (ESPclient.available()) { // тут убираем ESPclient.connected
        char c = ESPclient.read();
        if (c == '{') startJson = true;
        if (startJson) line += c;
      }
      ESPclient.stop();
     
    Строки const size_t bufferSize поправил на новые json (https://arduinojson.org/v5/assistant/) и дописал в конец + 1500 на случай сюрпризов.
    Дома 2 сборки. Обе теперь на ура.
     
  16. Evg33

    Evg33 Нерд

    Они там ещё через точку росы выводят "ощущается как".
    Добавил себе:
    Код (C++):
      float current_temp_c = current["temp_c"]; // 10
    + float current_feelslike_c = current["feelslike_c"];
      JsonObject& current_condition = current["condition"];
    ...
      weatherString = "         " + String(location_name) + ", " + tNow + ":    \212 " + String(current_temp_c, 0) + ("\202") + "C";
    + weatherString += "     (Ощущается как " + String(current_feelslike_c, 0) + ("\202") + "C)";
      weatherString += "     \213 " + String(current_humidity) + "%";
     
    Последнее редактирование: 12 дек 2018
  17. Gostin

    Gostin Нуб

    Простите но 132 страницы форума не осилил, да по пинах в прошивке не могу разобраться куда подпаять ds18b20 с схемы понял что для дома нужно пидпаятись к GPO0, а вот для улици незнаю, помогите и если нетрудно ответьте на такой простой вопрос, очень благодарен.
     
  18. Evg33

    Evg33 Нерд

    Можно написать в коде не номера GPIO, а имена портов. Например так:
    Код (C++):
    #define DIN_PIN   D7
    #define CS_PIN    D8
    #define CLK_PIN   D5
    #define buzzerPin D6
     
    Я сделал так, т.к. у меня на wemos d1 mini они подписаны именно так.
     
  19. Deniskyn

    Deniskyn Гик

    Вот еще такая версия, вдруг кому интересно...
    Сверху только часы, низ информер =)
    [​IMG][​IMG]
    Камера телефона коряво передает цвет из за лэд света =)
     
    Последнее редактирование: 12 дек 2018
    Kesik, RuslanV и Sandr нравится это.
  20. Sandr

    Sandr Гик

    Вот классно. Я как раз так и хотел сделать.