#1 08-01-2022 13:50:54

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Часы из старого VGA монитора и ESP32.

Часы на базе  VGA монитора, ESP32 , старинной мышки и библиотеки FABGL. Часы автономные, хоть и используют формат NTP времени. Время считает сам процессор, синхронизации по сети пока нет. Время устанавливается мышкой. Наводим курсор мышки на поле часов и крутим колесо, минуты - в поле минут курсор мышки и крутим колесо.

Не в сети

#2 08-01-2022 13:54:41

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Часы из старого VGA монитора и ESP32.

16416248085193444392919339822350.jpg

16416248613232017280966445862185.jpg

Не в сети

#3 08-01-2022 16:36:36

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Часы из старого VGA монитора и ESP32.

Код.

#include <ESPxxTime.h>
ESPxxTime rtc;
#include <stdio.h>
#include <math.h>
#include <Arduino.h>
#include <displaycontroller.h>
#include "fabgl.h"
fabgl::VGAController VGAController;
fabgl::Canvas        canvas(&VGAController);
fabgl::PS2Controller PS2Controller;
int indicatorX = 0;
int indicatorY = 0;
int cursor     = 0;
uint8_t  R,G,B;
////////////////////////////////////////////////////////////////
byte flagHOUR=0;
byte flagMIN=0;
char SE[5]="";
char SEC[2]="";
char MIN[2]="";
char H[2]="";
uint32_t lastTime;   
void showCursorPos(MouseStatus const & status)
{ canvas.setPenColor(Color::Yellow);
  canvas.setBrushColor(Color::Black);
  canvas.drawTextFmt(indicatorX, indicatorY, " %d %d ", status.X, status.Y);}
void printLocalTime() {
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
  //  Serial.println("Failed to obtain time");
    return;
  }
 // Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}  
void setup()
{
// Serial.begin(115200);
  rtc.setTime(55, 58, 22, 7, 1, 2022);  //sec,min,hour,дата,месяц,год 
  VGAController.begin();
  VGAController.setResolution(VGA_640x400_70Hz);
  // Setup mouse
  PS2Controller.begin();
  PS2Controller.mouse()->setupAbsolutePositioner(canvas.getWidth(), canvas.getHeight(), true, &VGAController);
  cursor=3;
  VGAController.setMouseCursor((CursorName)cursor);
  canvas.setBrushColor(Color::Black);
  canvas.clear();
  canvas.selectFont(&fabgl::FONT_10x20);
  canvas.setGlyphOptions(GlyphOptions().FillBackground(true));
  showCursorPos(PS2Controller.mouse()->status());
//canvas.setPenColor(Color::BrightBlue);//цвет рамки
//canvas.drawRectangle(1, 1, 639, 399);//рамка
//canvas.drawRectangle(1, 20, 140, 340);//прямогуольник первого разряда
//canvas.drawRectangle(160, 20, 300, 340);
//canvas.drawRectangle(340, 20, 480, 340);
//canvas.drawRectangle(500, 20, 639, 340);//прямогуольник четвёртого разряда
//canvas.drawRectangle(0, 190, 639, 190);//средняя линия
//  canvas.drawEllipse (320, 100, 20, 20);  //верхняя точка двоеточия
//  canvas.drawEllipse (320, 260, 20, 20);  //нижняя точка двоеточия
  ShowTIME();
}
void ShowTIME(){
  ////////ОТОБРАЖАЕМ ЧАСЫ ДО 9///
if (rtc.getHour(true)<10){
  Dig(rtc.getHour(true),2);
  Dig(0,1);
  flagHOUR=1;
} 
////////ОТОБРАЖАЕМ ЧАСЫ БОЛЬШЕ 9///
if (rtc.getHour(true)>=10){
// if (rtc.getHour(true)>=10 and rtc.getSecond()==0 and flagMIN==0) {
    Dig(floor(rtc.getHour(true)/10.0),1);
    Dig(rtc.getHour(true)-floor((rtc.getHour(true)/10.0))*10.0,2);
 flagHOUR=1;
  } 
////////ОТОБРАЖАЕМ МИНУТЫ ДО 9///
if (rtc.getMinute()<10 and flagMIN==0){
  Dig(rtc.getMinute(),4);
  Dig(0,3);
flagMIN=1;
  }   
////////ОТОБРАЖАЕМ МИНУТЫ БОЛЬШЕ 9///
 if (rtc.getMinute()>=10 and flagMIN==0) {
  // Serial.println(floor(rtc.getMinute()/10.0));
    Dig(floor(rtc.getMinute()/10.0),3);
    Dig(rtc.getMinute()-floor((rtc.getMinute()/10.0))*10.0,4);
 flagMIN=1;
  }
}
void Dig(int NUM,int POS){
canvas.setBrushColor(RGB888(0,0,0));//цвет залитого прямоугольника
if (POS==4)canvas.fillRectangle(500, 20, 639, 340);//очищаем прямогуольник четвёртого разряда
if (POS==3)canvas.fillRectangle(340, 20, 480, 340);//очищаем прямогуольник третьего разряда
if (POS==2)canvas.fillRectangle(160, 20, 300, 340);//очищаем прямогуольник второго разряда
if (POS==1)canvas.fillRectangle(1, 20, 140, 340);//очищаем прямогуольник первого разряда
//canvas.clear();
canvas.setBrushColor(RGB888(0,255,0));//цвет залитого прямоугольника
 canvas.fillEllipse (320, 100, 20, 20);  //ДВОЕТОЧИЕ
  canvas.fillEllipse (320, 260, 20, 20); //ДВОЕТОЧИЕ
 if (NUM==0){
    if (POS==1){canvas.fillRectangle(0, 20, 140, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(20, 40, 120, 320);}
  if (POS==2){canvas.fillRectangle(160, 20, 300, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(180, 40, 280, 320);}
 if (POS==3){canvas.fillRectangle(340, 20, 480, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(360, 40, 460, 320);}
 if (POS==4){canvas.fillRectangle(500, 20, 640, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(520, 40, 620, 320);}
  }
 if (NUM==1){
   if (POS==1)canvas.fillRectangle(120, 20, 140, 340);//B+C 1 залитый прямоугольник 
   if (POS==2)canvas.fillRectangle(280, 20, 300, 340);//B+C 2
   if (POS==3)canvas.fillRectangle(460, 20, 480, 340);//B+C 3
   if (POS==4)canvas.fillRectangle(620, 20, 640, 340);//B+C 4
 }
 if (NUM==2){
  if (POS==1){canvas.fillRectangle(0, 20, 140, 40);//A1
              canvas.fillRectangle(0, 170, 140, 190);//G1
              canvas.fillRectangle(0, 320, 140, 340);//D1
  canvas.fillRectangle(120, 20, 140, 170);//B1
  canvas.fillRectangle(0,170, 20, 340);//E1
  }
if (POS==2){canvas.fillRectangle(160, 20, 300, 40);//A2
              canvas.fillRectangle(160, 170, 300, 190);//G2
              canvas.fillRectangle(160, 320, 300, 340);//D2
  canvas.fillRectangle(280, 20, 300, 170);//B2
  canvas.fillRectangle(160,170, 180, 340);//E2
  }
if (POS==3){canvas.fillRectangle(340, 20, 480, 40);//A3
              canvas.fillRectangle(340, 170, 480, 190);//G3
              canvas.fillRectangle(340, 320, 480, 340);//D3
  canvas.fillRectangle(460, 20, 480, 170);//B3
  canvas.fillRectangle(340,170, 360, 340);//E3
  }
if (POS==4){canvas.fillRectangle(500, 20, 640, 40);//A4
              canvas.fillRectangle(500, 170, 640, 190);//G4
              canvas.fillRectangle(500, 320, 640, 340);//D4
  canvas.fillRectangle(620, 20, 640, 170);//B4
  canvas.fillRectangle(500,170, 520, 340);//E4
  }
 }
if (NUM==3){
  if (POS==1){
  canvas.fillRectangle(0, 20, 140, 40);//A1
              canvas.fillRectangle(0, 170, 140, 190);//G1
              canvas.fillRectangle(0, 320, 140, 340);//D1
  canvas.fillRectangle(120, 20, 140, 340);//B+C 1
  }
 if (POS==2){canvas.fillRectangle(160, 20, 300, 40);//A2
              canvas.fillRectangle(160, 170, 300, 190);//G2
              canvas.fillRectangle(160, 320, 300, 340);//D2
   canvas.fillRectangle(280, 20, 300, 340); //B+C 2          
 }
 if (POS==3){canvas.fillRectangle(340, 20, 480, 40);//A3
              canvas.fillRectangle(340, 170, 480, 190);//G3
              canvas.fillRectangle(340, 320, 480, 340);//D3
   canvas.fillRectangle(460, 20, 480, 340); //B+C 3          
 }
if (POS==4){canvas.fillRectangle(500, 20, 640, 40);//A4
              canvas.fillRectangle(500, 170, 640, 190);//G4
              canvas.fillRectangle(500, 320, 640, 340);//D4
  canvas.fillRectangle(620, 20, 640, 340);//B+C 4          
 }
 }
if (NUM==4){
  if (POS==1){canvas.fillRectangle(0, 170, 140, 190);//G1
              canvas.fillRectangle(120, 20, 140, 340);//B+C 1
              canvas.fillRectangle(0, 20, 20, 190);//F1
              }
if (POS==2){canvas.fillRectangle(160, 170, 300, 190);//G2
            canvas.fillRectangle(280, 20, 300, 340);//B+C 2
              canvas.fillRectangle(160, 20, 180, 190);//F2
}
if (POS==3){canvas.fillRectangle(340, 170, 480, 190);//G3
            canvas.fillRectangle(460, 20, 480, 340);//B+C 3
              canvas.fillRectangle(340, 20, 360, 190);//F3
}
if (POS==4){canvas.fillRectangle(500, 170, 640, 190);//G4
            canvas.fillRectangle(620, 20, 640, 340);//B+C 4
              canvas.fillRectangle(500, 20, 520, 190);//F4
}
}
if (NUM==5){
  if (POS==1){canvas.fillRectangle(0, 20, 140, 40);//A1
              canvas.fillRectangle(0, 170, 140, 190);//G1
              canvas.fillRectangle(0, 320, 140, 340);//D1
              canvas.fillRectangle(0, 20, 20, 190);//F1
              canvas.fillRectangle(120, 190, 140, 340);//C1
  }
 if (POS==2){canvas.fillRectangle(160, 20, 300, 40);//A2
              canvas.fillRectangle(160, 170, 300, 190);//G2
              canvas.fillRectangle(160, 320, 300, 340);//D2
           canvas.fillRectangle(160, 20, 180, 190);//F2
 canvas.fillRectangle(280, 190, 300, 340);//C2
 }
 if (POS==3){canvas.fillRectangle(340, 20, 480, 40);//A3
              canvas.fillRectangle(340, 170, 480, 190);//G3
              canvas.fillRectangle(340, 320, 480, 340);//D3
        canvas.fillRectangle(340, 20, 360, 190);//F3
canvas.fillRectangle(460, 190, 480, 340);//C3
 }
if (POS==4){canvas.fillRectangle(500, 20, 640, 40);//A4
              canvas.fillRectangle(500, 170, 640, 190);//G4
              canvas.fillRectangle(500, 320, 640, 340);//D4
    canvas.fillRectangle(500, 20, 520, 190);//F4
 canvas.fillRectangle(620, 190, 640, 340);//C3
 }
}
if (NUM==6){
  if (POS==1){canvas.fillRectangle(0, 20, 140, 40);//A1
              canvas.fillRectangle(0, 170, 140, 190);//G1
              canvas.fillRectangle(0, 320, 140, 340);//D1
              canvas.fillRectangle(0, 20, 20, 340);//FE1
              canvas.fillRectangle(120, 190, 140, 340);//C1
  }
 if (POS==2){canvas.fillRectangle(160, 20, 300, 40);//A2
              canvas.fillRectangle(160, 170, 300, 190);//G2
              canvas.fillRectangle(160, 320, 300, 340);//D2
           canvas.fillRectangle(160, 20, 180, 340);//FE2
 canvas.fillRectangle(280, 190, 300, 340);//C2
 }
 if (POS==3){canvas.fillRectangle(340, 20, 480, 40);//A3
              canvas.fillRectangle(340, 170, 480, 190);//G3
              canvas.fillRectangle(340, 320, 480, 340);//D3
        canvas.fillRectangle(340, 20, 360, 340);//FE3
canvas.fillRectangle(460, 190, 480, 340);//C3
 }
if (POS==4){canvas.fillRectangle(500, 20, 640, 40);//A4
              canvas.fillRectangle(500, 170, 640, 190);//G4
              canvas.fillRectangle(500, 320, 640, 340);//D4
    canvas.fillRectangle(500, 20, 520, 340);//FE4
 canvas.fillRectangle(620, 190, 640, 340);//C3
 }
}
if (NUM==7){
  if (POS==1){canvas.fillRectangle(0, 20, 140, 40);//A1
              canvas.fillRectangle(120, 20, 140, 340);//B+C 1
  }
 if (POS==2){canvas.fillRectangle(160, 20, 300, 40);//A2
               canvas.fillRectangle(280, 20, 300, 340);//B+C 2
 }
 if (POS==3){canvas.fillRectangle(340, 20, 480, 40);//A3
              canvas.fillRectangle(460, 20, 480, 340);//B+C 3
 }
if (POS==4){canvas.fillRectangle(500, 20, 640, 40);//A4
             canvas.fillRectangle(620, 20, 640, 340);//B+C 4
 }
}
 if (NUM==8){
    if (POS==1){canvas.fillRectangle(0, 20, 140, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(20, 40, 120, 320);
                canvas.setBrushColor(RGB888(0,255,0));
                canvas.fillRectangle(0, 170, 140, 190);//G1
    }
  if (POS==2){canvas.fillRectangle(160, 20, 300, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(180, 40, 280, 320);
                canvas.setBrushColor(RGB888(0,255,0));
                canvas.fillRectangle(160, 170, 300, 190);//G2
                }
 if (POS==3){canvas.fillRectangle(340, 20, 480, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(360, 40, 460, 320);
                canvas.setBrushColor(RGB888(0,255,0));
                canvas.fillRectangle(340, 170, 480, 190);//G3
                }
 if (POS==4){canvas.fillRectangle(500, 20, 640, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(520, 40, 620, 320);
                canvas.setBrushColor(RGB888(0,255,0));
                canvas.fillRectangle(500, 170, 640, 190);//G4
                }
 }
if (NUM==9){
  if (POS==1){
  canvas.fillRectangle(0, 20, 140, 40);//A1
              canvas.fillRectangle(0, 170, 140, 190);//G1
              canvas.fillRectangle(0, 320, 140, 340);//D1
  canvas.fillRectangle(120, 20, 140, 340);//B+C 1
  canvas.fillRectangle(0, 20, 20, 190);//F1
  }
 if (POS==2){canvas.fillRectangle(160, 20, 300, 40);//A2
              canvas.fillRectangle(160, 170, 300, 190);//G2
              canvas.fillRectangle(160, 320, 300, 340);//D2
   canvas.fillRectangle(280, 20, 300, 340); //B+C 2          
 canvas.fillRectangle(160, 20, 180, 190);//F2
 }
 if (POS==3){canvas.fillRectangle(340, 20, 480, 40);//A3
              canvas.fillRectangle(340, 170, 480, 190);//G3
              canvas.fillRectangle(340, 320, 480, 340);//D3
   canvas.fillRectangle(460, 20, 480, 340); //B+C 3          
 canvas.fillRectangle(340, 20, 360, 190);//F3
 }
if (POS==4){canvas.fillRectangle(500, 20, 640, 40);//A4
              canvas.fillRectangle(500, 170, 640, 190);//G4
              canvas.fillRectangle(500, 320, 640, 340);//D4
  canvas.fillRectangle(620, 20, 640, 340);//B+C 4          
 canvas.fillRectangle(500, 20, 520, 190);//F4
 }
 }
}
void sec(){
   if(millis() - lastTime >= 998) {
sprintf(SE, "%s",String(millis() - lastTime)+" ");
      lastTime = millis();
      flagMIN=0;
      flagHOUR=0;
    }
sprintf(H, "%s",String(rtc.getHour(true)));
//canvas.drawTextFmt(5,380,H);
sprintf(MIN, "%s",String(rtc.getMinute()));
//canvas.drawTextFmt(50,380,MIN);
sprintf(SEC, "%s",String(rtc.getSecond())+"  ");
//canvas.drawTextFmt(150,380,SEC);
//canvas.drawTextFmt(550,380,SE);
////////ОТОБРАЖАЕМ ЧАСЫ ДО 9///
if (rtc.getHour(true)<10 and rtc.getMinute()==0 and rtc.getSecond()==0 and flagHOUR==0){
  Dig(rtc.getHour(true),2);
  Dig(0,1);
  flagHOUR=1;
} 
////////ОТОБРАЖАЕМ ЧАСЫ БОЛЬШЕ 9///
if (rtc.getHour(true)>=10 and rtc.getMinute()==0 and rtc.getSecond()==0 and flagHOUR==0){
    Dig(floor(rtc.getHour(true)/10.0),1);
    Dig(rtc.getHour(true)-floor((rtc.getHour(true)/10.0))*10.0,2);
 flagHOUR=1;}
////////ОТОБРАЖАЕМ МИНУТЫ ДО 9///
if (rtc.getMinute()<10 and rtc.getSecond()==0 and flagMIN==0){
  Dig(rtc.getMinute(),4);
  Dig(0,3);
flagMIN=1;}   
////////ОТОБРАЖАЕМ МИНУТЫ БОЛЬШЕ 9///
 if (rtc.getMinute()>=10 and rtc.getSecond()==0 and flagMIN==0) {
    Dig(floor(rtc.getMinute()/10.0),3);
    Dig(rtc.getMinute()-floor((rtc.getMinute()/10.0))*10.0,4);
 flagMIN=1;
  }
}
void loop()
{
sec();
///////////////////////////////////////  
 MouseStatus status = PS2Controller.mouse()->getNextStatus(0); // 0 = NO blocking operation
//MouseStatus status = PS2Controller.mouse()->getNextStatus(-1); // -1 = blocking operation
  // Обработка нажатия левой кнопки мыши
  if (status.buttons.left) {
showCursorPos(status);
//////////////////если курсор на поле минут и нажата правая кнопка мыши///////////////
 if (status.X<640 and status.X>340 and status.Y>20 and status.Y<340 and rtc.getMinute()>0){ 
  rtc.setTime(0, rtc.getMinute()-1, rtc.getHour(true), 7, 1, 2022);  //sec,min,hour,дата,месяц,год 
 sec();
 }
  }
  // Обработка нажатия правой кнопки мыши
  if (status.buttons.right) {
  if (status.X<640 and status.X>340 and status.Y>20 and status.Y<340 and rtc.getMinute()<60){ 
  rtc.setTime(0, rtc.getMinute()+1, rtc.getHour(true), 7, 1, 2022);  //sec,min,hour,дата,месяц,год 
 sec();
  }
  }
  // Обработка нажатия средней кнопки мыши
  if (status.buttons.middle) {
  }
  // Обработка вращения колеса мыши
  if (status.wheelDelta != 0) {
  //  indicatorY = fabgl::tclamp(indicatorY + status.wheelDelta, 0, canvas.getHeight() - 16);
    PS2Controller.mouse()->status().wheelDelta = 0;
if (status.X<300 and status.X>20 and status.Y>20 and status.Y<340){ 
 rtc.setTime(0, rtc.getMinute(), rtc.getHour(true)+(status.wheelDelta*-1), 7, 1, 2022);  //sec,min,hour,дата,месяц,год 
ShowTIME();
}
 if (status.X<640 and status.X>340 and status.Y>20 and status.Y<340){ 
 rtc.setTime(0, rtc.getMinute()+(status.wheelDelta*-1), rtc.getHour(true), 7, 1, 2022);  //sec,min,hour,дата,месяц,год 
ShowTIME();
}
  }
// showCursorPos(status);
}

Не в сети

#4 08-01-2022 16:40:51

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Часы из старого VGA монитора и ESP32.

Код немного корявенький, цифры рисовал прямоугольниками. Не особо хотелось запариватЬся с векторной графикой. Однако, всё работает. Вообще, в прогУ встроен стандартный временной календарь, по средствам библиотеки  ESPxxTime.h
Полезная библиотека. Спасибо камраду 3tawi за его труд.
https://github.com/3tawi/ESPxxTime
В будущем, планирую сделать синхронизацию времени по сети.

Не в сети

#5 08-01-2022 16:52:13

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Часы из старого VGA монитора и ESP32.

Цифры рисовал прямоугольниками как семисегментный индикатор.

7.png

В этом куске кода, рисуем два в  третьем разряде. Нумерация разрядов 1..4
canvas.fillRectangle(340, 20, 480, 40);//A3
canvas.fillRectangle(340, 170, 480, 190);//G3
canvas.fillRectangle(340, 320, 480, 340);//D3
canvas.fillRectangle(460, 20, 480, 170);//B3
canvas.fillRectangle(340,170, 360, 340);//E3

Не в сети

#6 08-01-2022 18:51:47

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Часы из старого VGA монитора и ESP32.

Код часов, с прогрессбаром секунд и эффектом "ржавения" изображения.

#include <ESPxxTime.h>
ESPxxTime rtc;
#include <stdio.h>
#include <math.h>
#include <Arduino.h>
#include <displaycontroller.h>
#include "fabgl.h"
fabgl::VGAController VGAController;
fabgl::Canvas        canvas(&VGAController);
fabgl::PS2Controller PS2Controller;
int indicatorX = 0;
int indicatorY = 0;
int cursor     = 0;
uint8_t  R,G,B;
////////////////////////////////////////////////////////////////
byte flagHOUR=0;
byte flagMIN=0;
char SE[5]="";
char SEC[2]="";
char MIN[2]="";
char H[2]="";
uint32_t lastTime;   
void showCursorPos(MouseStatus const & status)
{ canvas.setPenColor(Color::Yellow);
  canvas.setBrushColor(Color::Black);
  canvas.drawTextFmt(indicatorX, indicatorY, " %d %d ", status.X, status.Y);}
void printLocalTime() {
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
  //  Serial.println("Failed to obtain time");
    return;
  }
 // Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}  
void setup()
{
// Serial.begin(115200);
  rtc.setTime(55, 58, 22, 7, 1, 2022);  //sec,min,hour,дата,месяц,год 
  VGAController.begin();
  VGAController.setResolution(VGA_640x400_70Hz);
  // Setup mouse
  PS2Controller.begin();
  PS2Controller.mouse()->setupAbsolutePositioner(canvas.getWidth(), canvas.getHeight(), true, &VGAController);
  cursor=3;
  VGAController.setMouseCursor((CursorName)cursor);
  canvas.setBrushColor(Color::Black);
  canvas.clear();
  canvas.selectFont(&fabgl::FONT_10x20);
  canvas.setGlyphOptions(GlyphOptions().FillBackground(true));
  showCursorPos(PS2Controller.mouse()->status());
//canvas.setPenColor(Color::BrightBlue);//цвет рамки
//canvas.drawRectangle(1, 1, 639, 399);//рамка
//canvas.drawRectangle(1, 20, 140, 340);//прямогуольник первого разряда
//canvas.drawRectangle(160, 20, 300, 340);
//canvas.drawRectangle(340, 20, 480, 340);
//canvas.drawRectangle(500, 20, 639, 340);//прямогуольник четвёртого разряда
//canvas.drawRectangle(0, 190, 639, 190);//средняя линия
//  canvas.drawEllipse (320, 100, 20, 20);  //верхняя точка двоеточия
//  canvas.drawEllipse (320, 260, 20, 20);  //нижняя точка двоеточия
  ShowTIME();
}
//////////////////////////////////////////////////////////////////
void effects(){
   int X=random(640);int Y=random(360);
   if (canvas.getPixel( X,Y)== RGB888(0,255,0)){
    canvas.setPixel(X,Y,RGB888(0,random(155),0));
    }
}

void ShowTIME(){
  ////////ОТОБРАЖАЕМ ЧАСЫ ДО 9///
if (rtc.getHour(true)<10){
  Dig(rtc.getHour(true),2);
  Dig(0,1);
  flagHOUR=1;
} 
////////ОТОБРАЖАЕМ ЧАСЫ БОЛЬШЕ 9///
if (rtc.getHour(true)>=10){
// if (rtc.getHour(true)>=10 and rtc.getSecond()==0 and flagMIN==0) {
    Dig(floor(rtc.getHour(true)/10.0),1);
    Dig(rtc.getHour(true)-floor((rtc.getHour(true)/10.0))*10.0,2);
 flagHOUR=1;
  } 
////////ОТОБРАЖАЕМ МИНУТЫ ДО 9///
if (rtc.getMinute()<10 and flagMIN==0){
  Dig(rtc.getMinute(),4);
  Dig(0,3);
flagMIN=1;
  }   
////////ОТОБРАЖАЕМ МИНУТЫ БОЛЬШЕ 9///
 if (rtc.getMinute()>=10 and flagMIN==0) {
  // Serial.println(floor(rtc.getMinute()/10.0));
    Dig(floor(rtc.getMinute()/10.0),3);
    Dig(rtc.getMinute()-floor((rtc.getMinute()/10.0))*10.0,4);
 flagMIN=1;
  }
}
void Dig(int NUM,int POS){
canvas.setBrushColor(RGB888(0,0,0));//цвет залитого прямоугольника
if (POS==4)canvas.fillRectangle(500, 20, 639, 340);//очищаем прямогуольник четвёртого разряда
if (POS==3)canvas.fillRectangle(340, 20, 480, 340);//очищаем прямогуольник третьего разряда
if (POS==2)canvas.fillRectangle(160, 20, 300, 340);//очищаем прямогуольник второго разряда
if (POS==1)canvas.fillRectangle(1, 20, 140, 340);//очищаем прямогуольник первого разряда
//canvas.clear();
canvas.setBrushColor(RGB888(0,255,0));//цвет залитого прямоугольника
 canvas.fillEllipse (320, 100, 20, 20);  //ДВОЕТОЧИЕ
  canvas.fillEllipse (320, 260, 20, 20); //ДВОЕТОЧИЕ
 if (NUM==0){
    if (POS==1){canvas.fillRectangle(0, 20, 140, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(20, 40, 120, 320);}
  if (POS==2){canvas.fillRectangle(160, 20, 300, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(180, 40, 280, 320);}
 if (POS==3){canvas.fillRectangle(340, 20, 480, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(360, 40, 460, 320);}
 if (POS==4){canvas.fillRectangle(500, 20, 640, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(520, 40, 620, 320);}
  }
 if (NUM==1){
   if (POS==1)canvas.fillRectangle(120, 20, 140, 340);//B+C 1 залитый прямоугольник 
   if (POS==2)canvas.fillRectangle(280, 20, 300, 340);//B+C 2
   if (POS==3)canvas.fillRectangle(460, 20, 480, 340);//B+C 3
   if (POS==4)canvas.fillRectangle(620, 20, 640, 340);//B+C 4
 }
 if (NUM==2){
  if (POS==1){canvas.fillRectangle(0, 20, 140, 40);//A1
              canvas.fillRectangle(0, 170, 140, 190);//G1
              canvas.fillRectangle(0, 320, 140, 340);//D1
  canvas.fillRectangle(120, 20, 140, 170);//B1
  canvas.fillRectangle(0,170, 20, 340);//E1
  }
if (POS==2){canvas.fillRectangle(160, 20, 300, 40);//A2
              canvas.fillRectangle(160, 170, 300, 190);//G2
              canvas.fillRectangle(160, 320, 300, 340);//D2
  canvas.fillRectangle(280, 20, 300, 170);//B2
  canvas.fillRectangle(160,170, 180, 340);//E2
  }
if (POS==3){canvas.fillRectangle(340, 20, 480, 40);//A3
              canvas.fillRectangle(340, 170, 480, 190);//G3
              canvas.fillRectangle(340, 320, 480, 340);//D3
  canvas.fillRectangle(460, 20, 480, 170);//B3
  canvas.fillRectangle(340,170, 360, 340);//E3
  }
if (POS==4){canvas.fillRectangle(500, 20, 640, 40);//A4
              canvas.fillRectangle(500, 170, 640, 190);//G4
              canvas.fillRectangle(500, 320, 640, 340);//D4
  canvas.fillRectangle(620, 20, 640, 170);//B4
  canvas.fillRectangle(500,170, 520, 340);//E4
  }
 }
if (NUM==3){
  if (POS==1){
  canvas.fillRectangle(0, 20, 140, 40);//A1
              canvas.fillRectangle(0, 170, 140, 190);//G1
              canvas.fillRectangle(0, 320, 140, 340);//D1
  canvas.fillRectangle(120, 20, 140, 340);//B+C 1
  }
 if (POS==2){canvas.fillRectangle(160, 20, 300, 40);//A2
              canvas.fillRectangle(160, 170, 300, 190);//G2
              canvas.fillRectangle(160, 320, 300, 340);//D2
   canvas.fillRectangle(280, 20, 300, 340); //B+C 2          
 }
 if (POS==3){canvas.fillRectangle(340, 20, 480, 40);//A3
              canvas.fillRectangle(340, 170, 480, 190);//G3
              canvas.fillRectangle(340, 320, 480, 340);//D3
   canvas.fillRectangle(460, 20, 480, 340); //B+C 3          
 }
if (POS==4){canvas.fillRectangle(500, 20, 640, 40);//A4
              canvas.fillRectangle(500, 170, 640, 190);//G4
              canvas.fillRectangle(500, 320, 640, 340);//D4
  canvas.fillRectangle(620, 20, 640, 340);//B+C 4          
 }
 }
if (NUM==4){
  if (POS==1){canvas.fillRectangle(0, 170, 140, 190);//G1
              canvas.fillRectangle(120, 20, 140, 340);//B+C 1
              canvas.fillRectangle(0, 20, 20, 190);//F1
              }
if (POS==2){canvas.fillRectangle(160, 170, 300, 190);//G2
            canvas.fillRectangle(280, 20, 300, 340);//B+C 2
              canvas.fillRectangle(160, 20, 180, 190);//F2
}
if (POS==3){canvas.fillRectangle(340, 170, 480, 190);//G3
            canvas.fillRectangle(460, 20, 480, 340);//B+C 3
              canvas.fillRectangle(340, 20, 360, 190);//F3
}
if (POS==4){canvas.fillRectangle(500, 170, 640, 190);//G4
            canvas.fillRectangle(620, 20, 640, 340);//B+C 4
              canvas.fillRectangle(500, 20, 520, 190);//F4
}
}
if (NUM==5){
  if (POS==1){canvas.fillRectangle(0, 20, 140, 40);//A1
              canvas.fillRectangle(0, 170, 140, 190);//G1
              canvas.fillRectangle(0, 320, 140, 340);//D1
              canvas.fillRectangle(0, 20, 20, 190);//F1
              canvas.fillRectangle(120, 190, 140, 340);//C1
  }
 if (POS==2){canvas.fillRectangle(160, 20, 300, 40);//A2
              canvas.fillRectangle(160, 170, 300, 190);//G2
              canvas.fillRectangle(160, 320, 300, 340);//D2
           canvas.fillRectangle(160, 20, 180, 190);//F2
 canvas.fillRectangle(280, 190, 300, 340);//C2
 }
 if (POS==3){canvas.fillRectangle(340, 20, 480, 40);//A3
              canvas.fillRectangle(340, 170, 480, 190);//G3
              canvas.fillRectangle(340, 320, 480, 340);//D3
        canvas.fillRectangle(340, 20, 360, 190);//F3
canvas.fillRectangle(460, 190, 480, 340);//C3
 }
if (POS==4){canvas.fillRectangle(500, 20, 640, 40);//A4
              canvas.fillRectangle(500, 170, 640, 190);//G4
              canvas.fillRectangle(500, 320, 640, 340);//D4
    canvas.fillRectangle(500, 20, 520, 190);//F4
 canvas.fillRectangle(620, 190, 640, 340);//C3
 }
}
if (NUM==6){
  if (POS==1){canvas.fillRectangle(0, 20, 140, 40);//A1
              canvas.fillRectangle(0, 170, 140, 190);//G1
              canvas.fillRectangle(0, 320, 140, 340);//D1
              canvas.fillRectangle(0, 20, 20, 340);//FE1
              canvas.fillRectangle(120, 190, 140, 340);//C1
  }
 if (POS==2){canvas.fillRectangle(160, 20, 300, 40);//A2
              canvas.fillRectangle(160, 170, 300, 190);//G2
              canvas.fillRectangle(160, 320, 300, 340);//D2
           canvas.fillRectangle(160, 20, 180, 340);//FE2
 canvas.fillRectangle(280, 190, 300, 340);//C2
 }
 if (POS==3){canvas.fillRectangle(340, 20, 480, 40);//A3
              canvas.fillRectangle(340, 170, 480, 190);//G3
              canvas.fillRectangle(340, 320, 480, 340);//D3
        canvas.fillRectangle(340, 20, 360, 340);//FE3
canvas.fillRectangle(460, 190, 480, 340);//C3
 }
if (POS==4){canvas.fillRectangle(500, 20, 640, 40);//A4
              canvas.fillRectangle(500, 170, 640, 190);//G4
              canvas.fillRectangle(500, 320, 640, 340);//D4
    canvas.fillRectangle(500, 20, 520, 340);//FE4
 canvas.fillRectangle(620, 190, 640, 340);//C3
 }
}
if (NUM==7){
  if (POS==1){canvas.fillRectangle(0, 20, 140, 40);//A1
              canvas.fillRectangle(120, 20, 140, 340);//B+C 1
  }
 if (POS==2){canvas.fillRectangle(160, 20, 300, 40);//A2
               canvas.fillRectangle(280, 20, 300, 340);//B+C 2
 }
 if (POS==3){canvas.fillRectangle(340, 20, 480, 40);//A3
              canvas.fillRectangle(460, 20, 480, 340);//B+C 3
 }
if (POS==4){canvas.fillRectangle(500, 20, 640, 40);//A4
             canvas.fillRectangle(620, 20, 640, 340);//B+C 4
 }
}
 if (NUM==8){
    if (POS==1){canvas.fillRectangle(0, 20, 140, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(20, 40, 120, 320);
                canvas.setBrushColor(RGB888(0,255,0));
                canvas.fillRectangle(0, 170, 140, 190);//G1
    }
  if (POS==2){canvas.fillRectangle(160, 20, 300, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(180, 40, 280, 320);
                canvas.setBrushColor(RGB888(0,255,0));
                canvas.fillRectangle(160, 170, 300, 190);//G2
                }
 if (POS==3){canvas.fillRectangle(340, 20, 480, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(360, 40, 460, 320);
                canvas.setBrushColor(RGB888(0,255,0));
                canvas.fillRectangle(340, 170, 480, 190);//G3
                }
 if (POS==4){canvas.fillRectangle(500, 20, 640, 340);
                canvas.setBrushColor(RGB888(0,0,0));
                canvas.fillRectangle(520, 40, 620, 320);
                canvas.setBrushColor(RGB888(0,255,0));
                canvas.fillRectangle(500, 170, 640, 190);//G4
                }
 }
if (NUM==9){
  if (POS==1){
  canvas.fillRectangle(0, 20, 140, 40);//A1
              canvas.fillRectangle(0, 170, 140, 190);//G1
              canvas.fillRectangle(0, 320, 140, 340);//D1
  canvas.fillRectangle(120, 20, 140, 340);//B+C 1
  canvas.fillRectangle(0, 20, 20, 190);//F1
  }
 if (POS==2){canvas.fillRectangle(160, 20, 300, 40);//A2
              canvas.fillRectangle(160, 170, 300, 190);//G2
              canvas.fillRectangle(160, 320, 300, 340);//D2
   canvas.fillRectangle(280, 20, 300, 340); //B+C 2          
 canvas.fillRectangle(160, 20, 180, 190);//F2
 }
 if (POS==3){canvas.fillRectangle(340, 20, 480, 40);//A3
              canvas.fillRectangle(340, 170, 480, 190);//G3
              canvas.fillRectangle(340, 320, 480, 340);//D3
   canvas.fillRectangle(460, 20, 480, 340); //B+C 3          
 canvas.fillRectangle(340, 20, 360, 190);//F3
 }
if (POS==4){canvas.fillRectangle(500, 20, 640, 40);//A4
              canvas.fillRectangle(500, 170, 640, 190);//G4
              canvas.fillRectangle(500, 320, 640, 340);//D4
  canvas.fillRectangle(620, 20, 640, 340);//B+C 4          
 canvas.fillRectangle(500, 20, 520, 190);//F4
 }
 }
}
void pgressBar(){
  if (rtc.getSecond()==0) {
   canvas.setBrushColor(RGB888(0,0,0));
  canvas.fillRectangle(0, 350,640,360);
  canvas.setBrushColor(RGB888(0,255,0));
  }
canvas.fillRectangle(20+rtc.getSecond()*10, 350,20+rtc.getSecond()*10+10, 360);
}
void sec(){
   if(millis() - lastTime >= 998) {
sprintf(SE, "%s",String(millis() - lastTime)+" ");
      lastTime = millis();
      flagMIN=0;
      flagHOUR=0;
    }
sprintf(H, "%s",String(rtc.getHour(true)));
//canvas.drawTextFmt(5,380,H);
sprintf(MIN, "%s",String(rtc.getMinute()));
//canvas.drawTextFmt(50,380,MIN);
sprintf(SEC, "%s",String(rtc.getSecond())+"  ");
//canvas.drawTextFmt(150,380,SEC);
//canvas.drawTextFmt(550,380,SE);
////////ОТОБРАЖАЕМ ЧАСЫ ДО 9///
if (rtc.getHour(true)<10 and rtc.getMinute()==0 and rtc.getSecond()==0 and flagHOUR==0){
  Dig(rtc.getHour(true),2);
  Dig(0,1);
  flagHOUR=1;
} 
////////ОТОБРАЖАЕМ ЧАСЫ БОЛЬШЕ 9///
if (rtc.getHour(true)>=10 and rtc.getMinute()==0 and rtc.getSecond()==0 and flagHOUR==0){
    Dig(floor(rtc.getHour(true)/10.0),1);
    Dig(rtc.getHour(true)-floor((rtc.getHour(true)/10.0))*10.0,2);
 flagHOUR=1;}
////////ОТОБРАЖАЕМ МИНУТЫ ДО 9///
if (rtc.getMinute()<10 and rtc.getSecond()==0 and flagMIN==0){
  Dig(rtc.getMinute(),4);
  Dig(0,3);
flagMIN=1;
ShowTIME();
}   
////////ОТОБРАЖАЕМ МИНУТЫ БОЛЬШЕ 9///
 if (rtc.getMinute()>=10 and rtc.getSecond()==0 and flagMIN==0) {
    Dig(floor(rtc.getMinute()/10.0),3);
    Dig(rtc.getMinute()-floor((rtc.getMinute()/10.0))*10.0,4);
 flagMIN=1;
  ShowTIME();
  }
effects();
pgressBar();

}
void loop()
{
sec();
///////////////////////////////////////  
 MouseStatus status = PS2Controller.mouse()->getNextStatus(0); // 0 = NO blocking operation
//MouseStatus status = PS2Controller.mouse()->getNextStatus(-1); // -1 = blocking operation
  // Обработка нажатия левой кнопки мыши
  if (status.buttons.left) {
showCursorPos(status);
//////////////////если курсор на поле минут и нажата правая кнопка мыши///////////////
 if (status.X<640 and status.X>340 and status.Y>20 and status.Y<340 and rtc.getMinute()>0){ 
  rtc.setTime(0, rtc.getMinute()-1, rtc.getHour(true), 7, 1, 2022);  //sec,min,hour,дата,месяц,год 
 sec();
 }
  }
  // Обработка нажатия правой кнопки мыши
  if (status.buttons.right) {
  if (status.X<640 and status.X>340 and status.Y>20 and status.Y<340 and rtc.getMinute()<60){ 
  rtc.setTime(0, rtc.getMinute()+1, rtc.getHour(true), 7, 1, 2022);  //sec,min,hour,дата,месяц,год 
 sec();
  }
  }
  // Обработка нажатия средней кнопки мыши
  if (status.buttons.middle) {
  }
  // Обработка вращения колеса мыши
  if (status.wheelDelta != 0) {
  //  indicatorY = fabgl::tclamp(indicatorY + status.wheelDelta, 0, canvas.getHeight() - 16);
    PS2Controller.mouse()->status().wheelDelta = 0;
if (status.X<300 and status.X>20 and status.Y>20 and status.Y<340){ 
 rtc.setTime(0, rtc.getMinute(), rtc.getHour(true)+(status.wheelDelta*-1), 7, 1, 2022);  //sec,min,hour,дата,месяц,год 
ShowTIME();
}
 if (status.X<640 and status.X>340 and status.Y>20 and status.Y<340){ 
 rtc.setTime(0, rtc.getMinute()+(status.wheelDelta*-1), rtc.getHour(true), 7, 1, 2022);  //sec,min,hour,дата,месяц,год 
ShowTIME();
}
  }
effects();
// showCursorPos(status);
}

Не в сети

#7 08-01-2022 18:53:18

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Часы из старого VGA монитора и ESP32.

16416427485305579597547459863200.jpg

16416427725563671562168566425214.jpg

Не в сети

Подвал раздела

Работает на FluxBB (перевод Laravel.ru)