Часы STM32 + TFT-дисплей SPI 320×240 + DS3231 (Arduino IDE)

Используя плату 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);
  }
}
 

Comments

  1. Привет. Решил повторить этот проект.Но . При компиляции возникает проблема с библиотекой \Users\vic\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.1.17\libraries\SPI
    exit status 1

Добавить комментарий

Войти с помощью: