часы стрелочные (ремейк)

v.bay

✩✩✩✩✩✩✩
26 Окт 2026
7
0
Ремейк

Всем доброго времени суток. На просторах Ардуино наткнулся на стрелочные часы на stm32F103. Честно говоря, собрал от безделия, посмотреть на реализацию графики. Все нормально получилось, потребление при 3,26В - 48 мА, об автономном питании можно забыть. Начал рыть, через год заказал плату у китайцев, дорого, правда, обошлась – почти 12 тыс. за 5 шт. Но уже удила закусил, свистулька не давала покоя. Еще год танцев с бубном, в результате реализовал: уменьшил потребление до 20мА с включенной подсветкой (без нее 14мА) – уменьшил рабочую частоту до 24мГц, при питании STM 2,65В через ЧИП 63000. При емкости Акк 3200мА/ч хватает на 6-7 суток при условии: индикация активна только ночью. Решил вопрос с зарядкой – контролируя напряжение на Акк во время заряда и его отключение по достижении заданного напряжения и включения зарядки при падении напряжения до заданного уровня. Все это можно менять в программе. Это дало возможность продлить жизнь Акк. питать изделие от сети, (по возможности) через источник на контроллере Tny264, небольшим током 100-150мА. Он изначально создан работать день и ночь. Применил ЖК 2,8” технологии IPS, это позволило улучшить контрастность на порядок, угол обзора увеличился фантастически. Это позволило слегка подкрасить голубым циферблат круга, повеселей смотреться стало. Изменил положение экрана с 0 на 3. В качестве ключа отключающего минусовой провод зарядки от земли, использовал сборку 8205, кварц 4мГц. В качестве источника питания применил 63000, верхнее плечо делителя (ADJ) резистор 43кОм, нижнюю часть блочка, сточил до глины 01мкФ. Датчик положения свистульки опрашивается каждые 15 сек. и ВКЛ/ОТКЛ подсветку. А замер напряжения на Акк, происходит раз в минуту, и соответствующее действие. Цвета показаний напряжения: голубой - Акк заряжен, желтый - режим заряда подключен, оранжевый - во избежание выключения Акк, необходимо принять меры к зарядке. Часы при этом не остановятся, просто исчезнет подсветка. Последнюю плату хотел использовать на stm32L151C8U6 купил, установил, пытаюсь конвертировать с F103. Процесс начал не так давно, обычно, начинаю в зиму, по завершению дачной страды, но пока результат нулевой. Попробовал на платформе CubeIde тоже мимо, при компиляции требуется 2 библиотеки в репозиторий, а ее держатели в страну больше не поставляют продукт. Я давно слежу за вашей работой, по урокам, немного, начал понимать структуру платформы Ардуино со дня основания получаю журнал с сайта РадиоЛоцман и там читал ваши статьи. И, как не странно, я все понимаю в ваших публикациях. Что у меня не всегда получается. Бывает из за сленга, а то и слишком замысловато пишут. Вот и решил обратиться к сообществу вашего сайта, может поможете с конвертацией с F103 на L151? Думаю, многие использовали бы этот ЧИП в своих свистульках. Я на CubeIde при тактовой 16мГц, в режиме Run, получил потребление 3,5 мА, а это дорогого стоит.
 

Вложения

Изменено:

bort707

★★★★★★★
21 Сен 2020
3,544
1,009
Выкладываю вариант скетча
В вашем сообщении нет никакого скетча

источник на контроллере Tny264, небольшим током 100-150мА. Он изначально создан работать день и ночь. Применил ЖК 2,8” технологии IPS, ... В качестве ключа отключающего минусовой провод зарядки от земли, использовал сборку 8205, кварц 4мГц. В качестве источника питания применил 63000, верхнее плечо делителя (ADJ) резистор 43кОм, нижнюю часть блочка, сточил до глины 01мкФ.
Нюансы подключений лучше было бы выложить в виде схемы, чем описывать словами.
 
Изменено:

Эдуард Анисимов

★★★★★★★
23 Сен 2019
2,543
1,014
60
Марий-Эл
@v.bay, Нужно переключить все неиспользуемые выводы на аналог. Отключить тактирование неиспользуемой периферии. Потребление должно ещё упасть. Для ещё более низкого энергопотребления нужно использовать STM32L серии.
 

bort707

★★★★★★★
21 Сен 2020
3,544
1,009
Для ещё более низкого энергопотребления нужно использовать STM32L серии.
так он для этого сюда и пришел. Хочет, чтоб ему кто-то помог переписать код на L серию:

решил обратиться к сообществу вашего сайта, может поможете с конвертацией с F103 на L151?
 

Эдуард Анисимов

★★★★★★★
23 Сен 2019
2,543
1,014
60
Марий-Эл
@bort707, Чукча не читатель. Чукча писатель. :)
Не увидел сразу. Много бесполезного текста.
@v.bay, И писать нужно прошивку, а не скетч. И под CubeIDE. В Ардуино ИДЕ это сделать можно только через жопу.
 

v.bay

✩✩✩✩✩✩✩
26 Окт 2026
7
0
Пол дня рисовал схему.только закончил, редактор sPlan 7.0. не могу разместить на форуме. ругается не то расширение. Что не так? подскажите.
Давайте ошибки разберем, те что в скетче. Перечисляйте.
026-10-28 223256.png

Получилось,только такой формат.
 
Изменено:

bort707

★★★★★★★
21 Сен 2020
3,544
1,009
Давайте ошибки разберем
Ну для затравки -
Первое что бросаетсяв глаза

А. Неправильная работа с миллис:
C++:
if (targetTime < millis()) {
      ....
     targetTime = millis() + 498; //секунда
      ....
 }
При переполнении этот код будет глючить. (Вопрос о том, почему у вас секунда = 498 тиков таймера - оставим на потом, очевидно что вы игрались с частотой камня, а настройки счетчика не выставили)

Б. Выход за границу массива
C++:
char c1[] = { 0 };        //создаем масив
dtostrf(val, 5, 2, c1);   //конвертируем float -> char
Вот это очень грубая ошибка, чреватая утечкой памяти и зависанием всей программы
 

v.bay

✩✩✩✩✩✩✩
26 Окт 2026
7
0
Про ф-ю millis(): я уменьшил частоту (тактовую) в два раза, т.к. перестроить в скотче я не мог, уменьши через кварц (4мГц). Период увеличился в двое. весь внутренний подключенный фарш тоже работать стал медленнее. и функция millis() тоже. я разобрался с ней читая уроки Александра. Если туда заносить 1000 мсек, то часы будут ходить через 2 сек. Я и в оригинале заносил туда 999. и здесь пришлось подбирать число. Первые часы ходят 3 тий год без причины не вставали не разу. В оригинале были ошибки два значения календаря год и месяц прошедшие не удалялись. Теперь удаляется вес столбик, каждые сутки. а было каждый оборот вертушки.
Про массив: я, честно, не понял вопроса, ну да ладно. Создаю массив, как ЛОКАЛЬНУЮ переменную, после выхода за пределы блока, она просто сдуется, и следующий оборот вертушки, создастся снова, и так каждый оборот. Конвертация ну есть такая функция, не мной придуманная, и я ее использовал.
 

v.bay

✩✩✩✩✩✩✩
26 Окт 2026
7
0
в скобках этой функции (конвертирующей) есть размер преобразуемый в char - 5 символов из них 2 после запятой. Я обьяснил вам все на пальцах, если хотите что то доказать задавайте аналогично, иначе это просто блуд. Если хотите услышать, ой спасибо я все исправлю, - то пожалуйста считайте ,что это произнесено. У меня вопрос стоял в другом: как переписать аддон или поддон, как правильно не знаю, где тот файл, библиотеки в котором адреса фарша f103 можно переделать в адреса фарша l151. Я плохо знаю структуру Адуино. может я и не прав и надо как то по другому решать. Копал много но понял очень мало. Ради этого готов побыть даже чукчей. Ваши вопросы это язык Си. Посмотрите уроки Александра, в них все настолько лаконично и понятно, как будто писано для ребенка из детского сада. Не понять просто не возможно.
 
Изменено:

Эдуард Анисимов

★★★★★★★
23 Сен 2019
2,543
1,014
60
Марий-Эл
@v.bay,
Основная ошибка кода - использование Arduino IDE.​


Вторая ошибка, использование внешнего RTC.​


Третья ошибка использование millis.​


Если использовать CubeIDE, можно более продуктивно использовать возможности кристалла. Если использовать MK серии STM32L, можно снизить потребление устройства. Используя встроенный RTC есть возможность избавиться от millis и сделать часы очень точными. Встроенный RTC имеет календарь, который учитывает високосный год. Имеет возможность учитывать летнее/зимнее время.​


Ежесекундное прерывание от RTC можно использовать для перерисовки экрана.​


Для рисования стрелок и циферблата нужно использовать отдельные функции.​


Раз уж в схеме используется дисплей ILI9341. Можно циферблат и стрелки сделать более красивыми, В качестве циферблата можно выводить вообще картинку. Вообще будет улёт башки. Подсветку экрана нужно делать с использованием ШИМ от какого нибудь таймера. Можно регулировать яркость экрана, что позволит снизить потребление.​


У МК STM32L151CBT6 есть управление сенсорными кнопками. Правда я их никогда не пробовал, но попробовать было бы интересно.​
 

bort707

★★★★★★★
21 Сен 2020
3,544
1,009
Основная ошибка кода - использование Arduino IDE.​

Вторая ошибка, использование внешнего RTC.​

Третья ошибка использование millis.​
Частично верно
Главное преимущество контроллера STM32L - его низкое потребление в режиме сна и прочих энергосберегающих режимах, чего в нынешнем коде нет совсем. Это все еще нужно написать и тут соглашусь с Эдуардом - это проще сделать в Кубе, а не в Ардуино Иде
Простое переписывание текущего кода под другой контроллер не даст ровно ничего. Для того чтобы использовать возможности STM32L, этот код нужно отложить в сторону и написать новый с нуля.

Замечу, что даже при условии грамотного перевода проекта на STM32L большого эффекта только от этого ждать не стоит. В проекте, где есть постоянно включенный дисплей, именно он является главным потребителем заряда батарей. Большего смысла бороться за снижение потребления МК в этих условиях я не вижу.
 

Эдуард Анисимов

★★★★★★★
23 Сен 2019
2,543
1,014
60
Марий-Эл
@bort707, Я в CubeMX смог смоделировать потребление 2мА. Контроллером.
Дисплей жрёт много только во время отрисовки. При поддержке изображения где то в 2 раза меньше. Там можно ещё напряжениями матрицы поиграть, что бы снизить. Но вот подсветка кушает неплохо.
Самое интересное, в документации к чипу ILI9341 я не нашёл потребляемый ток. Смотрел плохо. Интересно сколько сама матрица жрёт?
 

v.bay

✩✩✩✩✩✩✩
26 Окт 2026
7
0
Вот и настоящие вопросы, Все по порядку: Почему Ардуино, потому что код открытый, есть много красивых часов, но загрузка EXE файла. Я еще в первую зиму спросил у одного источника выслать исходник, он переслал смайлик с двумя фигами. Часы были классные и стрелки, будильник, корректировка времени. Не знаю внутренние или внешние. Если использовать внутренние, то логику календаря придется писать самому там одни регистры. А здесь ЧИП поставил и ни каких проблем. Кушает он не много сотни мкА, в момент обмена немного скачет, но все равно меньше 1мА. Про millis: Если вы читали код оригинала, там все просто блоки идут дру за другом и каждую оборот обновляется все по очереди, а это ресурсы значит и потребление. Сейчас - круг с его атрибутами, рисуется 1 раз в блоке Set, больше к рему нет обращений пока не активтвируешь Reset. В блоке Loop, организуется: как считать минуты, часы, стирание предыдущей стрелки и прорисовка текущей и т.д. А те блоки которые шли по порядку превратил в ф-ии, и они вызываются по необходимости, пример, каждые сутки обновляется календарь см. скетч. Надеюсь понятно излагаю. Этим я немного уменьшил использование ресурсов, т.е. потребление и компенсировал добавленные мной плюшки, это тоже ресурсы. Про ШИМ на подсветку. я умненький старичок. Чего вертушка вертится бестолку, У меня очень старый ЖК блок, покупал году в 2003, с флешкой, Тачем, с внутренними двунаправленными ЧИПами данных. и там каждый диод выведен на пату отдельным проводником и там обьединялся. Я сделал что каждый оборот вертушки горел один диодик. Ввел флаг, в начале цикла он анализировался если 0 то отключить, подсветку, если 1 то включить первый диод и увеличить флаг на единицу, если 4, то флаг в 1 и все поновой. В качестве ключей использовал 4 бита порта stm При прежнем токе экран виден стал только в кромешной темноте. и когда увеличил ток в 3 раза что то засветилось. Физику не обманешь, умным ты считаешь себя или не очень. Сейчас все работает так: нашел я плюшку, корая останавливает вертушку, по вхождению фокуса в нее. Она на Аське, И сейчас вертушка делает один оборот и цикл останавливаться. Когда счетчик millis обнуляется, срабатывает прерывание, этот макрос (можно так его назвать) отпускает вертушку, она делает один оборот, выполняет свое назначение и стопорит цикл. Так что ф-я millis мне нжуна. Про L151, я в курсе даташит до дыр затер, качал манувл 0038 его тоже до дыр, второй год только им и брежу.
 

bort707

★★★★★★★
21 Сен 2020
3,544
1,009
Если использовать внутренние [часы], то логику календаря придется писать самому там одни регистры.
Для СТМ32 есть готовая библиотека с часами и календарем.
блоки которые шли по порядку превратил в ф-ии, и они вызываются по необходимости, пример, каждые сутки обновляется календарь см. скетч. Надеюсь понятно излагаю. Этим я немного уменьшил использование ресурсов, т.е. потребление
это не уменьшает потребление ни на грамм У вас все равно МК крутится в бесконечном цикле - и заходит ли он в функции или крутится вхолостую - его потребление одинаково.
Потребление можно было бы уменьшить, если снизить число обращений к RTC (сейчас вы дергаете RTC каждый оборот Loop) или если бы вы переводили контроллер в сон на время ожидания.

По коду
Я сделал что каждый оборот вертушки горел один диодик. Ввел флаг, в начале цикла он анализировался если 0 то отключить, подсветку, если 1 то включить первый диод и увеличить флаг на единицу, если 4, то флаг в 1 и все поновой. В качестве ключей использовал 4 бита порта stm
В вашем коде в первом сообщении этого нет.
Сейчас все работает так: нашел я плюшку, корая останавливает вертушку, по вхождению фокуса в нее. Она на Аське, И сейчас вертушка делает один оборот и цикл останавливаться. Когда счетчик millis обнуляется, срабатывает прерывание,
Это вы имеете в виду строчку ниже?
C++:
asm("wfi"); //остановка Loop
Согласно документации, чтобы это работало, вам необходимо отдельно сконфигурировать прерывание, которое будет выходить из этой инструкции. У вас в коде этого нет. И никакой "миллис обнуляется" тут не поможет, тем более что инструкция "wfi" останавливает миллис совсем. Предположу, что в вашем коде эта строка на самом деле не делает ничего. Эта инструкция не является обязательной для компилятора, и я полагаю, что эту строчку компилятор из вашего кода просто выкинул.
Сам я эту штуку не использовал, интересно спросить @Эдуард Анисимов, что он об этом думает.
 
Изменено:

v.bay

✩✩✩✩✩✩✩
26 Окт 2026
7
0
Для СТМ32 есть готовая библиотека с часами и календарем. Если так рассуждать, то дешевле и без забот, сваять их на 176 или 561 серии. 3 корпуса часы и корпус делитель генератор частоты на 32.768 кГЦ. Там и часы и 2 будильника, без проблемная коррекция, динамическая индикация. Индикатор, правда, ИВЛ, но зато величина, хоть на стену вешай. Да еще корпус переходник 2003 ULN (если не ошибаюсь) если индикатор маленький то и без переходника можно по выходу ограничение 24В. Давно было, мы старикам на именины юбилейные дарили. Потребление 3-5мА по логике. По вертушке доказывать ничего не буду, но я закоментировал строку - потребление одно, раскоментировал почти на 3мА меньше. И взял я ее с скетча, а не с потолка. После компиляции я просматриваю ошибки, компиллер говорит, вот эта прог. устарела, обновите. А я выкинул вот эту строку не встречал. Можно еще так останавливаеш часы 00.01. в это вркмя происходит самый длинный период вертушки если приглядеться то видно как раз в секунду календарь мигает, если комент то моргания не видно.
 

v.bay

✩✩✩✩✩✩✩
26 Окт 2026
7
0
По поводу динамики 4 диодов. На том ЖК, технологии NT, выставлял ток 4,5 - 5мА, а в динамике нормально видно при 12 - 15мА. Где то это ответ на ШИМ. естественно все выкинул и больше не умничал. Да его еще и регулировать надо или светосенсор ставить? у меня на корпусе нет ни одной кнопки, маленькое отверстие под Reset 0,25мм. Булавка из 2-ой струны гитарной, только она лезет. Датчик отрегулирован - подсветка включена на боку, и на задней стороне корпуса. во всех других позициях выключена. И опять millis я понял так, это счетчик который отсчитывает каждую мсек и каждый отсчет уменьшает счетчик targetTime на на 1. мы в блоке set загрузили туда 1000 (у меня 498) targetTime = millis() + 498; //секунда
Через 1 сек счетчик targetTime обнуляется if (targetTime < millis()), ф-я millis постоянно считает до 1 мсек, и запускает прерывание,
блок переписи данных ис RTC в регистры stm, перед этим в регистр targetTime. снова заносится секунда только уже в блоке Loop.
hh = rtc.hour(); // грузим из rtc в рег-ы
mm = rtc.minute();
ss = rtc.second();
Week = rtc.dayOfWeek(); .
запускается блок вычисления сек, минут, часов. Стирается старая графика и рисует данные из регистром stm новые стрелки сек, мин, час. по сути это функции ArcSin, ArcCos в зависимости от квадранта привязанные к пикселям ЖК. Если сек не прошла счетчик не 0, if (targetTime < millis()) не выполняется т.е targetTime в котором изначально загружено число millis+ n не меньше 1, в счетчике millis либо 0 либо 1 он считает до 1 мсек. то все пропускается. Охренеть как бедный Александр нам тупым все это с легкостью обьясняет.
 
Изменено: