// Библиотека 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);
}
}
}
а вопрос в чем?
А это не вопрос, это - пахвастацца.
а часы то, не вечные)))
миллис опять не настоящий подсунули!
Ну подумаешь, раз в пару месяцев заглючит ))
действительно, чай не луна 26))
Ну вот!, другой коленкор
… Теперь придумываете “темы часов” разные и по кнопке перебор, к примеру, или по времени.
Прям вавилонские часы.
Тут тебе и арабские цифры, и римские, английский алфавит, европейская температура, интернациональное напряжение.
Вот и название первой темы - “Вавилонские часы”
вот я и смотрю на календаре середина октября, а у ТС на часах еще сентябрь
К стате, часы не ВСЕГДА запускаются с первого раза. Иногда приходится подключать (дергать) питание 2-4 раза. Такое впечатление, что мала задержка по Reset. Я уж и емкость до 5мкФ увеличил - не помогло. Может виноват этот миллис? Я про него прочитал, но никаких подозрений ОН не вызвал. Но если запустились, то идут нормально, ни каких сбоев. Я сарказм товарищей понимаю и принимаю. Попробуйте понять и меня. Летом дача: на родник за водой, травку подергаешь, дровец в баньку попилишь, поколешь - вроде занят и день прошел. А вот зимой взвоешь, вот и занимаюсь этой фигней.Всю жизнь занимался цифровой логикой ну и аналогом тоже управлять приходилось. Но там было все по взрослому, а это нервы, разочарованье. ну и победы, конечно. А здесь игрушки, и здоровице шалить стало тут помню там забыл и наоборот. Так что не судите строго, у вас все впереди. Извините если что не так.
Ну и отлично, можно другие проекты под железо-схему поискать. Я просто думал сами сделали.
Римские что?
Пишут, что цифра - символ для записи чисел. Их 7 : I, V, X, L, C, D, M. Следовательно их набор это число. Т.Е. IV это число уже 4
Они у Вас безбожно отстают.
Много потратил времени что бы вывести на ТФТ "цифры " в формате Float. все перебрал: отделял целую от десятичной и т д. Пока не понял, счетчик RTC считает в двоично-десятичном коде. Т.е. 3 Вольта ото код со счетчика АЦП 0000 0011 - целая часть, десятичная - старший 0.5, дальше 0.25 и т.д. в 2 раза меньше. А нужно иметь либо АСКИ код, либо символ “3” и т.д… После этого как понял, просто нашел функцию (наверное) которая это и делает переводит код в символ. Или все не так?
Теперь все нормально?