// Библиотека 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;
uint8_t Week;
boolean initial = 1, www = 1, vvv = 1;
void setup(void) {
Serial.begin(9600);
Wire.begin();
// rtc.set(20, 0, 23, 2, 7, 8, 24);
// uRTCLib::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.fillCircle(120, 120, 116, 0x4a4a); //круг
tft.fillCircle(120, 120, 114, ILI9341_BLACK); //стирание внутри круга
pinMode(PA6, INPUT_ANALOG); //выбираем канал АЦП6
// минуты черточки
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();
Week = rtc.dayOfWeek();
//tft.setTextColor(0xcdcd);
tft.setTextColor(ILI9341_YELLOW);
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;
Week++;
}
}
}
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.fillRect(60, 280, 90, 25, ILI9341_BLACK);
tft.setTextColor(ILI9341_WHITE);
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);
if (hh == 0 && mm == 0 && ss < 3 || vvv == 1) {
vvv = 0;
tft.fillRect(0, 0, 30, 25, ILI9341_BLACK);
if (Week > 7) Week = 1;
switch (Week) {
case 1:
tft.setTextColor(ILI9341_RED);
tft.drawCentreString("SUN", 0, 0, 2);
break;
case 2:
tft.setTextColor(ILI9341_WHITE);
tft.drawCentreString("MON", 0, 0, 2);
break;
case 3:
tft.setTextColor(ILI9341_WHITE);
tft.drawCentreString("TUE", 0, 0, 2);
break;
case 4:
tft.setTextColor(ILI9341_WHITE);
tft.drawCentreString("WED", 0, 0, 2);
break;
case 5:
tft.setTextColor(ILI9341_WHITE);
tft.drawCentreString("THU", 0, 0, 2);
break;
case 6:
tft.setTextColor(ILI9341_WHITE);
tft.drawCentreString("FRI", 0, 0, 2);
break;
case 7:
tft.setTextColor(ILI9341_GREEN);
tft.drawCentreString("SAT", 0, 0, 2);
break;
}
}
}
tft.fillRect(150, 250, 30, 25, ILI9341_BLACK);
tft.drawNumber(ss / 10, 150, 250, 4);
tft.drawNumber(ss % 10, 165, 250, 4);
if (ss == 0 || ss == 30 && (ss < 4 || ss < 34 )) { //каждые 30 секунд
int value = 0; //переменная (локальная)= 0, она может быть определена в начале программы(глоиальная)
value = analogRead( PA6 ); //читаем данные АЦП
float val = value * (5.50 / 4095.0 ); //ввод аналогового сигнала от 0 до 4095 (от 0 до 5.5 В)
tft.fillRect(0, 250, 50, 25, ILI9341_BLACK); //clear места на экране
if ( val > 3.50) tft.setTextColor(ILI9341_GREEN); //по необходимости
else if ( val >= 3.35) tft.setTextColor(ILI9341_YELLOW); //
else if ( val < 3.35 ) tft.setTextColor(ILI9341_RED); //
char c1[] = { 0 }; //создаем масив
dtostrf(val, 1, 2, c1); //конвертируем floft -> char
tft.drawCentreString(c1, 0, 250, 2); //выводим как char
tft.drawCentreString("V", 35, 250, 2);
}
}
}
|