Например TDA7294

Форум РадиоКот • Просмотр темы - Перевод времени в аналоговых часах. (Код или алгоритм).
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Сб янв 18, 2020 14:29:08

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Ср ноя 20, 2019 12:06:56 
Первый раз сказал Мяу!

Зарегистрирован: Ср янв 23, 2019 20:18:44
Сообщений: 20
Рейтинг сообщения: 0
Привет.
Сделал часы с автоматической коррекцией времени. Часы имеют обычный двенадцати часовой циферблат со стрелками. Соответственно время можно переводить либо вперед, либо назад.
Эталонное время получаю из интернета или RTC в формате HH:MM:SS .
Пока придумал такой алгоритм:
Вычисляю разницу в секундах, ели число положительное, значит, часы отстают и стрелки нужно перевести вперед, если разница отрицательная – то назад. Так как циферблат двенадцати часовой, нужно привести время к соответствующему формату.

Код:

/*
s  – текущее время, секунды
m  – текущее время, минуты
h  – текущее время, часы

ss  – эталонное  время, секунды
mm  – эталонное  время, минуты
hh  – эталонное  время, часы
*/


  if (h  > 12) h = h  - 12;    // привести к 12 часовому виду
  if (hh > 12) hh= hh - 12;

  long sec  = (ss - s) +
              (mm - m) * 60L +
              (hh - h) * 3600L;

  long rev = 43200L - sec ;   // направление  + по часовой - против
  if (rev < sec )  sec =-rev;   // куда ближе крутить стрелки





Вроде все работает. (уже неделю =))
Может, есть другие алгоритмы или идеи?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Чт ноя 21, 2019 21:58:12 
Грызет канифоль

Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 259
Рейтинг сообщения: 0
Допустим, на часах 11:55. А фактическое время 12:10. По вашему алгоритму они будут крутиться против часовой 11 часов 45 минут.
Ну или я на ночь глядя неправильно что-то понял. )


Вернуться наверх
 
JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Отличное качество, подтвержденное более чем 600,000 пользователей! Более 10,000 заказов в день.

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/quote

Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Пт ноя 22, 2019 11:19:40 
Первый раз сказал Мяу!

Зарегистрирован: Ср янв 23, 2019 20:18:44
Сообщений: 20
Рейтинг сообщения: 0
Приветствую. Да, есть проблемы с выбором направления вращения в некоторых случаях. Но по вашему примеру должно быть правильно.

Допустим, на часах 11:55. А фактическое время 12:10...
Ну или я на ночь глядя неправильно что-то понял. )


Результат в переменной sec = 900 (сколько секунд)


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $88 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay
Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Пт ноя 22, 2019 12:49:31 
Грызет канифоль

Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 259
Рейтинг сообщения: 0
Да, на ночь глядя внимание фиговое. Вчера мне показалось что if из hh вычтет 12 и сделает его равным 0.
Ну хорошо, а если на часах 11:55. А фактическое время 13:10.

ss = s = 0
m = 55; mm = 10
h = 11; hh = 13

После if'ов: h = 11; hh = 1

sec = (10 - 55) * 60 + (1 - 11) * 3600 = -38700
rev = 81900


Последний раз редактировалось NStorm Пт ноя 22, 2019 14:41:17, всего редактировалось 1 раз.

Вернуться наверх
 
Контроль в спящем режиме: повышение КПД батарейного питания с помощью DC/DC MAX17225 nanoPower

В статье описан практический опыт разработчика, применившего повышающий DC/DC-преобразователь MAX17225. В результате ряда практических экспериментов, потребовавших существенного обновления технической базы компании-разработчика, автор убедительно доказывает преимущества выбранного компонента и схемотехнической реализации. Увеличенное на 50% время автономной работы лучше других аргументов говорит об эффективности конвертеров MAX17225, а также о важности предварительной оценки элементной базы.

Читать статьи>>
В сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Пт ноя 22, 2019 12:58:08 
Друг Кота

Карма: 54
Рейтинг сообщений: 724
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 3689
Откуда: Ижевск
Рейтинг сообщения: 0
Может считать все в секундах, типа
12:10=43'800
11:55=42'900
Значит нужно перевести стрелки на 900 секунд вперед.


Вернуться наверх
 
Руководство для разработчика приложений на базе STM32WB55

Представив двухъядерные беспроводные микроконтроллеры STM32WB для IoT-приложений, компания STMicroelectronics предлагает разработчикам экосистему, включающую в себя отладочные платы, примеры кода для микроконтроллера, готовое ПО всех уровней и большой массив документации.

Читать статью>>
Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Пт ноя 22, 2019 14:42:58 
Грызет канифоль

Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 259
Рейтинг сообщения: 0
akl, так он и считает в секундах, только в 12-часовом формате. И 13:00:00 становятся 01:00:00 при расчетах перемотки.


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Пт ноя 22, 2019 19:58:37 
Первый раз сказал Мяу!

Зарегистрирован: Ср янв 23, 2019 20:18:44
Сообщений: 20
Рейтинг сообщения: 0
Если проверку времени делать на линейном участке циферблата, то первый мой вариант вроде работает не плохо. Если между 12-час и 1-час тут непонятно что получится.
На собранных часах (сделал 3 шт.) проверяю время раз в сутки в 21 час. Разница несколько секунд успешно корректируется. Все три экземпляра идут почти секунда в секунду уже больше недели.
Вот написал другой код, должен работать лучше, хотя х.з.

Код:


/*
s  – текущее время, секунды
m  – текущее время, минуты
h  – текущее время, часы

ss  – эталонное  время, секунды
mm  – эталонное  время, минуты
hh  – эталонное  время, часы
*/

uint8_t h = 12,
        m = 55,
        s = 33;


for (uint8_t i=0; i<23;i++)
 {

uint8_t hh = i,
        mm = 10,
        ss = 33;



Serial.print ("Time: ");
Serial.print (h);
Serial.print (":");
Serial.print (m);
Serial.print (":");
Serial.print (s);
Serial.print (" >>> ");
Serial.print (hh);
Serial.print (":");
Serial.print (mm);
Serial.print (":");
Serial.println (ss);


  if (h  > 12) h = h  - 12;    // привести к 12 часовому виду
  if (hh > 12) hh= hh - 12;

 
  // Первый результат. Смещение в секундах. 
  // Положительное число вращение вправо (по часовой стрелке),
  // Отрицательное  -  влево (против  часовой стрелки).

  long sec  = (ss - s) +
              (mm - m) * 60L +
              (hh - h) * 3600L;


  // Если применить абсолютные значения можно узнать оба (влево, вправо) смещения.
  // Но при этом потеряем направление вращения.
 
  long var1  = abs(sec);          // Прямое  направление
  long var2  = 43200L - var1;     // Противоположное направление (43200 = 12 часов * 3600 секунд)


Serial.print ("Variant 1: ");
Serial.println (var1);
Serial.print ("Variant 2: ");
Serial.println (var2);

// Получаем направление вращения, но тут я не уверен…   
// Выбираем наименьшее значение смещения.
// Если первоначальное направление в право, меняем на противоположное.

 
  if (var2 < var1 )
   {
   if (sec > 0)  sec=-var2;  else  sec=var2; // Волшебство =)   
   }




Serial.print ("Select: ");
Serial.print(sec);
Serial.print (" >>> ");

sec = abs(sec);
 
 hh =  sec / 3600;
 mm = (sec - hh * 3600) / 60;
 ss =  sec - hh * 3600 - mm * 60;


Serial.print (hh);
Serial.print (":");
Serial.print (mm);
Serial.print (":");
Serial.println (ss);


Serial.println("----------");
 }


delay(5000);




Вывод терминала



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

Добавлено after 2 minutes 51 second:
P.S.
За Ардуину не ругайте, это только для отладки =)
:)

Добавлено after 46 minutes 28 seconds:
Да, на ночь глядя внимание фиговое. Вчера мне показалось что if из hh вычтет 12 и сделает его равным 0.
Ну хорошо, а если на часах 11:55. А фактическое время 13:10.

ss = s = 0
m = 55; mm = 10
h = 11; hh = 13

После if'ов: h = 11; hh = 1

sec = (10 - 55) * 60 + (1 - 11) * 3600 = -38700
rev = 81900


Сейчас проверил.

Первый алгоритм (в принципе верно, но направление вращения не верное):
Код:
Текущее время: 11:55:33 >> 1:10:33
Выбрано: 10:45:00 ( -38700 )


Второй алгоритм (тут лучше):
Код:
Текущее время: 11:55:33 >> 1:10:33
Вариант 1: 10:45:00 ( 38700 )
Вариант 2: 01:15:00 ( 4500 )
Выбрано: 01:15:00 ( 4500 )


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Сб ноя 23, 2019 12:49:41 
Модератор
Аватар пользователя

Карма: 148
Рейтинг сообщений: 2192
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 15025
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
а если возьмем наоборот - эталонное 11:55, а текущее 1:10.
в какую сторону и на сколько у тебя будет крутить?

_________________
Мудрость приходит вместе с импотенцией...


Вернуться наверх
 
Распродажа паяльных станций ATTEN и аксессуаров!
Индукционная паяльная станция AT315D - 3 977 ₽, станция паяльная AT80D – 2177 ₽, станция паяльная AT936b – 1000 ₽!

Заходите в раздел акции и спецпредложения на сайте prist.ru, покупайте измерительные приборы, инструмент и паяльно-ремонтное оборудование по специальным ценам.
Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Сб ноя 23, 2019 23:28:30 
Первый раз сказал Мяу!

Зарегистрирован: Ср янв 23, 2019 20:18:44
Сообщений: 20
Рейтинг сообщения: 0
Если ни у кого нет идей а только вопросы “Куда оно будет крутить ?”
Вот сделал эмулятор, этого алгоритма.

Эээ...мулятор

Если, что, писал на коленке, да и засыпаю уже, пойду чай пить и спать… :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Вс ноя 24, 2019 13:18:43 
Модератор
Аватар пользователя

Карма: 148
Рейтинг сообщений: 2192
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 15025
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
а мне вот непонятно, зачем из 24-часового формата переводить в 12-часовой?

_________________
Мудрость приходит вместе с импотенцией...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Вс ноя 24, 2019 13:38:06 
Грызет канифоль

Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 259
Рейтинг сообщения: 0
Потому что сегментов на циферблате 12.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Вс ноя 24, 2019 20:35:06 
Модератор
Аватар пользователя

Карма: 148
Рейтинг сообщений: 2192
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 15025
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
ну и что?
зачем из 13 часов вычитать 12, а потом ломать голову, как из 1 часа скорректировать к 11 часам?
если сразу можно вычислить, сколько секунд будет в 13:10 и сразу пересчитать к 11:55.

_________________
Мудрость приходит вместе с импотенцией...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Вс ноя 24, 2019 20:44:11 
Друг Кота
Аватар пользователя

Карма: 113
Рейтинг сообщений: 6104
Зарегистрирован: Сб сен 13, 2014 16:27:32
Сообщений: 25527
Откуда: СпиртоГонск созвездия Омега
Рейтинг сообщения: -2
шаговые моторы во 2часах НЕРЕВЕРСИВНЫЕ питаются 1ф разнополяркой --П---U---П----U---
пауза +30в пауза 2минута =-пауза 3мин +30в пауза4 мин-пауза и ТД
так что про перевод протиф часовой сразу забудте!!!

_________________
Мудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет... и МЧС опаздает
и таки теперь Дураки и Толерасты умирают по пятницам!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Пн ноя 25, 2019 22:51:25 
Первый раз сказал Мяу!

Зарегистрирован: Ср янв 23, 2019 20:18:44
Сообщений: 20
Рейтинг сообщения: 0
ну и что?
зачем из 13 часов вычитать 12, а потом ломать голову, как из 1 часа скорректировать к 11 часам?
если сразу можно вычислить, сколько секунд будет в 13:10 и сразу пересчитать к 11:55.


Чем меньше числа, тем меньше переменные, тем меньше и быстрее программа. Попробуйте впихнуть код в attiny13 и познаете дзен.
А вообще, в 12 часовом циферблате, при переводе времени используется только +6 или -6 часов, остальное излишне =) Если стрелки можно крутить в обе стороны.

Добавлено after 5 minutes 42 seconds:
шаговые моторы во 2часах НЕРЕВЕРСИВНЫЕ питаются 1ф разнополяркой --П---U---П----U---
пауза +30в пауза 2минута =-пауза 3мин +30в пауза4 мин-пауза и ТД
так что про перевод протиф часовой сразу забудте!!!

Что мешает поставить шаговик который крутится в обе стороны? Если нет возможности вращать стрелки против часовой, можно подождать (пропустить некоторое количество секунд), для точной настройки времени, если часы пропустят минуту , этого ни кто и не заметит. Тут много вариантов.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Вт ноя 26, 2019 07:20:45 
Модератор
Аватар пользователя

Карма: 148
Рейтинг сообщений: 2192
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 15025
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
чтобы легко впихнуть код в attiny13, нужно писать на ассемблере.
а на Си тот же самый код (по функционалу) получится в несколько раз длиннее, и не впихнется.
код на ассемблере, соответственно, и работать будет намного быстрее.

_________________
Мудрость приходит вместе с импотенцией...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Вт ноя 26, 2019 08:48:01 
Потрогал лапой паяльник

Карма: 2
Рейтинг сообщений: -3
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 330
Рейтинг сообщения: 0
Да ладно. На 10..20% всего. И всё зависит от умения готовить как с одной, так и с другой стороны.)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Вт ноя 26, 2019 12:00:16 
Друг Кота
Аватар пользователя

Карма: 38
Рейтинг сообщений: 1036
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 3933
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
только часы: Y=(((X2-X1)+18)%12)-6
или в секундах
signed int dT= ((unsigned long int)(((((H2-H1)*60+M2-M1)*60)+C2-C1)+(18*60*60-1))%(12*60*60))-(6*60*60-1);
-1 это для того, чтобы при ровно 6 часах разницы часы пошли вперед, а не назад...

Добавлено after 2 hours 34 minutes 7 seconds:
или, чтобы с большими числами не работать, можно подводить по частям...
signed int dT=( (unsigned char)(H2-H1+30)%12)-6; //поддерживается 12 и 24 часовой формат в любом сочетании
dT*=60;
dT+=((unsigned char)(M2-M1+90)%60)-30;
dT*=60;
dT+=((unsigned char)(C2-C1+90)%60)-30;

вроде тоже должно нормально заработать...

Добавлено немного погодя:
Вот бы ещё мозги у часов могли бы определять реальное положение стрелок... в шестернях стрелок просверлить по дырочке, чтобы эти дырочки сходились в полночь и оптопару...

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Вт ноя 26, 2019 17:53:30 
Первый раз сказал Мяу!

Зарегистрирован: Ср янв 23, 2019 20:18:44
Сообщений: 20
Рейтинг сообщения: 0
signed int dT= ((unsigned long int)(((((H2-H1)*60+M2-M1)*60)+C2-C1)+(18*60*60-1))%(12*60*60))-(6*60*60-1);

Огромное спасибо за формулу, даже не думал что кто-то поможет с кодом.
signed int dT=( (unsigned char)(H2-H1+30)%12)-6; //поддерживается 12 и 24 часовой формат в любом сочетании
dT*=60;
dT+=((unsigned char)(M2-M1+90)%60)-30;
dT*=60;
dT+=((unsigned char)(C2-C1+90)%60)-30;

вроде тоже должно нормально заработать...

То что поддерживается 24 часовой формат, понятно ведь %12 как раз и приводит к такому формату…
Вот с остальным не совсем понятно откуда 90 и 30
Если возможно, напиши код для часов и минут. Ну, или алгоритм расчета. Заранее благодарю.

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

Делал когда-то нечто подобное, только оптопара была под часовой стрелкой, на циферблате.
Удалось даже обойтись одним датчиком, так как, часовая стрелка загораживает его дольше, чем минутная.
Если у часов автономное питание, смысла в этом нет. Время выставляется только при включении, потом можно просто запоминать положение стрелок даже перед выключением.

Добавлено after 8 minutes 4 seconds:
чтобы легко впихнуть код в attiny13, нужно писать на ассемблере.

Пробовал, не понравилось :)
Делал опрос термодатчика, разница получилась около 100 байт… На эмуляторе работало на ура, по факту ассемблерный код на схеме не заработал. Самая большая проблема в ассемблере, для меня, по крайней мере, сделать аналог _delay_ms(); _delay_us();


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Перевод времени в аналоговых часах. (Код или алгоритм).
СообщениеДобавлено: Вт ноя 26, 2019 19:10:54 
Друг Кота
Аватар пользователя

Карма: 38
Рейтинг сообщений: 1036
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 3933
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
мне вообще функция остатка от деления нравится,
например какой нибудь двунаправленый кольцевой счетчик: 0<=i<n
i=i±x
i=(i mn)%n
где m - целое число (mn не дают остатка)
n - длина счетчика
x - какоето число, изменяющее счётчик, x<mn
диапазон можно сдвинуть: k<=i<(n+k)
i=((i-k+mn)%n)+k;
важно только проследить, чтобы не было переполнения по вместимости переменной...
вот и в том примере длина = сутки, смещение = -полсуток...
а потом тоже, но по частям, сначала часы (длина 12, смещение -6), потом переведя в минуты - минуты (длина 60, смещение -30), и наконец секунды...
правда код я не проверял, но, думаю, он заработает

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y