Выбор дисплеев на сайтах широкий. На этом форуме видел как подключают не дорогие дисплеи от разных смартфонов http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-... . Ардуинка не Mega 2560, а UNO. Скетч занимает более 70% памяти. Уже подумываю приобрести Mega 2560, хочу измерять температуру и освещенность в нескольких помещениях и снаружи, затем выводить все измерения на дисплей. Возможно, потом добавлю управление освещением и вентиляцией.
Но это только заготовка, а не рабочий скетч, код индусский, но стрелочные часыработают, музыка звучит, клавиатура работает, первоначальный экран цифровых часов рисуется. Но чтобы работало, нужны библиотеки, которые я использовал. Это библиотека 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]
Меня заинтересовал принцип переключения на цифровые часы. в первоначальном скетсе этого не прописано,
поэтому хотелось бы увидеть скетч.
Выбор дисплеев на сайтах широкий. На этом форуме видел как подключают не дорогие дисплеи от разных смартфонов http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-... . Ардуинка не Mega 2560, а UNO. Скетч занимает более 70% памяти. Уже подумываю приобрести Mega 2560, хочу измерять температуру и освещенность в нескольких помещениях и снаружи, затем выводить все измерения на дисплей. Возможно, потом добавлю управление освещением и вентиляцией.
Меня заинтересовал принцип переключения на цифровые часы. в первоначальном скетсе этого не прописано,
поэтому хотелось бы увидеть скетч.
Дико извиняюсь, но завтра вроде вчера было.
Ок, завтра подготовлю и выложу.
Дико извиняюсь, но завтра вроде вчера было.
Но это только заготовка, а не рабочий скетч, код индусский, но стрелочные часыработают, музыка звучит, клавиатура работает, первоначальный экран цифровых часов рисуется. Но чтобы работало, нужны библиотеки, которые я использовал. Это библиотека DS3231, которая позволяет использовать прерывания, и библиотека IlI9163C седьмая версия и библиотека pitches.h для воспроизведения мелодии
Спасиб!! Буду разбиратся завтра.
Спасиб!! Буду разбиратся завтра.
Спасиб!! Буду разбиратся завтра.
Наглеть так наглеть.
Не можете ли пособить старику с этими библами, а то в процессе освоения DS3231 и IL9163 у меня их скопилось
штук 8 и для каждого проекта с этими девайсами приходится мучатся подбирая правилные.
Ежель не трудно, то на мыло pessemist2006@yandex.ru скинте пжлста.
..... то на мыло.........
..... то на мыло.........
Спасибо огромное!!!
.......ое!!!
.......ое!!!
Отпишусь на Ваше мыло, чтобы за зря тему не засорять.
Пишите тут если написан путь решения проблемы, так как сотню раз сталкивался с такой же проблемой, а ответа нет, либо он в ЛС.
Пишите тут если написан путь решения проблемы, так как сотню раз сталкивался с такой же проблемой, а ответа нет, либо он в ЛС.
А какую проблему Вы имеете в виду?
ребят не ломайте голову себе и людям, все на много проще, чем рисование квадратов и тд, я использую функцию
tft.setTextColor(цвет фона, цвет фона);
tft.println(old_text);
Долго трахался, перерисовывая, закрашивая, но ваш совет работает на 100% !
Сенкс !
только