Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Текущее время #4

Open
alienjenkins opened this issue Nov 30, 2017 · 78 comments
Open

Текущее время #4

alienjenkins opened this issue Nov 30, 2017 · 78 comments

Comments

@alienjenkins
Copy link

Было бы очень полезно добавить отправку текущего времени в порт, если это возможно.
Ардуина сама время считать не умеет - для этого нужен отдельный модуль. А с монитором потребность в этом модуле отпадает.

@1271
Copy link
Contributor

1271 commented Nov 30, 2017

Можете либо сами добавить, либо подождать. Скину пул-реквест.
Хотя не знаю, для чего это Вам 😐

P.S. Если займусь, то, думаю, переделаю и аптайм.
Сейчас он работает некорректно.

@alienjenkins
Copy link
Author

Сам я, конечно же, этого сделать не смогу)
Программирование освоил только на уровне любителя ардуины, поэтому в HW Monitor залезть мне не получится. Но был бы очень благодарен за возможность получения времени из монитора

@1271
Copy link
Contributor

1271 commented Dec 1, 2017

Тогда сегодня, если будет время, сделаю.
Скетч для 2-х строчного экрана поправлю, для 4-х нет (у меня его нет, потому не знаю, куда лучше добавить. Да и если Вы говорите, что разбираетесь немгого, поправить сможете самостоятельно. Это не сложно)
Еще, думаю, добавлю скетч для 2-х строчника для вот такой штуки
LCD keyboard
Именно такая вешь у меня сейчас и работает

@alienjenkins
Copy link
Author

у меня экран OLED, я для него всё переделываю, и поэтому мне нужно знать под каким номером в массиве PCdata арудина получает время. А скетч полностью свой

@1271
Copy link
Contributor

1271 commented Dec 1, 2017

Итого:
На работе в конец вынесли мозг. Заниматься чем-то сейчас нет никакого желания.
Но раз обещал, то вот:
https://github.com/1271/PCdisplay/tree/time
Тут измененная версия программы.
В конец массива данных добавлены еще 3 поля:

Текущий год (int)
Текущие секунды (без года. Чтобы в ардуину влезли. Да и так проще) (int)
Текущее время с момента включения ПК в секундах. (Обнуляется каждые 25 дней. Переполняется int) (int)

Все это видно тут:
https://github.com/1271/PCdisplay/commit/727bb39937fbb7a8ba00c0355d833dc68b472f91#diff-e03c90bdad4f0ba6a54b8a3b09a973d4R698

Скетчи сами поправьте. Ибо влом. Или пусть автор поправит. А то он чет молчит все время.

P.S. Не используйте обновленную программу с текущими скетчами - будет неверно отображаться температура ЦП.

Расширить скетчи можете на основе того, что есть.

P.S. не прочитал сразу последнее сообщение.
Если сами пишете, то даже проще.

@alienjenkins
Copy link
Author

Спасибо большое за работу, буду сидеть разбираться и настраивать) Удачи!

@1271
Copy link
Contributor

1271 commented Dec 1, 2017

Взаимно 👍

@alienjenkins
Copy link
Author

alienjenkins commented Dec 1, 2017

Если не сложно и когда будет время, то надо проверить: pcdata[2] выдаёт температуру ЦП (причём с другого датчика, который немного врёт), pcdata[3] по идее должна выдавать температуру видео, но выдаёт у жёсткого диска, а где хранится температура GPU так и не нашёл. Функция parsing полностью скопирована с ваших скетчей, в предыдущей версии монитора всё работало отлично. Но если у вас всё работает, значит проблемы с моей стороны.
Так же заметил, что pcdata[1] выдаёт uptime, но иногда сбивается и показывает температуру видео, потом возвращается на uptime

@aklyk
Copy link

aklyk commented Dec 2, 2017

А как принять строку, если в ней есть символ окончания строки E?
Это степень же, но ардуине то пофиг

40;33;44;29;24;11;45;13,13076;100;15;60;40;0;0;50;502;100;1;0;2017;3,133511E+07;2139993E

Надо тогда символ окончания строки поменять в OHW, как я понял, то тут

serial.Write(Encoding.ASCII.GetBytes("E"));

Сам мало шарю если что ;c

@AlexGyver
Copy link
Owner

вывод времени можно сделать в секундах, и ардуиной разбить на часы-минуты, можно просто 6 значным числом.
Порядок в Pcdata я не менял, всё как было так осталось

@aklyk
Copy link

aklyk commented Dec 2, 2017

Так @1271 так и сделал

// get current dateTime
// see https://msdn.microsoft.com/ru-ru/library/8kb3ddd4(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2
// Год отдельно. Ардуино, да
DateTime.Now.Year,
(DateTime.Now.Month * 2592000 + DateTime.Now.Day * 86400 + DateTime.Now.Hour * 3600 + DateTime.Now.Minute * 60 + DateTime.Now.Second),
// get current PC Work Time. Every 24.9 days!
// see https://msdn.microsoft.com/en-us/library/system.environment.tickcount.aspx
(Environment.TickCount & Int32.MaxValue) / 1000,

просто секунды идут со степенью E

40;33;44;29;24;11;45;13,13076;100;15;60;40;0;0;50;502;100;1;0;2017; 3,133511E+07 ;2139993E

а E это символ конца строки для ардуины

if (aChar != 'E') {

@aklyk
Copy link

aklyk commented Dec 2, 2017

@1271 а почему нельзя отсылать время и дату вот так?

// get current dateTime
// see https://msdn.microsoft.com/ru-ru/library/8kb3ddd4(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2
DateTime.Now.ToString("HHmmcc"),
DateTime.Now.ToString("ddMMyyyy"),
// get current PC Work Time. Every 24.9 days!
// see https://msdn.microsoft.com/en-us/library/system.environment.tickcount.aspx
(Environment.TickCount & Int32.MaxValue) / 1000,

@alienjenkins
Copy link
Author

@aklyk if Ты температуры смог вывести? Они под теми же номерами в PCdata?

@aklyk
Copy link

aklyk commented Dec 3, 2017

@alienjenkins нет, нельзя вывести корректно ничего т.к. у нас конец строки раньше наступает. Надо чтобы изменили OpenHardwareMonitor
Либо поменяли символ конца сроки на другой
Либо поменяли как я показал, чтобы время и дата выводились не в секундах, а вот так 1710;03122017

@aklyk
Copy link

aklyk commented Dec 3, 2017

@alienjenkins если нам помогут, хочу Software Real Time Clock прикрутить с синхронизацией и вместо connection lost выводить часы, у меня комп когда выключен питание держит на юсб

@1271
Copy link
Contributor

1271 commented Dec 3, 2017

Сейчас уберу E на конце. 10 минут.
E была, нужна как конец строки для ардуины, да.

@1271
Copy link
Contributor

1271 commented Dec 3, 2017

Удалил. Если будет нужен признак конца данных, могу добавить что-то другое.
https://github.com/1271/PCdisplay/releases

@1271
Copy link
Contributor

1271 commented Dec 3, 2017

pcdata[2] выдаёт значение ЦП (причём с другого датчика, который немного врёт),

Хм. Расположение оригинальных строк не менял.
Если хотите, можно выдавать усредненное значение по всем ядрам, либо по кажому ядру и ЦП отдельно.

@aklyk
Copy link

aklyk commented Dec 3, 2017

@1271 Здравствуйте! Спасибо за вашу помощь

Если хотите, можно выдавать усредненное значение по всем ядрам

Хотим))

Удалил. Если будет нужен признак конца данных, могу добавить что-то другое.

До конца не понял, как секунды переводить в нормальное время, пробовал по-разному с unix timestamp декодером, ничего не получается, может проще (во всяком случае для моего скудного ума)

Вместо вашего

DateTime.Now.Year,
(DateTime.Now.Month * 2592000 + DateTime.Now.Day * 86400 + DateTime.Now.Hour * 3600 DateTime.Now.Minute * 60 + DateTime.Now.Second),

Вот так, как уже предлагал

DateTime.Now.ToString("HH:mm:cc"),
DateTime.Now.ToString("dd/MM/yyyy"),

И вернуть букву E

@1271
Copy link
Contributor

1271 commented Dec 3, 2017

"Вот так, как уже предлагал" - можно и так. Это не сложно поправить.

не понял, как секунды переводить в нормальное время
  • время представлено сейчас так:
    timestamp - (year)

Как получить время сейчас:

seconds = time % 60
minutes = (int)(time / 60) % 60 
hours = (int)(time / 3600) % 24

и т.д.

Сейчас залью версию с форматированием.

Вам так и отправлять двумя строками?

@aklyk
Copy link

aklyk commented Dec 3, 2017

@1271 просто я совершенно не знаю как собирать OHW в программу, да и у меня из программ для C++ только DevC++ со стандартными библиотеками, так что извините за назойливость и в очередной раз спасибо 🥇

Да это еще наверное и не плюсы, а что-нибудь другое

@1271
Copy link
Contributor

1271 commented Dec 3, 2017

Ничего страшного. Мне не сложно.

uptime должно отправляться просто числом, или так же строкой?

P.S. E на конеце заменю на другую букву, раз уж вам число приходит как 1e1

@aklyk
Copy link

aklyk commented Dec 3, 2017

@1271 наверное да, у Александра парсинг преобразует же в int строку
PCdata[index] = string_convert.toInt();

@1271
Copy link
Contributor

1271 commented Dec 3, 2017

Да, все преобразуется в Int, поэтому будет "складываться" с результатом перед отправкой.

Вопрос про uptime все еще открыт

@aklyk
Copy link

aklyk commented Dec 3, 2017

@1271 не уточнил, что я про аптайм, моя ошибка

@1271
Copy link
Contributor

1271 commented Dec 3, 2017

Недопонимание.
Просто я могу Вам отправлять аптайм вместо

1231

вот так:

00/00;23:33:11

Где до ; день и месяц, после - время

Просто ардуино очень плохо работает с большими числами, потому и сперва убрал год из результата.

@aklyk
Copy link

aklyk commented Dec 3, 2017

@1271 понял :)
Лучше секундами, я думаю, тут проще переводить в дни, часы и минуты

@1271
Copy link
Contributor

1271 commented Dec 3, 2017

Как пожелаете.
Просто я Вам уже готовую строку предлагал, после парсинга. Ну да ладно

@aklyk
Copy link

aklyk commented Dec 3, 2017

@1271 я понял Вас, просто у меня в голове закрался один костыль и для него аптайм лучше оставить так

@1271
Copy link
Contributor

1271 commented Dec 3, 2017

АХАХаххаахах ))) Оке

Итого:
Строка получится вот такая:

54;34,5;0;31;19;6;55;4,079199;100;20;80;20;0;0;50;500;50;5;0;22:11:29;03/12/2017;266079D

Конец данных вернул, дата теперь отправляется строкой

@1271
Copy link
Contributor

1271 commented Dec 3, 2017

@alienjenkins #4 (comment)
Как уже писал, ардуина перезаписывает присланные данные своими.

Для скетча без изменений, используйте программу из этого репозитория

@1271
Copy link
Contributor

1271 commented Dec 3, 2017

Итого.
Поправил получение температуры самой горячей видеокарты.
Сейчас залью изменения.

Текущая дата теперь приходит вот так:
HH;mm;ss;dd;MM;yyyy

Последним идет текущий аптайм системы.
Вернул E в конец строки (она все равно не мешает. А кому-то так будет проще)

https://github.com/1271/PCdisplay/releases/tag/0.2.0

@1271
Copy link
Contributor

1271 commented Dec 3, 2017

Просьба к @AlexGyver - сделайте ветку time, скину пул-реквест с изменениями.
Вдруг кому понадобится?

И ведите версионинг, пожалуйста. Это сильно облегчает жизнь

@aklyk
Copy link

aklyk commented Dec 3, 2017

@1271 я справился и таки вывел время, спасибо огромное!
@alienjenkins завтра прикручу https://github.com/leomil72/swRTC и вместо CONNECTION FAILED будут часы с датой, если интересует, то скину скетч

@1271
Copy link
Contributor

1271 commented Dec 3, 2017

Да в "репе" и так все видно, спасибо. Рад, что разобрались.

@alienjenkins
Copy link
Author

alienjenkins commented Dec 3, 2017

@1271 тоже время вывел, с новой версией данные адекватные, но видео так и не выводит, вместо него выводит у процессора с двух разных датчиков:
https://pp.userapi.com/c840122/v840122744/4bbf2/iuzVTKbCigA.jpg
https://pp.userapi.com/c840122/v840122744/4bbf9/ZwcqPu7DNCM.jpg
может проблема в моей материнке. Спасибо большое за работу)
@aklyk да, скетч очень интересует

@1271
Copy link
Contributor

1271 commented Dec 4, 2017

выводит у процессора с двух разных датчиков
Сама программа выводит данные с датчика видео?

@aklyk
Copy link

aklyk commented Dec 4, 2017

@alienjenkins в общем, лично у меня конфликт таймеров выходит при добавлении софт часов, позже буду копать и думать.

Пока что просто вывожу на экран где был аптайм с темп материнки и max hdd, убрал темп материнки как ненужное для меня значение.

Если интересно, то
Размер массивов входных данных и готовых значений, в inData от балды указал, работает (да, я глупый)

char inData[108];
int PCdata[26]; 

Сам вывод

  snprintf(lcd_time, sizeof(lcd_time), "%02d:%02d:%02d",PCdata[19],PCdata[20],PCdata[21]);
  char lcd_date[12];
  snprintf(lcd_date, sizeof(lcd_date), "%02d/%02d/%04d",PCdata[22],PCdata[23],PCdata[24]);

  lcd.setCursor(0, 0);
  lcd.print(lcd_time);

  lcd.setCursor(0, 1);
  lcd.print(lcd_date);

@1271 лично у меня по данным с датчиков выдает правильно - CPU package и ВК.
ВК у меня одна если что, что на пк, что на ноутбуке.

@alienjenkins
Copy link
Author

@1271 да, сама программа всё правильно показывает, а вот в ардуину приходят другие значения для gpu

@1271
Copy link
Contributor

1271 commented Dec 4, 2017

в ардуину приходят другие значения - какую версию программы используете?

Попробуйте использовать https://github.com/1271/PCdisplay/releases/tag/0.0.1 для стандартной прошивки или https://github.com/1271/PCdisplay/releases/tag/0.2.0 для версии @aklyk

@alienjenkins
Copy link
Author

с самой последней (0.2) всё работает, кроме температуры видео.
с самой (самой самой) первой работает всё идеально, но там времени нет.
Причём pcdata[0] выдаёт температуру ЦП с одного датчика, pcdata[1] с другого, pcdata[2] с третьего, но всё это температура ЦП (разная). А pcdata[3] это уже температура жёсткого диска)
Очень всё запутанно, при этом количество значений в массиве пробовал разные чтобы не перезатирало - один результат)

@aklyk
Copy link

aklyk commented Dec 4, 2017

@alienjenkins даже если у тебя 2004 дисплей, должно показывать, просто сверь правильно/неправильно выдает https://goo.gl/R8JJyR

При этом управление вентиляторами полностью закоментировано, аккуратнее, если используешь

@aklyk
Copy link

aklyk commented Dec 4, 2017

И я думаю с таким количеством сообщений можно перейти в тот же Telegram
@alienjenkins и @1271 как идея, пользуетесь?

@1271
Copy link
Contributor

1271 commented Dec 4, 2017

@alienjenkins, проверяй скетчи. Все должно работать корректно.
По датчикам ничего не менялось. Только поправлена ошибка в получении температуры самой горячей видеокарты. (принцип был такой - берем самую горячую amd и складываем со средней температурой всех карт nVidia). Так и не понял, зачем так было сделано.

@aklyk, пользуюсь, но в принципе, пока не парит., этого чата хватает.
На что-то серьезное не подписываюсь, по крайней мере сейчас - времени нет.

@aklyk
Copy link

aklyk commented Dec 4, 2017

@1271 из серьезного тут только Вы :DD
Мы же с @alienjenkins погрязли в...

@alienjenkins
Copy link
Author

в общем всё перепробовал - результат такой же. Видимо на эту сессию отложу копания в ардуине, выведу просто время/дату и температуру воды с авторегулировкой кулеров, забью на температуры остального.
Спасибо вам за помощь, без вас даже до такого уровня не разобрался бы)

@aklyk
Copy link

aklyk commented Dec 4, 2017

@alienjenkins есть фоточки сборки, какой конфиг?)

@1271
Copy link
Contributor

1271 commented Dec 4, 2017

@alienjenkins - могу вечером залить программу с "дебагом" (как показывал на скрине выше)
Чтобы видеть данные, которые отправляются в порт.

И еще момент - Вы программу из какой папки берете?
Забыл, что она там одна.
Просто странно, что у меня и @aklyk все данные корректно отправляются.

@alienjenkins
Copy link
Author

странно ещё и то, что первые три значения это температура ЦП, а не цп-вк-загрузка цп-загрузка вк

@1271
Copy link
Contributor

1271 commented Dec 4, 2017

@alienjenkins, попробуйте скачать прикрепленный архив, там в программу добавлен вывод данных, которые попадают в серийный порт
https://github.com/1271/PCdisplay/releases/tag/0.2.0
Отображение поля с отладкой включается в Options->Serial->Debug

@alienjenkins
Copy link
Author

если работа освободит - попробую, если нет - только завтра

@alienjenkins
Copy link
Author

всё же проблема не в ардуине, а в компе
https://pp.userapi.com/c639128/v639128362/64133/98NeRf3VTso.jpg

@1271
Copy link
Contributor

1271 commented Dec 6, 2017

Хмм. Страннота.
На выходных будет время, попробую разобраться с проблемой.

@aklyk
Copy link

aklyk commented Dec 7, 2017

@1271 можете пожалуйста посмотреть вывод времени в функции timeoutTick(), я уже как овощ и не понимаю в чем причина того, что время не тикает
https://gist.github.com/aklyk/4cd21b52dfaf0733ca592ae692024588

@1271
Copy link
Contributor

1271 commented Dec 7, 2017

@aklyk - на первый взгляд, проблема в условии вывода времени на экран:

void parsing() {
  while (Serial.available() > 0) {
    timeOut_flag = 1;  // разрешаем! выводить время, потому что .. 
 }
}

void timeoutTick() {
  if ((millis() - timeout > 5000) && timeOut_flag) { // тут есть проверка
    timeOut_flag = 0;  // И мы увидим только 1 тик
  }
}

@aklyk
Copy link

aklyk commented Dec 7, 2017

@1271 вроде понял и сделал вот так - работает

void timeoutTick() {
  if (millis() - timeout > 5000) {
    if (timeOut_flag == 1) {
      lcd.clear();
      lcd.setCursor(2, 0);
      lcd.print("DISCONNECTED");
      timeOut_flag = 0;
      reDraw_flag = 1;
    }
    char lcd_time_i[10];
    snprintf(lcd_time_i, sizeof(lcd_time_i), "%02d:%02d",hour(),minute());
    char lcd_date_i[12];
    snprintf(lcd_date_i, sizeof(lcd_date_i), "%02d/%02d/%04d",day(),month(),year());
    lcd.setCursor(0, 1);
    lcd.print(lcd_time_i);
    lcd.setCursor(6, 1);
    lcd.print(lcd_date_i);
  }
}

@alienjenkins скетч под 1602 с отображением времени при дисконнекте - https://gist.github.com/aklyk/4cd21b52dfaf0733ca592ae692024588

Если у вас 2004, думаю проблем переделать не составит :)

@1271
Copy link
Contributor

1271 commented Dec 7, 2017

Да, теперь код корректен. :-)
Как уже писал, у меня вообще пока ничего нет. Интерес, по крайней мере пока, чисто спортивный.

Кстати, обновил код программы. Исправил баг с температурой, загрузкой и памятью GPU, когда в системе стоит AMD и nVidia

https://github.com/1271/PCdisplay/releases/tag/0.2.1 - версия со временем
https://github.com/1271/PCdisplay/releases/tag/0.0.2 - версия для скетча из репозитория

@1271
Copy link
Contributor

1271 commented Dec 7, 2017

@aklyk - где-то через месяц мне должен "прийти" как раз 2004 дисплей.
Как закончу с переделкой, скину пулл-реквест, если к тому времени сами не займетесь.

@alienjenkins
Copy link
Author

@aklyk дело не в дисплее) у меня вообще oled 128х64
а за время спасибо, хотел сделать, но руки не доходили)

@aklyk
Copy link

aklyk commented Dec 7, 2017

@1271 а я за неделю до видео Александра купил 1602 просто так в своем городе за 180 рублей.

Переделал под него скетч (экраны добавил, укоротил прогресс бары, упростил вывод графиков), вместо кнопок подключил пульт, банально лень было как-то их прикручивать к корпусу

Правда на данный момент просто использую как часы, очень удобно :DD

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants