Все те же часы

// Библиотека 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);
    }
  }
}

а вопрос в чем?

А это не вопрос, это - пахвастацца.

1 лайк


Не, без картинки не интересно :slight_smile:

1 лайк

а часы то, не вечные)))
миллис опять не настоящий подсунули!

Ну подумаешь, раз в пару месяцев заглючит ))

2 лайка

действительно, чай не луна 26))

1 лайк

Ну вот!, другой коленкор :slight_smile:

… Теперь придумываете “темы часов” разные и по кнопке перебор, к примеру, или по времени.

Прям вавилонские часы.

Тут тебе и арабские цифры, и римские, английский алфавит, европейская температура, интернациональное напряжение.

1 лайк

Вот и название первой темы - “Вавилонские часы” :slight_smile:

вот я и смотрю на календаре середина октября, а у ТС на часах еще сентябрь :slight_smile:

1 лайк

К стате, часы не ВСЕГДА запускаются с первого раза. Иногда приходится подключать (дергать) питание 2-4 раза. Такое впечатление, что мала задержка по Reset. Я уж и емкость до 5мкФ увеличил - не помогло. Может виноват этот миллис? Я про него прочитал, но никаких подозрений ОН не вызвал. Но если запустились, то идут нормально, ни каких сбоев. Я сарказм товарищей понимаю и принимаю. Попробуйте понять и меня. Летом дача: на родник за водой, травку подергаешь, дровец в баньку попилишь, поколешь - вроде занят и день прошел. А вот зимой взвоешь, вот и занимаюсь этой фигней.Всю жизнь занимался цифровой логикой ну и аналогом тоже управлять приходилось. Но там было все по взрослому, а это нервы, разочарованье. ну и победы, конечно. А здесь игрушки, и здоровице шалить стало тут помню там забыл и наоборот. Так что не судите строго, у вас все впереди. Извините если что не так.

Ну и отлично, можно другие проекты под железо-схему поискать. Я просто думал сами сделали.

:slight_smile:
Римские что?

Пишут, что цифра - символ для записи чисел. Их 7 : I, V, X, L, C, D, M. Следовательно их набор это число. Т.Е. IV это число уже 4 :slight_smile:

Они у Вас безбожно отстают.

Много потратил времени что бы вывести на ТФТ "цифры " в формате Float. все перебрал: отделял целую от десятичной и т д. Пока не понял, счетчик RTC считает в двоично-десятичном коде. Т.е. 3 Вольта ото код со счетчика АЦП 0000 0011 - целая часть, десятичная - старший 0.5, дальше 0.25 и т.д. в 2 раза меньше. А нужно иметь либо АСКИ код, либо символ “3” и т.д… После этого как понял, просто нашел функцию (наверное) которая это и делает переводит код в символ. Или все не так?

Теперь все нормально?