Часы офисные на STM32 + ESP-01 + p10 DMD

Тема в разделе "Глядите, что я сделал", создана пользователем b707, 25 окт 2019.

  1. b707

    b707 Гуру

    Часы - традиционная тема для этого раздела :)
    Вашему вниманию предлагаются совсем простые часы офисного дизайна на матрицах DMD p10:
    [​IMG]
    В этих часах нет погоды и памятных дат. Они не умеют работать будильником и показывать температуру с датчиков.
    Функции часов максимально просты и функциональны. Часы умеет показывать точное время, регулярно сверяя его по WiFi c указанным сервером NTP. Часы не сбиваются при выключении питания даже при отсутствии подключения к интернет, так как используют встроенный RTC платы STM32. Также часы умеют подстраивать яркость в зависмости от внешнего освещения, чтобы не слепить хозяина в полной темноте.
    Часы не имеют внешнего интерфейса, все три :) настройки задаются в коде.

    Размер матрицы 32 х 16 см. Матрицы можно соединять каскадно, в этом случае на каждой матрице будут скопированы одни и те же часы - это позволяет делать часы с дисплеем на две стороны (можно повесить их на стеклянную стену и часы буду видны с обоих сторон) или больше - например четыре стороны - для подвешивания под потолком в зале ожидания, если у вас таковой есть :)
    [​IMG]

    Проект создан как иллюстрация к библиотеке DMD_STM32
    Код будет выложен в следующих сообщениях.
     
    Последнее редактирование: 4 дек 2019 в 23:49
    issaom, Andrey12, alp69 и 4 другим нравится это.
  2. b707

    b707 Гуру

    Для сборки часов понадобятся следующие модули:

    1. Плата на контроллере STM32F103C8T6:
    такая
    https://ru.aliexpress.com/item/32967809014.html[​IMG]
    или такая
    [​IMG]
    Первая чуть дороже,но она удобнее, так как имеет на борту гнездо для подключения ESP8266 и батареи RTC

    2. Модуль WiFi на контроллере ESP8266 ESP-01
    [​IMG]
    3 Одна или несколько светодиодных матриц р10
    https://ru.aliexpress.com/item/32960039199.html
    [​IMG]

    4. Датчик освещенности BH1750
    [​IMG]
    5. Блок питания на 5в 1-2А

    Дисклаймер - ссылки на товары Али приведены первые попавшиеся, автор не несет ответсвеннсти за рейтинг продавцов :)
     
    Последнее редактирование: 9 ноя 2019
    KindMan, Andrey12, DetSimen и 4 другим нравится это.
  3. b707

    b707 Гуру

    Проект содержит два независимых контроллера - СТМ32 для управления матрицей и ESP8266 для запроса времени из сети по протоколу NTP.
    Код проекта тоже состоит из двух частей - код для СТМ и код для ЕСП. Связь между контроллерами - по Сериал интерфейсу посредством библиотеки UARTTransfer

    Код NTP клиента для ЕСП (во многом повторяет библиотечный пример)
    Код (C++):
    #include <NTPClient.h>
    #include <ESP8266WiFi.h>
    #include <WiFiUdp.h>
    #include "UARTTransfer.h"

    UARTTransfer UT;
    #define SET_NTP_TIME 51
    #define GET_NTP_TIME 52

    const char *ssid     = "ssid";
    const char *password = "pass";

    // Часовой пояс
    const long utcOffsetInSeconds = 3*3600;
    // флаг обновления времени
    bool flag = true;

    // Define NTP Client to get time
    WiFiUDP ntpUDP;
    NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);

    void setup(){
      Serial.begin(9600);

      WiFi.begin(ssid, password);
      UT.begin(&Serial);

      while ( WiFi.status() != WL_CONNECTED ) {
        delay ( 500 );
        }
    timeClient.begin();
    }

    void loop() {
    // если установлен флаг - запрашиваем время у сервера
      if ( flag && (timeClient.update())) {
    // время получено
        uint32_t tt = timeClient.getEpochTime();
    // отправляем 4 байта в формате EpochTime по Сериал на СТМ32
        UT.sendData(SET_NTP_TIME, 4, (uint8_t*)&tt);
    // сбоасываем флаг
        flag = false;
      }

    // если по Сериал получен запрос на обновление времени - устанавливаем флаг
    if (UT.receiveData() ) {
      uint8_t m_id = UT.getMessageID();
      if (m_id == GET_NTP_TIME) flag = true;
      UT.clearMessage();
    }

      delay(1000);
    }
    Работает просто - при запуске входит в домашнюю сеть и пытается запросить время сервера. При успехе - отправляет время в виде 4х байтного числа по Сериал и переходит в ждущий режим. В дальнейшем обновление времени делается только по запросу с контроллера, управляющего часами..
     
    yucan, ermilin и ИгорьК нравится это.
  4. b707

    b707 Гуру

    прошу прощения за задержку - выкладываю архив с основным кодом
    В архиве 4 файла -
    основной скетч gfxclock.ino
    файл шрифта и два файла библиотеки для связи СТМ32 и ЕСП по UART

    Сборка - все файлы положить в одну директорию, открыть .ino с помощью Ардуино ИДЕ
    В свойствах платы выбрать "Generic STM32F103C series"
    Удачи
     

    Вложения:

    • gfx_clock.zip
      Размер файла:
      3,7 КБ
      Просмотров:
      49
    ИгорьК нравится это.
  5. ИгорьК

    ИгорьК Оракул Модератор

    Классный проект!
    ИМХО, для чайников, типа меня, было бы классно сделать устройство UART отображатель данных. Бросил в UART текст - он вылез на дисплее.
    Понимаю, что веду себя как последний халявщик, но очень хочется :)
     
    b707 нравится это.
  6. b707

    b707 Гуру

    Игорь, для Вас - все что угодно :)
    Только уточните - каким образом пользователь будет "бросать что-то в Уарт" ?
     
  7. ИгорьК

    ИгорьК Оракул Модератор

    Текст байтами в соответствии с таблицей, например (!!!), как в амперковском дисплее . А в остальном - я могу их отправлять по любым правилам, как автор (вы) посчитаете удобным.
     
  8. b707

    b707 Гуру

    хорошо, спрошу по другому - Вы представляете этот "отображатель" как самостоятельное устройство или как "модуль" к какой-то другой системе?

    Просто если самостоятельное - то нужно позаботится о удобном интерфейсе для пользователя. Например, поднять на ЕСП (раз он все равно уже есть в проекте) ВЕБ-сервер, а на сервере сделать страничку с формой для ввода текста. Юзер подключается к серверу - с компа или телефона - и кидает в форму нужный текст.

    А какой интерфейс придумать для УАРТ - я как-то плохо представляю.Хотя если вы подскажете - буду рад, с УАРТом на самих часах возни меньше, там практически все уже готово
     
  9. ИгорьК

    ИгорьК Оракул Модератор

    Усложняете. Я представляю аналогично тому дисплею, что привел ссылку. Или в логике Некстион.

    Интерфейс UART. Посылка состоит из (примерно) служебного байта/нескольких байт, определяющего место/способа начала отображения, и посылки текстовых байтов. Все по усмотрению разработчика.

    В служебном байте можно предусмотреть очистку экрана, мерцание, etc...

    Никакого esp к нему, пользователь имеет только матрицу с контроллером и правила связи с ним по UART.
     
  10. b707

    b707 Гуру

    О, тогда все проще.
    Сейчас в часах уже есть библиотека для работы с UART, которая использует следующий формат - 3 байта заголовок пакета, идентификатор данных, длина сообщения. собственно данные и в конце контрольная сумма
    Именно так пересылается время NTP с ЕСП на СТМ32
    Все что нужно - это добавить в часы обработку пары новых видов запросов - на показ статичного текста и бегущей строки.
    Ограничение на длину текста будет примерно 245-250 символов - это нормально?
     
  11. ИгорьК

    ИгорьК Оракул Модератор

    Лично мне даже много :)
    А вот контрольную сумму в посылке через UART считать вряд ли стоит, ибо это всего лишь дисплей, а сумма, как бы не считалась, жрет ресурсы. Ардуино - ее надо беречь и любить, а не мучать :)
     
  12. b707

    b707 Гуру

    Она уже есть :)
    там некий эрзац - обычный XOR вместо настоящего CRC, много ресурсов не жрет :)
    Хоть какое-то подобие контрольной суммы нужно, UART-то может быть и беспроводным - например через HC-12, так что пакет может прилететь и не весь :) или два пакета разом...
     
    SergeiL и ИгорьК нравится это.
  13. DetSimen

    DetSimen Спамовредитель Модератор

    из проекта, простейшая хэш функция строки, можно использовать как CRC16, на строках более 3 длиной даёт хороший разброс

    Код (C++):
    /*
      статическая функция класса, может вызываться без создания экземпляра
     
      функция простейшего хэша строки, отдает 16-битное значение
      лагоритм взят с Хабра. Никаких умножениев нет, считается быстро (надеюсь)
      на входе - указатель на ASCIIZ  строку
      на выходе - её хэш, или 0х0000, если строка пустая, или чота пошло не так.
    */

        static uint16_t GetHash(const char *AString) {
            uint16_t result = 0x0000;
            uint8_t i = 0;
            while (AString[i] > 0x00) {
                result = (result << 3) + AString[i];
                result = (result << 3) + AString[i++];
                result ^= (result >> 8);
            }
            return result;
        }
    };
     
    ИгорьК и SergeiL нравится это.
  14. ИгорьК

    ИгорьК Оракул Модератор

    Нравицца, да не надаааааа это!

    Ну отобразится один раз крокозябл и что :)

    Более того. Вы передаёте важое сообшение "ДаЗдравствуютПредставителиБалтийскогоФлотаВКлешах43сантиметра!" и вместо восклицательного знака приходит точка, то есть - ошибка. И все, балтийцы в обиде.
     
    Последнее редактирование: 10 ноя 2019
  15. b707

    b707 Гуру

    Эксклюзивно для Игоря :)

     
    DetSimen и ИгорьК нравится это.
  16. ИгорьК

    ИгорьК Оракул Модератор

    Вауууууу!!!!!! Класс!!!! :)))))

    Бомба! Нет слов! :)
     
    DetSimen и b707 нравится это.
  17. b707

    b707 Гуру

    Игорь, пока это только картинка :)
    Код соберу позже, сегодня вряд ли, у нас сегодня сабантуй с бывшими сокурсниками :)
     
  18. b707

    b707 Гуру

    обещанного, как говорится, три года ждут :)
    В общем, мне очень стыдно, но только сейчас руки дошли
    Скетч dmd_uart_display.ino - это "UART отображатель" на основе DMD матриц и библиотеки DMD_STM32, который принимает по Сериал текст и прокручивает его в качестве бегущей строки на дисплее
    А send_text_example - показывает, как посылать строчки в Сериал
    Оба скетча также требуют для работы библиотеку UARTTransfer.h используемую в проекте часов из сообщения #4 этой ветки
     

    Вложения:

    ИгорьК нравится это.