TFT LCD ILI9163C 128x128

Joiner
Offline
Зарегистрирован: 04.09.2014

Dmitriy49 пишет:

Меня заинтересовал принцип переключения на цифровые часы. в первоначальном скетсе этого не прописано,

поэтому хотелось бы увидеть скетч.

Ок, завтра подготовлю и выложу.

Igor_Simanov
Offline
Зарегистрирован: 25.10.2016

Выбор дисплеев на сайтах широкий. На этом форуме видел как подключают не дорогие дисплеи от разных смартфонов http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-... . Ардуинка не Mega 2560, а UNO. Скетч занимает более 70% памяти. Уже подумываю приобрести Mega 2560, хочу измерять температуру и освещенность в нескольких помещениях и снаружи, затем выводить все измерения на дисплей. Возможно, потом добавлю управление освещением и вентиляцией.

Dmitriy49
Offline
Зарегистрирован: 07.06.2016

Joiner пишет:

Dmitriy49 пишет:

Меня заинтересовал принцип переключения на цифровые часы. в первоначальном скетсе этого не прописано,

поэтому хотелось бы увидеть скетч.

Ок, завтра подготовлю и выложу.

Дико извиняюсь, но завтра вроде вчера было.

Joiner
Offline
Зарегистрирован: 04.09.2014

Dmitriy49 пишет:

Joiner пишет:

Ок, завтра подготовлю и выложу.

Дико извиняюсь, но завтра вроде вчера было.

Ой, дико извиняюсь, сейчас выложу :)

Но это только заготовка, а не рабочий скетч, код индусский, но стрелочные часыработают, музыка звучит, клавиатура работает, первоначальный экран цифровых часов рисуется. Но чтобы работало, нужны библиотеки, которые я использовал. Это библиотека DS3231, которая позволяет использовать прерывания, и библиотека IlI9163C седьмая версия и библиотека pitches.h для воспроизведения мелодии

[code]

//Подключение библиотек
#include <SPI.h>
#include <TFT_ILI9163C.h>//Библиотека TFT_ILI9163C.h версия 1.0p.7 работает без Adafruit_GFX.h
#include "_fonts/arial20.c"
#include <DS3231.h>//
//#include <Wire.h>//отключил, а часики работают, это библа здесь не нужна
#include "pitches.h"

DS3231  rtc(SDA, SCL);//Что-то про часики
Time  t;

// Color definitions
//#define  BLACK   0x0000
//#define BLUE    0x001F
//#define RED     0xF800
//#define GREEN   0x07E0
//#define CYAN    0x07FF
//#define MAGENTA 0xF81F
//#define YELLOW  0xFFE0
#define MARENGO 0x4C5866//Это я добавил цвет маренго.Ни че так фончик. Разобраться сколько вообще цветов?
//#define WHITE   0xFFFF

//Параметры для клавиатуры
const byte None   = 0;
const byte Right  = 1;
const byte Up     = 2;
const byte Down   = 3;
const byte Left   = 4;
const byte Select = 5;

#define __CS 10
#define __DC 8//Написать пины по своему подключению дисплея
TFT_ILI9163C tft = TFT_ILI9163C(__CS, __DC);//Прописываем пины дисплея


//Центральные координаты для рисования стрелочных часов
byte clockCenterX=64;//Центр экрана (поправил по своему дисплею)
byte clockCenterY=64;//Центр экрана (поправил по своему дисплею)
int oldsec=0;
//byte cradius=64;//Часики стали квадратными
 
void setup(){
  Serial.begin(9600);
  tft.begin();
 
  //tft.setRotation(1);//Поворачиваем экран на 90 град.
  rtc.begin();//Инициализируем часики
  // Здеь мы заносим в регистр часов значение, которое определяет
  //частоту импульсов SQW 1 импульс в секунду
  //пока закомментировал
  /*  Wire.begin();
  Wire.beginTransmission(0x68);
  Wire.write(0x0E); // Control Register
  Wire.write(B01000000); // 1 Hz Out
  Wire.endTransmission();//   */
  
//  tft.setTextSize(2);//Пока этор размер шрифта
  //pinMode(12, OUTPUT);//Этот пин включает подсветку дисплея
  //digitalWrite(12, HIGH);//Тут у нас включается подсветка дисплея
  pinMode(7, OUTPUT);//Этот пин управляет буззером(спиккером)

  HI();//Запускаем приветствие
  
  // ЭТО ПОКА ВРЕМЕННО, ПОТОМ БУДЕТ ЗАПУСК ИЗ МЕНЮ.
 
  /*Для установки времени, введите ваши параметры и 
  раскомментируйте 3 строки ниже и загрузите скетч
  на ардуино,а потом закомментируйте обратно*/
  
  //rtc.setTime(22, 25,0);     
  //rtc.setDate(19,10, 2015);
  //rtc.setDOW(MONDAY); 
}

void loop()
{
if(getPressedButton()==Select)
    {
      waitButtonNone();//Функция ожидания отпускания клавиши
      //detachInterrupt(0);
      mySignal();
      
    }
if(getPressedButton()==Right)
    {
      waitButtonNone();//Функция ожидания отпускания клавиши
      startAnalogClock();
    }
if(getPressedButton()==Left)
    {
      waitButtonNone();//Функция ожидания отпускания клавиши
      detachInterrupt(0);
      drawDigDisplay();//Пока рисует первоначальный экран цифр.часов
    }
}

//===================================================================
void drawAnDisplay()//Функция рисует стрелочные часы
{
  // Очистка дисплея
  tft.setBackground(BLACK);//Задаем фон
  tft.clearScreen();//Очищаем экран
  tft.fillRoundRect(0,0,127,127,35,MARENGO);
  tft.drawRoundRect(0,0,127,127,35,YELLOW);//Рисуем квадратную рамочку вокруг циферблата

    tft.fillCircle(clockCenterX, clockCenterY, 4, GREEN);//Рисуем внутренний кружочек
    tft.fillCircle(clockCenterX, clockCenterY, 2, BLACK);//Рисуем в в нем дырочку
    tft.fillCircle(clockCenterX, clockCenterY, 1, GREEN);//Рисуем ось
  
  //Отображаем числа на циферблате
  tft.setTextColor(YELLOW);//Цвет цифирок
  tft.setFont(&arial20);//Загружаем нужный шрифт (для нас основной)
  tft.setTextScale(1);
  //Координаты цифирок подбираем по шрифту (разный шрифт-разные координаты)
 
  tft.setCursor(116,57);//7
  tft.print("3");
  tft.setCursor(59,108);// Странно, но Y=109 цифра куда-то улетает
  tft.print("6");
  tft.setCursor(4,57);//7
  tft.print("9");
  tft.setCursor(55,2);//62
  tft.print("12");//Кружочек с цифирками нарисовали!!!!
  
  //Рисуем метки часов в виде рисочек
  for (int i=0; i<12; i++)
  {
    if ((i % 3)!=0)//исключаем рисочки где стоят циферки
      drawMark(i);//Идем на функцию, которая рисует рисочки между цифрами
  }  
  t = rtc.getTime();//Получаем время с RTC
  drawMin(t.min);//Идем на функцию рисовки стрелки минут
  drawHour(t.hour, t.min);//Идем на функцию рисовки стрелки часов
  drawSec(t.sec);
  oldsec=t.sec;
}


//===================================================================
//Рисуем первоначальный экран цифровых часов
void drawDigDisplay()
{
  tft.setBackground(BLACK);//Задаем фон экрана
  tft.clearScreen();//Очищаем экран он становится черным
  //tft.fillRoundRect(0,0,127,127,20,MARENGO);//Голубой залитый скругленный прямоугольник
  //tft.drawRoundRect(0,0,127,127,20,YELLOW);//Желтая скругленная прямоугольная рамочка

  t = rtc.getTime();//Получаем время с RTC
  
  //Рисуем значение часов
  tft.setTextColor(WHITE);
  tft.setCursor(3,60);
  tft.setTextScale(3);
  tft.print(rtc.getTimeStr());//Здесь получаем из библиотеки сразу строку 08:07:55
  //tft.print(namToString(t.hour));//Обращаемся к функции namToString()и
  //преобразуем число часов в такую строку 4 ---->  "04"
  //tft.setCursor(72,60);
  //tft.print(namToString(t.min));//Обращаемся к функции namToString()

  tft.setFont(&arial20);//Загружаем нужный шрифт (для нас основной)
  tft.setTextScale(0);
  tft.setTextColor(YELLOW);
  tft.setCursor(CENTER,5);
  tft.print(rtc.getDateStr());//Здесь напишем дату (сразу строку)01.10.2016
  tft.setCursor(CENTER,25);
  tft.print(rtc.getDOWStr());//Здесь напишем день недели (сразу строку)
  //А можно так
  //tft.print(t.dow, DEC);//Выдаст номер дня недели
  /*
   * Здесь пример как получить в десятичном виде всё отдельно
  t = rtc.getTime();
  Serial.print("It is the ");
  Serial.print(t.dow, DEC);
  Serial.print(". day of the week (counting monday as the 1th), and it has passed ");
  Serial.print(t.hour, DEC);
  Serial.print(" hour(s), ");
  Serial.print(t.min, DEC);
  Serial.print(" minute(s) and ");
  Serial.print(t.sec, DEC);
  Serial.println(" second(s) since midnight.");
  */
  
  
}
 
void drawMark(int h)//Отрисовка меток, рисочек между цифрами
{
  float x1, y1, x2, y2;
  
  h=h*30;
  h=h+270;
  //Дальше в формулах были цифры 55,55,50,50.....было красиво, но потом квадратный циферблат
  x1=67*cos(h*0.0175);//Если сделать первую цифру, например, 59, то рисочки не будут 72
  y1=67*sin(h*0.0175);//доставать до окружности циферблата....красиво 72
  x2=60*cos(h*0.0175);//52Здесь можно поиграть с длиной
  y2=60*sin(h*0.0175);// 52рисочек
  
  tft.drawLine(int (x1)+64, int (y1)+64, int (x2)+64, int (y2)+64,YELLOW);
      
}
//===================================================================
 
void drawSec(int s)//отрисовка секундной стрелки
{
  float x1, y1, x2, y2;
  int ps = s-1;
  
  if (ps==-1)
    ps=59;
  ps=ps*6;
  ps=ps+270;
  
  x1=45*cos(ps*0.0175);//Параметры для секундной стрелки
  y1=45*sin(ps*0.0175);//вроде бы оптимальные
  x2=6*cos(ps*0.0175);//может только посмотреть
  y2=6*sin(ps*0.0175);//не портит ли внутренний кружочек
  
  tft.drawLine(int (x1+64), int (y1+64), int (x2+64), int (y2+64),MARENGO);
 
  s=s*6;
  s=s+270;
  
  x1=45*cos(s*0.0175);
  y1=45*sin(s*0.0175);
  x2=6*cos(s*0.0175);
  y2=6*sin(s*0.0175);
  
  tft.drawLine(int (x1+clockCenterX), int (y1+clockCenterY), int (x2+clockCenterX), int (y2+clockCenterY),YELLOW);

  digitalWrite(7, HIGH);//Здесь мы тикаем...пока так
  delayMicroseconds(10);
  digitalWrite(7, LOW); 
//Потом будем тикать функцией
}
 
void drawMin(int m)//отрисовка минутной стрелки
{
  float x1, y1, x2, y2, x3, y3, x4, y4;
  int pm = m-1;//Вычисляем прошлую минуту
  
//tft.setColor(0, 0, 0);
  if (pm==-1)//Приводим к нормальному виду, если надо
    pm=59;
  pm=pm*6;
  pm=pm+270;
  
  x1=45*cos(pm*0.0175);//Длина стрелки 48 вроде 48 лучше
  y1=45*sin(pm*0.0175);//Длина стрелки 48
  x2=6*cos(pm*0.0175);//было 5
  y2=6*sin(pm*0.0175);//было 5
  x3=30*cos((pm+8)*0.0175);//было 28 4 8
  y3=30*sin((pm+8)*0.0175);//было 28 4 8
  x4=30*cos((pm-8)*0.0175);//было 28 4 8
  y4=30*sin((pm-8)*0.0175);//было 28 4 
  
  tft.drawLine(int (x1+clockCenterX), int (y1+clockCenterY), int (x3+clockCenterX), int (y3+clockCenterY),MARENGO);
  tft.drawLine(int (x3+clockCenterX), int (y3+clockCenterY), int (x2+clockCenterX), int (y2+clockCenterY),MARENGO);
  tft.drawLine(int (x2+clockCenterX), int (y2+clockCenterY), int (x4+clockCenterX), int (y4+clockCenterY),MARENGO);
  tft.drawLine(int (x4+clockCenterX), int (y4+clockCenterY), int (x1+clockCenterX), int (y1+clockCenterY),MARENGO);
 
//  myGLCD.setColor(0, 255, 0);
  m=m*6;
  m=m+270;
  
  x1=45*cos(m*0.0175);//47 РАЗОБРАТЬСЯ С ФОРМОЙ СТРЕЛОК
  y1=45*sin(m*0.0175);//47
  x2=6*cos(m*0.0175);
  y2=6*sin(m*0.0175);
  x3=30*cos((m+8)*0.0175);//28 4 Это вроде как толщину определяет
  y3=30*sin((m+8)*0.0175);//28 4
  x4=30*cos((m-8)*0.0175);//28 4
  y4=30*sin((m-8)*0.0175);//28 4
  
  tft.drawLine(int (x1+clockCenterX), int (y1+clockCenterY), int (x3+clockCenterX), int (y3+clockCenterY),YELLOW);
  tft.drawLine(int (x3+clockCenterX), int (y3+clockCenterY), int (x2+clockCenterX), int (y2+clockCenterY),YELLOW);
  tft.drawLine(int (x2+clockCenterX), int (y2+clockCenterY), int (x4+clockCenterX), int (y4+clockCenterY),YELLOW);
  tft.drawLine(int (x4+clockCenterX), int (y4+clockCenterY), int (x1+clockCenterX), int (y1+clockCenterY),YELLOW);
}
 
void drawHour(int h, int m)//отрисовка часовой стрелки
{
  float x1, y1, x2, y2, x3, y3, x4, y4;
  int ph = h;
  
//  myGLCD.setColor(0, 0, 0);
  if (m==0)
  {
    ph=((ph-1)*30)+((m+59)/2);
  }
  else
  {
    ph=(ph*30)+((m-1)/2);
  }
  ph=ph+270;
  
  x1=36*cos(ph*0.0175);//38
  y1=36*sin(ph*0.0175);
  x2=6*cos(ph*0.0175);
  y2=6*sin(ph*0.0175);
  x3=20*cos((ph+12)*0.0175);//5 Вроде как толщина стрелок
  y3=20*sin((ph+12)*0.0175);//5
  x4=20*cos((ph-12)*0.0175);//5
  y4=20*sin((ph-12)*0.0175);//5
  
  tft.drawLine(int (x1+clockCenterX), int (y1+clockCenterY), int (x3+clockCenterX), int (y3+clockCenterY),MARENGO);
  tft.drawLine(int (x3+clockCenterX), int (y3+clockCenterY), int (x2+clockCenterX), int (y2+clockCenterY),MARENGO);
  tft.drawLine(int (x2+clockCenterX), int (y2+clockCenterY), int (x4+clockCenterX), int (y4+clockCenterY),MARENGO);
  tft.drawLine(int (x4+clockCenterX), int (y4+clockCenterY), int (x1+clockCenterX), int (y1+clockCenterY),MARENGO);
 
  h=(h*30)+(m/2);
  h=h+270;
  
  x1=36*cos(h*0.0175);
  y1=36*sin(h*0.0175);
  x2=6*cos(h*0.0175);
  y2=6*sin(h*0.0175);
  x3=20*cos((h+12)*0.0175);//20 5 10
  y3=20*sin((h+12)*0.0175);//20 5 10
  x4=20*cos((h-12)*0.0175);//20 5 10
  y4=20*sin((h-12)*0.0175);//20 5 10
  
  tft.drawLine(int (x1+clockCenterX), int (y1+clockCenterY), int (x3+clockCenterX), int (y3+clockCenterY),YELLOW);
  tft.drawLine(int (x3+clockCenterX), int (y3+clockCenterY), int (x2+clockCenterX), int (y2+clockCenterY),YELLOW);
  tft.drawLine(int (x2+clockCenterX), int (y2+clockCenterY), int (x4+clockCenterX), int (y4+clockCenterY),YELLOW);
  tft.drawLine(int (x4+clockCenterX), int (y4+clockCenterY), int (x1+clockCenterX), int (y1+clockCenterY),YELLOW);
}
//===================================================================

void drawDigHour()
{
  
}
//===================================================================

void analogClock()
{
  t = rtc.getTime();

      int t1=0; 
      int t2=0;
      int t3=0;
      if(t.hour>=12){
         t1=(t.hour-12)*5;
       }
       else
       {
         t1=t.hour*5;
       }
       t2=t.min/12;
       t3=t1+t2;
       int a=t.min+1;
       int b=t.min+2;
       int c=t.min+3;
       int d=t3+1;
       int e=t3+2;
       int f=t3+3;
       int g=t3+4;
       if ((t.sec==d)||(t.sec==e)||(t.sec==f)||(t.sec==g))
      {
        drawHour(t.hour, t.min);
      }
       if ((t.sec==a)||(t.sec==b)||(t.sec==c))
      {
        drawMin(t.min);
      }
      if (t.sec==0)
      {
        drawMin(t.min);
        drawHour(t.hour, t.min);
      }
      drawSec(t.sec);
      oldsec=t.sec;
}

//===================================================================
int getPressedButton()//Обработка нажатия клавиш. Возвращает значение клавиши.
{
  
  int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0) 
  if (buttonValue < 100) {
    return Right;  
  }
  else if (buttonValue < 300) {
    return Up;
  }
  else if (buttonValue < 500){
    return Down;
  }
  else if (buttonValue < 700){//Left
    return Left;
  }
  else if (buttonValue < 900){
    return Select;//Select
  }
  return None;
}

//===================================================================
void waitButtonNone()
{
  Serial.println("waitButtonNone");
  tone(7, NOTE_C7,50);
  while(getPressedButton()!=None)
  {
    //delay(50);}//Крутимся здесь, пока не отпустим клавишу
  }
}

//===================================================================
void startAnalogClock()
{
  drawAnDisplay(); //Запускаем функцию отрисовки циферблата с циферками и стрелками
  //Запускаем внешние прерывания с выхода часиков SQW 
  //на пин 2 ардуинки, туда идут импулсы с периодом 1 сек.
  attachInterrupt(0, analogClock, FALLING);
}


//===================================================================
//В этой функции звучит мелодия
void mySignal() {
  int melody[] = {NOTE_E6,NOTE_G6,NOTE_G6,NOTE_E6,NOTE_A6,NOTE_G6,NOTE_A6,NOTE_G6,NOTE_A6,NOTE_G6,NOTE_A6,NOTE_G6,NOTE_A6,NOTE_B6};
  int noteDurations[] = {6,1,6,1,8,8,8,8,8,8,8,8,6,2 };
  
  for (int thisNote = 0; thisNote < 14; thisNote++) {
// чтобы рассчитать время продолжительности ноты, 
// берем одну секунду и делим ее цифру, соответствующую нужному типу ноты:
// например, четвертная нота – это 1000/4,
// а восьмая нота – это 1000/8 и т.д.

  int noteDuration = 1000/noteDurations[thisNote];
  tone(7, melody[thisNote],noteDuration);
// чтобы выделить ноты, делаем между ними небольшую задержку.
// в данном примере сделаем ее равной продолжительности ноты
// плюс еще 30% от продолжительности ноты:
  int pauseBetweenNotes = noteDuration * 1.50;
  delay(pauseBetweenNotes);
// останавливаем проигрывание мелодии:
  noTone(7);
  //здесь следим за кнопками и если
  if(getPressedButton()==Left)
    {
      //waitButtonNone();//Функция ожидания отпускания клавиши
      detachInterrupt(0);
      drawDigDisplay();
  
    }
  } 
}

//=================================================================
//Функция которая делает из числа 1 строку 01
String namToString(byte dat)
{
  String t=(String (dat<10 ? "0":"") + String(dat));
  return t;
}

//===================================================================
void HI()//Фукция типа приветствия или эбаут
{
  //Приветствие (пока временное) и ожидание нажатия клавиши
  tft.setInternalFont();//Подключаем внутренний фонт
  tft.setTextColor(YELLOW);//Цвет шрифта
  tft.setTextScale(1);//Минимальный масштаб
  tft.setCursor(CENTER,112);
  tft.println("_____ Joiner _____");
  tft.setCursor(CENTER,120);
  tft.println("Sergey Potapoff");
  
  tft.setFont(&arial20);//Загружаем нужный шрифт (для нас основной)
  tft.setCursor(CENTER,20);
  tft.setTextScale(1);//Минимальный масштаб
  tft.print("Clever by half");
  tft.setCursor(CENTER,40);
  tft.print("WATCH");
  tft.println("");
  //tft.setBackground(MARENGO);//Задаем фон
  //tft.drawRoundRect(0,10,127,36,10,BLUE);//Рисуем квадратну
  tft.fillRoundRect(0,64,127,36,10,YELLOW);
  tft.drawRoundRect(0,64,127,36,10,BLUE);
  tft.setTextColor(BLUE);
  tft.setCursor(CENTER,74);
  tft.print("Press SELECT");
}

[/code]

 

Dmitriy49
Offline
Зарегистрирован: 07.06.2016

Спасиб!! Буду разбиратся завтра.

Joiner
Offline
Зарегистрирован: 04.09.2014

Dmitriy49 пишет:

Спасиб!! Буду разбиратся завтра.

Не забудьте, без библиотек, которые я указал, не скомпилируется.

Dmitriy49
Offline
Зарегистрирован: 07.06.2016

Joiner пишет:

Dmitriy49 пишет:

Спасиб!! Буду разбиратся завтра.

Не забудьте, без библиотек, которые я указал, не скомпилируется.

Наглеть так наглеть.

Не можете ли пособить старику с этими библами, а то в процессе освоения DS3231 и IL9163 у меня их скопилось

штук 8 и для каждого проекта с этими девайсами приходится мучатся подбирая правилные.

Ежель не трудно, то на мыло pessemist2006@yandex.ru скинте пжлста.

 

Joiner
Offline
Зарегистрирован: 04.09.2014

Dmitriy49 пишет:

..... то на мыло.........

Скинул.

Dmitriy49
Offline
Зарегистрирован: 07.06.2016

Joiner пишет:

Dmitriy49 пишет:

..... то на мыло.........

Скинул.

Спасибо огромное!!!

Joiner
Offline
Зарегистрирован: 04.09.2014

Dmitriy49 пишет:

.......ое!!!

Отпишите, получилось ли?

Dmitriy49
Offline
Зарегистрирован: 07.06.2016

Joiner пишет:

Dmitriy49 пишет:

.......ое!!!

Отпишите, получилось ли?

Отпишусь на Ваше мыло,  чтобы за зря тему не засорять.

SpearMint
SpearMint аватар
Offline
Зарегистрирован: 23.11.2015

Пишите тут если написан путь решения проблемы, так как сотню раз сталкивался с такой же проблемой, а ответа нет, либо он в ЛС.

Dmitriy49
Offline
Зарегистрирован: 07.06.2016

SpearMint пишет:

Пишите тут если написан путь решения проблемы, так как сотню раз сталкивался с такой же проблемой, а ответа нет, либо он в ЛС.

А какую проблему Вы имеете в виду?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

cannibal66670 пишет:

ребят не ломайте голову себе и людям, все на много проще, чем рисование квадратов и тд, я использую функцию 

tft.setTextColor(цвет фона, цвет фона);

tft.println(old_text);

Долго трахался, перерисовывая, закрашивая, но ваш совет работает на 100% !

Сенкс !

только 

tft.setTextColor(цвет текста, цвет фона);