Дизайнерские часы на ГРИ

я видел кто то собирал просто на дисплеях…
а если обновлять не весь дисплей целиком а только часть, может будет быстро…
2-4 esp, и вот вам передняя панель)))

имитацию? Она есть в продаже.

Если в тексте вместо “рефакторинга” используется “рефакторизация”, вместо “синергетики” - “синергия”, а вместо “аналого-цифрового” - “аналогово-цифровой”, то значения слов можно искать очень долго.

1 лайк

Я такие мелочи не заметил, вот тут сразу ассоциация - волосатый космос на голове инженера. Прям затягивает смыслами.

Т.е. когда человек, обычно не могущий связать пару слов(а связав, наделает кучу ошибок), вдруг стал выдавать тексты уровня профессора философии - ничего не смутило? :slightly_smiling_face:

1 лайк

Люди меняются… может он пережил внутренний кризис и переродился духовно?

толстый
вы просто мне завидуете)))
к тому же это не код, код вязать я могу))) но это не точно…
и человек способный запустить программу которая может выдавать текста уровня профессора, не приравнивает этого человека автоматически к профессору ?)))

Честно, нет. Только лишь фраза показалась кривой.

Потому что истина рождается не в эхе чужих слов, а в тишине собственного ума.

Мне почему то захотелось её переписать:
Эхо пустых слов не рождает истину, она живёт на дне тишины.

Видимо Антонов с красными маками вспомнился.

Если в собственном уме тишина … ну не будем о грустном.

1 лайк

наоборот, это жеж высшее достижение в медитативных практиках - остановить мысль

отвлекли…
а еще это просто ответ может кому понравится, если спросят чем вы занимаетесь, или для собеседования, если вам такой же бред затерли)))(как правило там перечисляют все что они знают, когда говорят чем предстоит заниматься) выражения их лиц после такого стоит!))) раз уж приехали, и понимаете что это не то место…

можно ии обсуждать, а можно его использовать, и если понравится остальные сами подтянуться…
и к тому же хороший инструмент, который как я вижу не все взяли на вооружение)))

я вот знаю что человек может уехать из России, но Россия не уедет из человека))))
сужу по себе! а вы говорите меняются…

а еще у меня травма! после того как сказали что я занимаюсь фигней, я на вопрос чем занимаюсь, и что продаю, наверное никогда! не отвечу по простому)))

Чтобы использовать ИИ, надо обладать ЕИ, а иначе получится КА-КА.

а ссылка есть ?))) https://habr.com/ru/articles/877832/
вариант ? но у меня такой сборки нету))) однако как по мне единые информационные центры(как говорит поиск) мне и даром не нужны))) или вы про естественный ?)))

вообще я ии не готов обсуждать, есть идеи из чего сделать какие то необычные часы, или что уже сделано ?

ИИшники - люди всерьёз полагающиеся на ИИ :slight_smile:

ИМИТАЦИЯ ГРИ.

  1. Многодисплейность tft. (продаётся уже, но можно добавить геометрии, на торцах добавить круглые дисплеи, как выше подсказал ИИ )

    …и конечно делать всё на одном МК.
  2. WS2812b подсвечивают акрил с гравировкой.

Неплохие наручные часы, цифры стрелки крупные и носить, главное, удобно.

1 лайк

в целом на дисплее вроде видосик смотреть можно )))

User_Setup.h

#ifndef USER_SETUP_H
#define USER_SETUP_H

// === Настройка дисплея ST7735 ===
#define ST7735_DRIVER
#define TFT_WIDTH  128
#define TFT_HEIGHT 160
#define ST7735_REDTAB160x128  // Для дисплеев с красной платой (128x160)


// Вариант 1: BGR (чаще для ST7735)
//#define TFT_RGB_ORDER TFT_BGR
//#define TFT_INVERSION_ON

// Вариант 2: RGB
#define TFT_RGB_ORDER TFT_RGB
#define TFT_INVERSION_OFF

// === Пины SPI (HSPI) ===
#define TFT_MOSI  13  // GPIO13 (D7)
#define TFT_SCLK  14  // GPIO14 (D5)
#define TFT_CS    15  // GPIO15 (D8) - Chip Select
#define TFT_DC     2  // GPIO2  (D4) - Data/Command
#define TFT_RST    4  // GPIO4  (D2) - Reset (можно подключить к +3.3V, если есть кнопка Reset)
#define TFT_BL    12  // GPIO12 (D6) - Подсветка (PWM)

// === Настройки SPI ===
#define SPI_FREQUENCY  27000000  // Максимум для ST7735
#define SPI_READ_FREQUENCY  16000000
#define SPI_TOUCH_FREQUENCY 2500000  // Если есть touch (не нужно для ST7735)

// === Подсветка ===
#define TFT_BL   12  // Управление подсветкой через PWM

// === Настройки SD-карты (VSPI) ===
#define SD_CS    5  // GPIO5
#define SD_SCLK 18  // GPIO18
#define SD_MOSI 23  // GPIO23
#define SD_MISO 19  // GPIO19

// === Поддержка шрифтов ===
#define LOAD_GLCD    // Стандартный шрифт 5x7
#define LOAD_FONT2   // Шрифт 8x16
#define LOAD_FONT4   // Шрифт 16x26
#define LOAD_GFXFF   // Гибкие шрифты
#define SMOOTH_FONT  // Сглаженные шрифты

// === Поддержка JPEG с SD ===
#define LOAD_JPG

#endif

прошивка

#include <TFT_eSPI.h>
#include <TJpg_Decoder.h>
#include <SPI.h>
#include <SD.h>
TFT_eSPI tft = TFT_eSPI();
// Пины SD-карты
#define SD_CS 5
#define TFT_BL 12 // Подсветка
#define FRAME_COUNT 30 // Количество кадров в анимации
#define TARGET_FPS 25  // Целевая частота кадров
// Структура для хранения информации о кадрах
struct FrameInfo { uint16_t width; uint16_t height; String filename; };
FrameInfo frames[FRAME_COUNT];
bool framesLoaded = false;
uint32_t lastFrameTime = 0;
float frameDelay = 1000.0 / TARGET_FPS;
// Функция для вывода JPEG
bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t* bitmap) {
if (y >= tft.height()) return 0; tft.pushImage(x, y, w, h, bitmap); return 1; }
void loadFramesInfo() {
for(int i = 0; i < FRAME_COUNT; i++) {
char filename[20];
sprintf(filename, "/frame_%02d.jpg", i);
frames[i].filename = String(filename);
// Получаем размеры кадра заранее
TJpgDec.getSdJpgSize(&frames[i].width, &frames[i].height, filename);
}
framesLoaded = true;
Serial.println("Frames info loaded");
}
void setup() {
Serial.begin(115200);
// Настройка подсветки
pinMode(TFT_BL, OUTPUT);
digitalWrite(TFT_BL, HIGH);
// Инициализация дисплея
tft.init();
tft.setRotation(0);
tft.setSwapBytes(true);
tft.fillScreen(TFT_BLACK);
// Инициализация SD-карты
if (!SD.begin(SD_CS)) { Serial.println("SD Card Mount Failed"); while(1); }
// Настройка JPEG декодера
TJpgDec.setJpgScale(1);
TJpgDec.setCallback(tft_output);
// Предварительная загрузка информации о кадрах
loadFramesInfo();
Serial.println("Initialization done");
}

void loop() {
if(!framesLoaded) return;
static int currentFrame = 0;
uint32_t currentTime = millis();
uint32_t timeSinceLastFrame = currentTime - lastFrameTime;
// Пропускаем кадры, если отстаем
if(timeSinceLastFrame >= frameDelay) {
lastFrameTime = currentTime;
// Вычисляем позицию для центрирования
uint16_t x = (tft.width() - frames[currentFrame].width) / 2;
uint16_t y = (tft.height() - frames[currentFrame].height) / 2;
// Очищаем только область, где будет новое изображение
tft.fillRect(x, y, frames[currentFrame].width, frames[currentFrame].height, TFT_BLACK);
// Выводим JPEG
uint32_t start = micros();
TJpgDec.drawSdJpg(x, y, frames[currentFrame].filename.c_str());
uint32_t renderTime = micros() - start;
Serial.printf("Frame %d: %dx%d, pos(%d,%d), render %d μs\n", 
currentFrame, frames[currentFrame].width, frames[currentFrame].height, 
x, y, renderTime);
// Переход к следующему кадру
currentFrame = (currentFrame + 1) % FRAME_COUNT;
}
// Короткая задержка для стабильности
delay(1);
}

а помните кто то хотел так сделать ? не вы случайно ? он там оставил более качественные картинки, и должно лучше выйти, если есть ссылка на тему, оставьте пж

https://transfiles.ru/el6w6
не знаю куда сейчас выложить видео, придется скачать…

4 есп и можно не паять!)))

с охлаждением еще))

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

2 лайка

И по ножкам уложился без доп. логики. НО


А-а-а-а блин.

Ну немного перекос.

Видимо повезло, как мне с ST7735 :slight_smile:
По схеме просто CS на отдельные пины, но код его не смотрел, может многодисплейная библиотека :slight_smile:


…вот вариант красивых “надгробных часов”