Используя плату STM32 на базе микроконтроллера STM32F103C8T6, TFT дисплей 320×240 SPI и модуль часов реального времени DS3231 можно собрать простые часы имитирующее работу стрелочный часов. Так же в правом верхнем углу экрана отображается температура (DS3231).
Часы реального времени питаются от напряжения 3,3 В, обмен данным происходит посредством шины I2C.
Для установки времени раскомментируйте строку:
// rtc.set(30, 41, 18, 2, 17, 12, 19); // сек мин час д.н дата мес год
Далее залейте скетч, потом закомментируйте сроку и залейте скетч повторно.
Перед заливкой скетча в STM32 Вам необходимо ознакомиться со следующими статьями:
Так же Вам понадобится дополнительная библиотеки — https://github.com/Naguissa/uRTCLib.git и Adafruit_GFX.zip
Схема подключения
// Библиотека Arduino_STM32-master.zip #include <Wire.h> #include <uRTCLib.h>//https://github.com/Naguissa/uRTCLib.git #include <Adafruit_GFX_AS.h> #include <Adafruit_ILI9341_STM.h> #include <SPI.h> uRTCLib rtc(0x68); Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(PA1,PA2,PA3); // cs, dc, rst Mosi - PA7, SCK - PA5 float sx = 0, sy = 1, mx = 1, my = 0, hx = -1, hy = 0; float sdeg=0, mdeg=0, hdeg=0; uint16_t osx=120, osy=120, omx=120, omy=120, ohx=120, ohy=120; uint16_t x00=0, x11=0, y00=0, y11=0; uint32_t targetTime = 0; uint32_t hh, mm, ss; boolean initial = 1,www=1; void setup(void) {Serial.begin(9600); Wire.begin(); //rtc.set(30, 41, 18, 2, 17, 12, 19); // RTCLib::set(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) tft.begin();tft.setRotation(2); tft.fillScreen(ILI9341_BLACK); tft.setTextColor(ILI9341_WHITE); tft.drawCentreString("STM32",0,0,2); tft.fillCircle(120, 120, 116, 0x4a4a); tft.fillCircle(120, 120, 114, ILI9341_BLACK); // минуты черточки for(int i = 0; i<360; i+= 30) { sx = cos((i-90)*0.0174532925); sy = sin((i-90)*0.0174532925); x00 = sx*113+120; y00 = sy*113+120; x11 = sx*100+120; y11 = sy*100+120; tft.drawLine(x00, y00, x11, y11, ILI9341_WHITE); } // секунды черточки for(int i = 0; i<360; i+= 6) { sx = cos((i-90)*0.0174532925); sy = sin((i-90)*0.0174532925); x00 = sx*102+120; y00 = sy*102+120; // Draw minute markers tft.drawPixel(x00, y00, ILI9341_WHITE); } tft.fillCircle(120, 121, 3, ILI9341_WHITE); targetTime = millis() + 1000; } void loop() { rtc.refresh(); if (targetTime < millis()) { hh = rtc.hour(); mm = rtc.minute(); ss = rtc.second(); tft.setTextColor(0xcdcd); tft.drawCentreString("XII",120,25,2); tft.drawCentreString("IX",32,112,2); tft.drawCentreString("VI",122,200,2); tft.drawCentreString("III",210,112,2); tft.setTextColor(ILI9341_WHITE); targetTime = millis()+1000; ss++;if (ss==60){ss=0;mm++;if(mm>59){mm=0;hh++;if (hh>23){hh=0;}}} sdeg = ss*6; mdeg = mm*6+sdeg*0.01666667; hdeg = hh*30+mdeg*0.0833333; hx = cos((hdeg-90)*0.0174532925); hy = sin((hdeg-90)*0.0174532925); mx = cos((mdeg-90)*0.0174532925); my = sin((mdeg-90)*0.0174532925); sx = cos((sdeg-90)*0.0174532925); sy = sin((sdeg-90)*0.0174532925); if (ss==0 || initial) { initial = 0; tft.drawLine(ohx, ohy, 120, 121, ILI9341_BLACK); ohx = hx*62+121; ohy = hy*62+121; tft.drawLine(omx, omy, 120, 121, ILI9341_BLACK); omx = mx*84+120; omy = my*84+120; } tft.drawLine(osx, osy, 120, 120, ILI9341_BLACK); osx = sx*90+120; osy = sy*90+120; tft.drawLine(osx, osy, 120, 120, ILI9341_RED); tft.drawLine(ohx, ohy, 120, 121, ILI9341_WHITE); tft.drawLine(omx, omy, 120, 121, ILI9341_WHITE); tft.drawLine(osx, osy, 120, 120, ILI9341_RED); tft.fillCircle(120, 121, 3, ILI9341_RED); if(ss==0||www==1){www=0; tft.fillRect(60,250,90,25,ILI9341_BLACK); tft.setTextColor(ILI9341_WHITE); tft.drawNumber(hh/10,60,250,4);tft.drawNumber(hh%10,75,250,4); tft.drawCentreString(":",97,250,4); tft.drawNumber(mm/10,105,250,4);tft.drawNumber(mm%10,120,250,4); tft.drawCentreString(":",141,250,4); tft.drawNumber(rtc.day()/10,60,280,4);tft.drawNumber(rtc.day()%10,75,280,4); tft.drawCentreString("/",97,280,4); tft.drawNumber(rtc.month()/10,105,280,4);tft.drawNumber(rtc.month()%10,120,280,4); tft.drawCentreString("/",141,280,4); tft.drawNumber(rtc.year()/10,150,280,4);tft.drawNumber(rtc.year()%10,165,280,4); tft.fillRect(200,0,30,25,ILI9341_BLACK); tft.drawNumber(rtc.temp() / 100,200,0,2);tft.drawCentreString(" C",220,0,2); } tft.fillRect(150,250,30,25,ILI9341_BLACK); tft.drawNumber(ss/10,150,250,4);tft.drawNumber(ss%10,165,250,4); } }
Привет. Решил повторить этот проект.Но . При компиляции возникает проблема с библиотекой \Users\vic\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.1.17\libraries\SPI
exit status 1
Какая версия Arduino IDE?
Версия последняя.Если возможно Ваш скетч и библиотеки мне на почту. Это реально ?
Библиотеки для STM32 и TFT ставить не надо, они устанавливаются при добавлении платы в Arduino IDE — http://rcl-radio.ru/?p=68376
Данный скетч программа наконец то пропустила ,но пришлось указать что stm32 20k ram 128 fl.
Как Вы поставили библиотеку? Просто добавили ZIP библиотеку?
Да
Не сейчас . Сейчас на работе. Как описано ,установка из zip файла.
А много тут будет переделок для дисплея tm1637. Если возможно то доработку сюда.
Вам нужно просто часы на TM1637 + ds3231?
Да + stm32 , а то лежит без дела.
может тут что найдёшь http://rcl-radio.ru/?p=45882