Сводный список записей блога

--->>>> Сводный список записей блога <<<<---

05 июня 2021

Кухонный мультитаймер

Обновлено 5.06.2021
Версия прошивки - 2.14

Реализованные хотелки

  • Несколько одновременных независимых таймеров
  • Корректировка времени счета каждого таймера
  • Управление энкодером
  • Запуск первого таймера в один поворот энкодера
  • Отображение времени
  • Предупредительный звуковой сигнал за минуту до истечения выдержки
  • В сработавшем таймере - отсчет времени от момента срабатывания - NEW!


Предыстория.

Завалялся у меня бесплатный китайский монохромный дисплей 128*64 пикселя с желто-зеленой подсветкой. На контроллере ST7920. Точнее, было их два, второй синий с белой подсветкой, но я его уже использовал.


Ну что сказать. Контроллер сам по себе тормозной. В идеальнейших условиях из дисплея можно выдавить 12-14fps. Казалось бы - для статичных применений типа часиков, таймера - применимо. Но! Дисплей присобачен к конского размера печатной плате. Видимая область  картинки - менее 60% общей площади платы. Спасает только то, что плату дисплея можно сверху обрезать вплотную к металлической рамке, да и справа отгрызть несколько мм можно, что б не зацепить группу переходных отверстий. На картинке выше красным приблизительно показаны линии отреза.

Первые эксперименты (и одно изделие) с этим дисплеем были с применением Атмеловских МК ATMEGA32 и ATMEGA328. Но с учетом тормознутости контроллера дисплея работа с дисплеем на этих МК была очень неудобна. В результате был взят простенький МК STM32F103C8. Там хоть процесс обмена с дисплеем можно отдать DMA-контроллеру.

В результате родилась вот такая схема:




Питается таймер от стабилизированного источника 5 вольт, управление - энкодер и кнопка, "мерзкий противный звук™" издает пищалка со встроенным генератором.
Контрастность дисплея регулируется подстроечником. Программирование - через ST-Link.

Конструктив.

Печатная плата таймера - двусторонняя, находится под дисплеем. Слева - крутилка-кнопка и питание. Пищалка выведена на заднюю сторону корпуса.



Управление.

В дежурном режиме на дисплее отображается текущее время. Если время не установлено - будет графическая заставка.



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

Нажатие нижней кнопки в режиме установки выдержки отменяет настройку нового таймера.

В режиме счета на дисплее отображается выдержка таймера и оставшееся время счета.


Нажатие на энкодер либо его вращение приводят к выбору пункта добавления нового таймера (см. фото в начале статьи) либо перемещению курсора по списку активных таймеров.


Нажатие на энкодер на пункте New timer... включает добавление еще одного таймера.

Нажатие на энкодер на каком то из активных таймеров позволяет изменить выдержку выбранного таймера. При этом остальные активные таймеры на период изменения скрываются. Изменение выдержки обязательно подтвердить нажатием на энкодер. "Сбросить" ошибочно добавленный или ставший ненужным таймер можно, уменьшив ему оставшуюся выдержку до 0.

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

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

В режиме ожидания длинное (4 сек) нажатие на энкодер включает режим установки текущего времени. В режиме установки времени новое время сохраняется нажатием на энкодер.

Длительное нажатие нижней кнопки в режиме ожидания или в режиме отображения списка таймеров выполнит сброс дисплея и покажет стартовую заставку. При этом ход времени и активных таймеров не нарушатся.

Если выдержка таймера более 2 минут, то за минуту до истечения выдержки прозвучит предупредительный звуковой сигнал - 4 коротких "бипа".

NEW! При срабатывании таймера на экране отображается время с момента сработки.

По истечении выдержки таймера начинает звучать прерывистый звуковой сигнал, время выдержки таймера начинает мигать, остальные таймеры скрываются. Звуковой сигнал звучит 120 секунд (2 минуты). Если не предпринимать никаких действий, то по истечению 2 минут звуковой сигнал прекращается, но время выдержки сработавшего таймера будет оставаться на дисплее еще в течении 58 минут, после чего исчезнет навсегда. Нажатие на энкодер, кнопку или вращение энкодера досрочно прерывают звуковой сигнал и возвращает устройство в режим показа оставшихся таймеров или в дежурный режим.

Если было установлено время, то каждый час в период с 7:00 до 22:00 включительно каждый час будет звучать короткий звуковой сигнал.

Вот тут лежат герберы, а вот тут - прошивка, версия 2.14 (2 варианта, отличаются реверсом энкодера). 

Плата оптимизирована под ручное изготовление методом ЛУТ или фоторезист.

PS. Изначально этот таймер у меня интегрирован в сетку умного дома и получает дату и время из неё. Поскольку отдельного календаря в таймере нет - в автономной версии, которая тут представлена, реализовано только отображение времени.

PPS. видео от Юрия


14 комментариев:

  1. Отличная работа! Как всегда хорошо продуман интерфейс.

    ОтветитьУдалить
  2. С удовольствие делаю этот таймер. Все устройства автора идеально продуманы и отлично работают! Герберы позволяют сделать плату методом фоторезист.

    ОтветитьУдалить
  3. Завершаю работы то таймеру. Автор сумел помочь справиться с серьезной проблемой. Случайно купленный китайский клон STM32 не позволил запустить работу этого устройства. Разработанная goldenandy индивидуальная прошивка сумела вдохнуть жизнь в китайского "оборотня".Таймер прекрасно работает и радует своим функционалом и настройками. Рекомендую к повторению. С такой тех поддержкой от автора, запуск
    Его устройств , практически гарантируется. Спасибо таланливому, человеку за его творения и помощь!

    ОтветитьУдалить
  4. Замечательная вещица получилась!

    ОтветитьУдалить
  5. Спасибо за новую прошивку с предупредительными сигналами. Все попробовал. Пользоваться стало удобнее.

    ОтветитьУдалить
  6. Остальные изменения, допзвук и выход из спячки в 5-00 присутствуют?

    ОтветитьУдалить
    Ответы
    1. Если я вам индивидуально не правил период ночи, то наверное да. Я в ту часть кода не смотрел.

      Удалить
  7. Наверное, вы индивидуально делали, по просьбе, на 5 утра Пусть тогда и будет без изменения.

    ОтветитьУдалить
  8. где найти исходники или они платные?

    ОтветитьУдалить
    Ответы
    1. Этот таймер - часть Умного Дома и его standalone-версия - всего лишь часть функционала.
      Сидеть и выпиливать все, что не относится к УД - я не буду.
      Но на вопросы - как сделано то или иное - могу ответить с фрагментами кода.

      Удалить
  9. можно весь проект посмотреть или купить я из Украины. (мало примеров, в связке stm32 и екраном ST7920 )

    ОтветитьУдалить
    Ответы
    1. Наверное, я не готов пойти на это.

      По драйверу дисплея:
      тут - https://goldenandy.blogspot.com/2021/02/st7920.html
      и тут - https://radiokot.ru/forum/viewtopic.php?p=3989288#p3989288
      На СТМке заводил обновление дисплея как с ДМА, так и на ожиданиях готовности СПИ.

      Таймер, что дергает раз в 70 мкс:
      void TIM3_IRQHandler(void){
      TIM3->SR &= ~TIM_SR_UIF;
      GPIOB->BSRR = GPIO_BSRR_BR12; //выключаем CS - прижимаем его к земле.
      ST7920_sync();
      }

      Процедура отправки данных
      void ST7920_sendData(uint8_t dataBuf[], uint8_t count, uint8_t dataFlag) {
      static uint8_t spiBuf[6];
      uint8_t idx = 0, spiIdx = 0;
      while (count) {
      count--;
      uint8_t b = 0xF8;
      if (dataFlag)
      b = 0xFA;//Передача данных или команды.
      spiBuf[spiIdx++] = b; // spi1send(b);
      spiBuf[spiIdx++] = dataBuf[idx] & 0xF0; // spi1send(dataBuf[idx] & 0xF0);
      spiBuf[spiIdx++] = dataBuf[idx] << 4; // spi1send(dataBuf[idx] << 4);
      idx++;
      }
      GPIOB->BSRR = GPIO_BSRR_BS12; // поднимаем CS - active

      DMA1_Channel5->CCR &= ~DMA_CCR_EN;

      DMA1_Channel5->CPAR = (uint32_t) (&SPI2->DR); //заносим адрес регистра DR в CPAR
      DMA1_Channel5->CMAR = (uint32_t) spiBuf; //заносим адрес данных в регистр CMAR
      DMA1_Channel5->CNDTR = spiIdx; //количество передаваемых данных
      DMA1_Channel5->CCR |= DMA_CCR_EN;
      }

      Инициализация
      // --- SPI & DMA
      // MOSI2 B15
      // SCK2 B13
      // CS B12

      __CHANGE_REG(GPIOB->CRH,
      GPIO_CRH_CONFIG12 | GPIO_CRH_CONFIG13 | GPIO_CRH_CONFIG14 | GPIO_CRH_CONFIG15,
      GPIO_CRH_CONFIG12_OUT_FAST_PP | GPIO_CRH_CONFIG13_AOUT_FAST_PP | GPIO_CRH_CONFIG14_OUT_FAST_PP | GPIO_CRH_CONFIG15_AOUT_FAST_PP);
      GPIOB->BSRR = GPIO_BSRR_BR12 | GPIO_BSRR_BS14;

      RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;
      // clock from APB1 (36 MHz), divider 32 (BR[2:0]=100) --> SPIclk=1.125 MHz
      SPI2->CR1 = SPI_CR1_MSTR // master
      | SPI_CR1_BR_2
      | SPI_CR1_SSM | SPI_CR1_SSI
      | SPI_CR1_CPOL | SPI_CR1_CPHA;
      SPI2->CR2 = SPI_CR2_TXDMAEN; //Разрешаем запрос к DMA
      SPI2->CR1 |= SPI_CR1_SPE; // включили SPI

      //SPI2 TX -> DMA1.CH5
      RCC->AHBENR |= RCC_AHBENR_DMA1EN;
      DMA1_Channel5->CCR = DMA_CCR_PSIZE | DMA_CCR_MINC | DMA_CCR_DIR;

      // update timer
      RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
      TIM3->CR1 = 0;
      TIM3->CR2 = 0;
      TIM3->PSC = 0; // прескалер
      TIM3->ARR = 72*80-1; // Регистр перезагрузки (ТОР счёта) 72MHz/5760 = 12500Hz = 80us
      // interrupt by reload and compare
      TIM3->DIER |= TIM_DIER_UIE;
      NVIC_EnableIRQ(TIM3_IRQn);
      TIM3->CR1 |= TIM_CR1_CEN;// стартуем

      Удалить
  10. Анонимный02 ноября, 2021 07:21

    Отличный таймер, спасибо автору за работу. Собрал себе тоже, но появилась проблема с часами. Почему то спешат очень сильно, где то на минуту в сутки уходят вперёд. Кварц по схеме, 16 мГц, как то можно решить эту проблему?

    ОтветитьУдалить
    Ответы
    1. Время в таймере отсчитывается программно, соответственно, точность хода определяется кварцем.
      Минута в сутки - это почти 700 ppm - непозволительно много.
      Тут или кварц виноват, или я не знаю, кто.
      Попробуйте поменять кварц. Или увеличить ёмкости при нём... Тут сложно что-либо сказать, не имея устройства на руках.

      Удалить

======= !!! ВНИМАНИЕ !!! ======================================================================
Гугл умный и боится спама. Поэтому иногда ваши комментарии Гугл отправляет мне на премодерацию. Отправлять или нет - решаю не я, а алгоритмы Гугла. Если ваш комментарий не появился сразу, значит я получу уведомление и опубликую ваш комментарий через некоторое время. Я стараюсь это делать достаточно оперативно.