Часы - традиционная тема для этого раздела Вашему вниманию предлагаются совсем простые часы офисного дизайна на матрицах DMD p10: В этих часах нет погоды и памятных дат. Они не умеют работать будильником и показывать температуру с датчиков. Функции часов максимально просты и функциональны. Часы умеет показывать точное время, регулярно сверяя его по WiFi c указанным сервером NTP. Часы не сбиваются при выключении питания даже при отсутствии подключения к интернет, так как используют встроенный RTC платы STM32. Также часы умеют подстраивать яркость в зависмости от внешнего освещения, чтобы не слепить хозяина в полной темноте. Часы не имеют внешнего интерфейса, все три настройки задаются в коде. Размер матрицы 32 х 16 см. Матрицы можно соединять каскадно, в этом случае на каждой матрице будут скопированы одни и те же часы - это позволяет делать часы с дисплеем на две стороны (можно повесить их на стеклянную стену и часы буду видны с обоих сторон) или больше - например четыре стороны - для подвешивания под потолком в зале ожидания, если у вас таковой есть Проект создан как иллюстрация к библиотеке DMD_STM32 Код будет выложен в следующих сообщениях.
Для сборки часов понадобятся следующие модули: 1. Плата на контроллере STM32F103C8T6: такая https://ru.aliexpress.com/item/32967809014.html или такая Первая чуть дороже,но она удобнее, так как имеет на борту гнездо для подключения ESP8266 и батареи RTC 2. Модуль WiFi на контроллере ESP8266 ESP-01 3 Одна или несколько светодиодных матриц р10 https://ru.aliexpress.com/item/32960039199.html 4. Датчик освещенности BH1750 5. Блок питания на 5в 1-2А Дисклаймер - ссылки на товары Али приведены первые попавшиеся, автор не несет ответсвеннсти за рейтинг продавцов
Проект содержит два независимых контроллера - СТМ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х байтного числа по Сериал и переходит в ждущий режим. В дальнейшем обновление времени делается только по запросу с контроллера, управляющего часами..
прошу прощения за задержку - выкладываю архив с основным кодом В архиве 4 файла - основной скетч gfxclock.ino файл шрифта и два файла библиотеки для связи СТМ32 и ЕСП по UART Сборка - все файлы положить в одну директорию, открыть .ino с помощью Ардуино ИДЕ В свойствах платы выбрать "Generic STM32F103C series" Удачи
Классный проект! ИМХО, для чайников, типа меня, было бы классно сделать устройство UART отображатель данных. Бросил в UART текст - он вылез на дисплее. Понимаю, что веду себя как последний халявщик, но очень хочется
Игорь, для Вас - все что угодно Только уточните - каким образом пользователь будет "бросать что-то в Уарт" ?
Текст байтами в соответствии с таблицей, например (!!!), как в амперковском дисплее . А в остальном - я могу их отправлять по любым правилам, как автор (вы) посчитаете удобным.
хорошо, спрошу по другому - Вы представляете этот "отображатель" как самостоятельное устройство или как "модуль" к какой-то другой системе? Просто если самостоятельное - то нужно позаботится о удобном интерфейсе для пользователя. Например, поднять на ЕСП (раз он все равно уже есть в проекте) ВЕБ-сервер, а на сервере сделать страничку с формой для ввода текста. Юзер подключается к серверу - с компа или телефона - и кидает в форму нужный текст. А какой интерфейс придумать для УАРТ - я как-то плохо представляю.Хотя если вы подскажете - буду рад, с УАРТом на самих часах возни меньше, там практически все уже готово
Усложняете. Я представляю аналогично тому дисплею, что привел ссылку. Или в логике Некстион. Интерфейс UART. Посылка состоит из (примерно) служебного байта/нескольких байт, определяющего место/способа начала отображения, и посылки текстовых байтов. Все по усмотрению разработчика. В служебном байте можно предусмотреть очистку экрана, мерцание, etc... Никакого esp к нему, пользователь имеет только матрицу с контроллером и правила связи с ним по UART.
О, тогда все проще. Сейчас в часах уже есть библиотека для работы с UART, которая использует следующий формат - 3 байта заголовок пакета, идентификатор данных, длина сообщения. собственно данные и в конце контрольная сумма Именно так пересылается время NTP с ЕСП на СТМ32 Все что нужно - это добавить в часы обработку пары новых видов запросов - на показ статичного текста и бегущей строки. Ограничение на длину текста будет примерно 245-250 символов - это нормально?
Лично мне даже много А вот контрольную сумму в посылке через UART считать вряд ли стоит, ибо это всего лишь дисплей, а сумма, как бы не считалась, жрет ресурсы. Ардуино - ее надо беречь и любить, а не мучать
Она уже есть там некий эрзац - обычный XOR вместо настоящего CRC, много ресурсов не жрет Хоть какое-то подобие контрольной суммы нужно, UART-то может быть и беспроводным - например через HC-12, так что пакет может прилететь и не весь или два пакета разом...
из проекта, простейшая хэш функция строки, можно использовать как 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; } };
Нравицца, да не надаааааа это! Ну отобразится один раз крокозябл и что Более того. Вы передаёте важое сообшение "ДаЗдравствуютПредставителиБалтийскогоФлотаВКлешах43сантиметра!" и вместо восклицательного знака приходит точка, то есть - ошибка. И все, балтийцы в обиде.
Игорь, пока это только картинка Код соберу позже, сегодня вряд ли, у нас сегодня сабантуй с бывшими сокурсниками
обещанного, как говорится, три года ждут В общем, мне очень стыдно, но только сейчас руки дошли Скетч dmd_uart_display.ino - это "UART отображатель" на основе DMD матриц и библиотеки DMD_STM32, который принимает по Сериал текст и прокручивает его в качестве бегущей строки на дисплее А send_text_example - показывает, как посылать строчки в Сериал Оба скетча также требуют для работы библиотеку UARTTransfer.h используемую в проекте часов из сообщения #4 этой ветки
ни один из скачанных с ваших ссылок файлов примеров, да и сам скетч часов не хотят компилироваться. Мне непонятно где искать проблему.