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

v.bay

✩✩✩✩✩✩✩
26 Окт 2026
10
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,547
1,009
Выкладываю вариант скетча
В вашем сообщении нет никакого скетча

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

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

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

bort707

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

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

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

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

v.bay

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

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

bort707

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

v.bay

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

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

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


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


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


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


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


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


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


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

bort707

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

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

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

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

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

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

v.bay

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

bort707

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

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

v.bay

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

v.bay

✩✩✩✩✩✩✩
26 Окт 2026
10
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 мсек. то все пропускается. Охренеть как бедный Александр нам тупым все это с легкостью обьясняет.
 
Изменено:

v.bay

✩✩✩✩✩✩✩
26 Окт 2026
10
0
Еще про IL I на ЖК. в этой свистульке жк включен хитро. Задействован пин CS. Я впервые столкнулся с этим. обычно в осцах его сажают просто на землю и понятно там картинка меняется постоянно. Здесь раз в секунду поэтому выбор кристалла большее время отключено. значит все регистры в статике, а они и жрут ток в динамике мой последний на F446 очень кушал много. Да ШИМ тоже кушает, но он работает на пиксели т.е. конденсаторы. Они маленькие емкость, не думаю, большая их много конечно. От питания тоже зависит. При 2,65В - 3 -3,5мА. в момент занесения прыгает немного.
 

bort707

★★★★★★★
21 Сен 2020
3,547
1,009
Все квотить не буду - очень много пишете не по делу
По поводу динамики 4 диодов. ..... естественно все выкинул и больше не умничал.
Ежели выкинули из кода, зачем писать надо было?
Если сек не прошла счетчик не 0, if (targetTime < millis()) не выполняется т.е ... все пропускается.
Посмотрите внимательно на свой код. Обращение к RTC у вас стоит ДО условия
C++:
if (targetTime < millis()
а значит оно не пропускается, а выполняется ВСЕГДА, не только раз в секунду.

Что касается вашей просьбы помочь переделать код для STM32L151 - это просто. В вашем коде нет ничего такого, что зависело бы от модели контроллера, этот код должен заработать на L-серии вообще без изменений. Возможно, придется поправить номера пинов, не более. Только никакого выигрыша в потреблении от такой смены МК не будет.
 
Изменено:

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

★★★★★★★
23 Сен 2019
2,545
1,014
60
Марий-Эл
Потребление можно жутко снизить, если МК загонять в сон и будить его каждую секунду от встроенного RTC !!!!!!!!!!!!!!!!!

Сегодня посмотрел 2.2" дисплей жрёт 50 мА. Из них 30 жрёт подсветка. И да. Дисплей так же можно загонять в сон.

Хотел заняться этим проектом. Но передумал. Для соседа сделаю. Он давно просил что нибудь этакое.
Спасибо за идею.

Сам я эту штуку не использовал, интересно спросить @Эдуард Анисимов, что он об этом думает.
@bort707 Если написать прошивку правильно, так изгаляться не нужно будет. И даже millis() не нужна будет.
 

v.bay

✩✩✩✩✩✩✩
26 Окт 2026
10
0
Да здесь попали, сначала иниацилизация, потом проверка а читать то можно ли?. Это, конечно, зевок, согласен, но на работу это не влияет, считывание регистров все равно после проверки. просто rtc подключены всегда. Завтра попробую исправить. Хотя если подумать то в проге нет закрытия этой ф-ии. т.е. она активна всегда. короче нужно пожевать эту ситуацию. По поводу L-ки: думаете я не пробовал, все работает компиляция. загрузка, а свистулька не работает. Стал рыть скачал мануал на L, стал разбираться. И понял, адреса фарша регистров, АЦП, и всего остального совершенно не совпадают с адресами того же в F-ки. Цоколевка одинаковая, а в нутре полнейшее не совпадение. Начал искать где устанавливается соответствие адреса которые понимает компиллер с идентификатором с которыми работает программист. Пересмотрел всю библиотеку Arduino_STM32-master аддон ее называют спецы, и ничего не нашел. Может как то по другому это делается?.
 

bort707

★★★★★★★
21 Сен 2020
3,547
1,009
Цоколевка одинаковая, а в нутре полнейшее не совпадение. Начал искать где устанавливается соответствие адреса которые понимает компиллер с идентификатором с которыми работает программист. Пересмотрел всю библиотеку Arduino_STM32-master аддон ее называют спецы, и ничего не нашел. Может как то по другому это делается?.
В аддоне Arduino_STM32-master нет поддержки STM32L1 ядра. Непонятно, как вы код для L151 компилировали, какую плату в настройках выбирали, если L-серии там нет? Или вы компилировали под F103. а заливали в L151 ?

Если вы хотите использовать Ардуино для камня STM32L1xx - Вам надо брать другой аддон, STM32duino. В нем есть поддержка этого МК
 

v.bay

✩✩✩✩✩✩✩
26 Окт 2026
10
0
Хорошая идея, особенно загоняние в сон. Только сначала сделай, потом я обьясню почему не получилось, Разговаривать с вами сложно. Вы такие крутые, а остальные такие бестолковые, ну и флаг в руки, загоняй в сон сначала stm а потом ЖК. И делай на L- ке, только с ножками правильно разберись (ваш совет).
"Что касается вашей просьбы помочь переделать код для STM32L51 - это просто. В вашем коде нет ничего такого, что зависело бы от модели контроллера, этот код должен заработать на L-серии вообще без изменений."
Вижу, начали просыпаться, только в аддоне, который советуете нет камня 151 там 152, 64 пин. Компилил я легко. там ничего не нужно, кроме кода.
 
Изменено:

bort707

★★★★★★★
21 Сен 2020
3,547
1,009
Это, конечно, зевок, согласен, но на работу это не влияет, считывание регистров все равно после проверки
прежде чем писать, вы бы сначала открыли исходный код этой функции - и вы увидите что это не просто инициализация. Эта функция читает все регистры RTC. И делает это при каждом входе в Loop из-за того что вы ее вставили не там.