• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Простые WiFi часы

Evgeniy163

New member
@voldemar2005 огромное спасибо за Ваш проект.
Вот... прирукожопил :) вифи внешний термометр. Софтописатель из меня еще тот :), но все работает.
 
Последнее редактирование:

RedCat

New member
ну проще всего заполнять массив int dig[6] нужными числами...
Таки заполнить dig[6] нужными числами вроде как несложно и выходит вполне успешно, но вот не получается у меня побороть ваши мигающие точки и пробелы между цифрами если приглушить точки, слишком в разных местах это все сидит. Видимо придется приклеивать второй дисплей :( либо присоединиться к гласу вопиющему к ТС:
А могли бы сделать? За отдельную благодарность.
ЗЫ Ну и дабы два раза не вставать подскажите, братцы, как мне добиться любви понимания от #define DEBUG_UDP? Вроде как ConsoleAddressUDP прописал, ConsolePortUDP вижу, пытаюсь зайти на IP : Port - а зайти не получается?
 
либо присоединиться к гласу вопиющему к ТС
у меня часы с этим дисплеем на работе, а там не совсем сподручно отлаживать код. А какой алгоритм то хочется, по возможности сделаю ...

это я делал для удаленного вывода диагностических сообщений, вместо console. Порядок следующий:
ConsoleAddressUDP IP компьютера, ConsolePortUDP любой свободный порт, запускаем утилитку UdpTerm_Std.exe из архива, в ней Ctrl+N прописываем адреса и порт, Ctrl+P сохранить настройки. И после этого, при подключенном WiFi, все сообщения посланные через DEBUG_MSG будут выводится на экран UDP терминала.
 

RedCat

New member
Благодарю за ответ!
Про утилитку-то я и не подозревал :).
А алгоритм хочется следующий:
- показываем время (период t1, желательно настраиваемый);
- меняем на показания температуры, давления, влажности и пр. из подготовленного заранее буфера (период t2, желательно настраиваемый) попутно разбираясь с пробелами и высотой шрифтов (2 и 3 позиции разделены двоеточием, 5 и 6 позиции выводятся шрифтом znak8x4s_0);
- возврат на п.1.
Это по-скромному :oops:, ну а если наглеть - то добавить п.3
- выводим бегущей строкой любую фразу (поздравление с ДР, НГ, прогноз погоды итд разумеется заканчивающуюся кодом str += " © voldemar2005" ;).
 
алгоритм хочется следующий:
первая тестовая сборка.
для работы есть две переменные:
  • add_val - значение, которое хотим показать *10 (т.е. хотим показать -23.4 записываем в переменную -234), сейчас туда пишется текущая температура
  • add_val_sec - сколько секунд в конце каждой минуты показываем
выводим бегущей строкой любую фразу
это 100% делать не буду
 

Вложения

Последнее редактирование:

RedCat

New member
Ой спасибо, блин, большое! (с) Масяня

Все работает, дальше есть больший простор для колупания, по крайней мере подход понятен и таки да, он системный. А я ковырял по верхам.
Слегка матерится компилятор на несоответствие типов при преобразовании:
E:\Arduino\Sketch\Clock5web\show_time.ino:10:34: warning: narrowing conversion of '(int)(ds3231.tmElements_t::Hour / 10u)' from 'int' to 'uint8_t {aka unsigned char}' inside { } [-Wnarrowing]

uint8_t dig[6] = { ds3231.Hour / 10, ds3231.Hour % 10, ds3231.Minute / 10, ds3231.Minute % 10, ds3231.Second / 10, ds3231.Second % 10 };


PS Ругань убрал инициализацией массива нулями uint8_t dig[6] = { 0, 0, 0, 0, 0, 0 }; все равно он там чуть ниже заполняется значениями.
И таки да, не смог создать условия при которых включается точка доступа ap_init(). Как или когда она включается?
 
Последнее редактирование:
не смог создать условия при которых включается точка доступа ap_init()
ну например в настройках прописать несуществующее имя точки доступа

Как или когда она включается?
после пяти неудачных попыток подключения к точке доступа ...
 

Сергей_Ф

Moderator
Команда форума
@voldemar2005, ты забыл учесть один нюанс. Если нет датчика - то в конце каждой минуты вылазит пустой экран. Надо бы условие поставить.
Код:
#ifndef NO_DS18B20
  if( ds3231.Second < (60 - add_val_sec) )
  {
#endif 
    dig[0] = ds3231.Hour / 10;
    dig[1] = ds3231.Hour % 10,
    dig[2] = ds3231.Minute / 10,
    dig[3] = ds3231.Minute % 10,
    dig[4] = ds3231.Second / 10,
    dig[5] = ds3231.Second % 10;
    add_val_pr = false;

#ifndef NO_DS18B20
  }
  else
  {
    int16_t prom;
    uint8_t v;
    bool pr_minus;

    if( add_val >= 0) { prom = add_val; pr_minus = false; }
    else              { prom = -add_val; pr_minus = true; }

    if( count_dig == 4) prom /= 10;

    for( int8_t i = count_dig-1; i >= 0; i--)
    {
      if ( prom == 0 && i < 4)
      {
        if ( pr_minus)
        {
          v = 10;
          pr_minus = false;
        }
        else
          v = 11;
      }
      else
        v = prom % 10;
      dig[i] = v;
      prom /= 10;
    }
    add_val_pr = true;
  }
#endif
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
@voldemar2005 не, ну везде условия стоят, а здесь нет. Понятно что можно обнулить, но просто он не имеет смысл при отсутствии датчика и потому логично от него избавится при компиляции. Разве нет?
 

Evgeniy163

New member
Допилил внешний термометр для часов, вроде бы все работает.
Код для часов могу выложить, но только с разрешения автора @voldemar2005.
 

Вложения

Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
@Evgeniy163 а как Вы синхронизируете включение wifi в часах и в термометре? Или в часах он у Вас включен постоянно?
 

Evgeniy163

New member
Если разрешен внешний датчик температуры (включается на вебморде), то wifi включен постоянно. В противном случае wifi работает как обычно.
 

Evgeniy163

New member
@RedCat А что делать, кому сейчас легко? :) Можно использовать какой нибудь "посредник" в инете, передавать данные туда, а часы периодически бы от туда считывали. Но это уж больно заморочено.
 

RedCat

New member
Так никому особо не легко.
Не совсем понимаю какое отношение имеет "посредник" к процедуре инициализации и проверки WiFi подключения, но у автора все это вполне работает, и именно этим пользуюсь для считывания раз в 15 мин показаний внешнего (уличного) термометра инициализируя и выключая затем WiFi. Изящненько и экологично... :)

Ну и таки да - всех с наступающим!
Всем - бобра!!! ;)
 

RedCat

New member
Помилуйте, батенька, как можно так о себе? Какой из меня автор? @voldemar2005 все за нас сделал уже. Процедуры называются void sta_init() и bool sta_check(), используйте их и будет вам счастье.
 

Evgeniy163

New member
именно этим пользуюсь для считывания раз в 15 мин показаний внешнего (уличного) термометра инициализируя и выключая затем WiFi. Изящненько и экологично... :)
А как термометр узнает, что нужно передавать данные, он же в глубокой спячке и просыпается раз в несколько минут. Или же он держит постоянное соединение и отвечает на запрос часов? Т.е как правильно спросил @Сергей_Ф, как синхронизируете часы и термометр?
 
Последнее редактирование:

RedCat

New member
Термометры в виде DS18B20 в количестве пяти штук у меня привязаны к малинке (Raspberry Pi 3). Там по крону баш скрипт раз в пять минут считывает показания и записывает в базу MySQL. Параллельно показания двух датчиков, в т.ч. наружного записываются в файлики, данные из которых используются потом для вывода температуры среди всего прочего на инфомониторе. И вот здесь у меня начались метания - как прирукожопить эти показания к часам в спальне. Были варианты с samba-швамба, комарами-mosquitto, но как-то вечером после двух бокалов пива меня ВНЕЗАПНО осенило! Зачем плодить ненужные сущности и загружать ESP-шку хламом, когда у нас все уже есть! И отечество спас простой GET запрос. Вот как-то так, да.
С наступающим всех!!!
 
Сверху Снизу