Часы стрелочные Ардуино Нано и 1.8TFT SPI
- Войдите на сайт для отправки комментариев
Втр, 01/08/2017 - 14:07
//#include <TinyGPSplus.h> //жпс парсер-источник точного времени
//#include <SoftwareSerial.h>//связь с модулем жпс
#include <SPI.h>
#include <TFT.h>
#define cs 10
#define dc 8
#define rst 9
#define TFT_SCLK 13 // set these to be whatever pins you like! (slow connection)
#define TFT_MOSI 11 // set these to be whatever pins you like!
#define halfheght 64
#define halfwidth 80
#define seclen 50
#define minlen 48
#define hwrlen 40
// заготовка для данных от жпс
//static const uint32_t GPSBaud = 9600;
//TinyGPSPlus gps;//example of gps class
//SoftwareSerial ss(6, 7);//NMEA protocol connection
TFT TFTscreen = TFT(cs, dc, rst);
int clockCenterX=80;
int clockCenterY=64;
int oldsec=0;
volatile float x1, y1, x2, y2, x3, y3, x4, y4;
byte sec,mnt,hwr=0;
void drawSec(float s) {//отрисовка секундной стрелки
float ps = s-1;
TFTscreen.stroke(0, 0, 0);
if (ps==-1)ps=59;
ps=ps*6;
ps=ps+270;
drawSecHand(ps);
TFTscreen.stroke(255, 0, 255);
s=s*6;
s=s+270;//270
drawSecHand(s);
}
void drawSecHand(float s){
x1=seclen*cos(s*0.0175); //6.28/360=001745
y1=seclen*sin(s*0.0175);
x2=5*cos(s*0.0175);
y2=5*sin(s*0.0175);
Serial.print(s); Serial.print("s,");Serial.print(s*0.0175); Serial.println(":угол");
TFTscreen.line(x1+clockCenterX, y1+clockCenterY, x2+clockCenterX, y2+clockCenterY);
}
void drawHwrHand(float h){
x1=hwrlen*cos(h*0.0175);
y1=hwrlen*sin(h*0.0175);
x2=5*cos(h*0.0175);
y2=5*sin(h*0.0175);
x3=20*cos((h+5)*0.0175);
y3=20*sin((h+5)*0.0175);
x4=20*cos((h-5)*0.0175);
y4=20*sin((h-5)*0.0175);
TFTscreen.line(x1+clockCenterX, y1+clockCenterY, x3+clockCenterX, y3+clockCenterY);
TFTscreen.line(x3+clockCenterX, y3+clockCenterY, x2+clockCenterX, y2+clockCenterY);
TFTscreen.line(x2+clockCenterX, y2+clockCenterY, x4+clockCenterX, y4+clockCenterY);
TFTscreen.line(x4+clockCenterX, y4+clockCenterY, x1+clockCenterX, y1+clockCenterY);
}
void drawMinHand(float m){
x1=minlen*cos(m*0.0175);
y1=minlen*sin(m*0.0175);
x2=5*cos(m*0.0175);
y2=5*sin(m*0.0175);
x3=30*cos((m+4)*0.0175);
y3=30*sin((m+4)*0.0175);
x4=30*cos((m-4)*0.0175);
y4=30*sin((m-4)*0.0175);
TFTscreen.line(x1+clockCenterX, y1+clockCenterY, x3+clockCenterX, y3+clockCenterY);
TFTscreen.line(x3+clockCenterX, y3+clockCenterY, x2+clockCenterX, y2+clockCenterY);
TFTscreen.line(x2+clockCenterX, y2+clockCenterY, x4+clockCenterX, y4+clockCenterY);
TFTscreen.line(x4+clockCenterX, y4+clockCenterY, x1+clockCenterX, y1+clockCenterY);
}
void drawDisplay()
{
// Очистка дисплея
TFTscreen.background(0, 0, 0);
// Рисуем циферблат
TFTscreen.stroke(255, 255, 255);
TFTscreen.background(0, 0, 0);
for (int i=0; i<3; i++)
{
TFTscreen.circle(clockCenterX, clockCenterY, halfheght-i);
}
for (int i=0; i<5; i++)
{
TFTscreen.circle(clockCenterX, clockCenterY, i);
}
//Отображаем числа на циферблате
TFTscreen.stroke(192, 192, 255);
TFTscreen.text("3", clockCenterX+halfwidth-28, clockCenterY-3);
TFTscreen.text("6", clockCenterX-2, clockCenterY+halfheght-12);
TFTscreen.text("9", clockCenterX-halfwidth+23, clockCenterY-3);
TFTscreen.text("12", clockCenterX-8, clockCenterY-halfheght+6);
//Рисуем метки часов в виде рысочек
for (int i=0; i<12; i++)
{
if ((i % 3)!=0)
drawMark(i);
}
// t = rtc.getTime();
drawMin(mnt);
drawHour(hwr, mnt);
drawSec(sec);
oldsec=sec;
}
void drawMark(int h)//Отрисовка меток
{
float x1, y1, x2, y2;
h=h*30;
h=h+270;
x1=(halfheght-4)*cos(h*0.0175);
y1=(halfheght-4)*sin(h*0.0175);
x2=(halfheght-9)*cos(h*0.0175);
y2=(halfheght-9)*sin(h*0.0175);
TFTscreen.line(x1+clockCenterX, y1+clockCenterY, x2+clockCenterX, y2+clockCenterY);
}
void drawMin(int m)//отрисовка минутной стрелки
{
int pm = m-1;
TFTscreen.stroke(0, 0, 0);
if (pm==-1)
pm=59;
pm=pm*6;
pm=pm+270;
drawMinHand(pm);
TFTscreen.stroke(0, 255, 0);
m=m*6;
m=m+270;
drawMinHand(m);
}
void drawHour(int h, int m)//отрисовка часовой стрелки
{
int ph = h;
TFTscreen.stroke(0, 0, 0);
if (m==0)
{
ph=((ph-1)*30)+((m+59)/2);
}
else
{
ph=(ph*30)+((m-1)/2);
}
ph=ph+270;
drawHwrHand(ph);
TFTscreen.stroke(255, 255, 100);
h=(h*30)+(m/2);
h=h+270;
drawHwrHand(h);
}
void setup(){
//Serial.begin(9600); //отладка
//ss.begin(GPSBaud); //связь с жпс
TFTscreen.begin();
TFTscreen.setTextSize(1);
TFTscreen.background(0, 0, 0);
drawDisplay();
}
void loop()//основной цикл работы стрелочных часов
{
sec++;
if (sec>59) {
sec=0;
mnt++;
if (mnt>59) {
mnt=0;
hwr++;
if (hwr>11) hwr=0;
}
}
delay(100);//(1000)//100 - для отладки, 1000- работа
int x, y;
//t = rtc.getTime();
if (oldsec!=sec)
{
int t1=0;
int t2=0;
int t3=0;
if(hwr>=12){
t1=(hwr-12)*5;
}
else
{
t1=hwr*5;
}
t2=mnt/12;
t3=t1+t2;
byte a=mnt+1;
byte b=mnt+2;
byte c=mnt+3;
byte d=t3+1;
byte e=t3+2;
byte f=t3+3;
byte g=t3+4;
if ((sec==d)||(sec==e)||(sec==f)||(sec==g))
{
drawHour(hwr,mnt);
}
if ((sec==a)||(sec==b)||(sec==c))
{
drawMin(mnt);
}
if (sec==0)
{
drawMin(mnt);
drawHour(hwr, mnt);
}
drawSec(sec);
oldsec=sec;
}
// Serial.print("часы-минуты ");Serial.print(hwr);Serial.println(mnt);
}
Это модифицированный файл. При незначительной доработке с запасом влез в НАНО.
Исходник взят сдесь http://arduino-project.net/analog-clock-arduino-mega/
Посмотреть можно здесь https://youtu.be/9y7nvNXAOv0
Дисплей цветной 1.8TFT SPI 128x160 ST7735
Дисплей на каком контроллере?
ST7735
Т.к. появился вопрос, я решил чуть почистить чужой код от избыточности. Это сообщение компоновщика: "Скетч использует 11694 байт (38%) памяти устройства. Всего доступно 30720 байт.Глобальные переменные используют 134 байт (6%) динамической памяти, оставляя 1914 байт для локальных переменных. Максимум: 2048 байт.", код прилагаю...
Этот скеч будет работать с модулем NEOWAY M590E ?
Если будет, то как его вживить в скеч ?
Я не в курсе. Между gps и gsm слишком велика разница. У меня gps корректировал время, у них там на орбите оно точнее нашего по телевизору. А с другой стороны минуты ничго не решат. В любом случае для gps протокол обычно NMEA, и вопрос только в скорости обмена по rs232 или его модификациям
сорри за скепсис... но вообще аналоговые часы - это стандартный пример к библиотеке TFT экрана... В чем новизна конкретно вашего проекта?
Хотелось вместить в мой камень, он меньше размером памяти. Заодно оптимизировать код. После этого я его еще двое сократил. Но это мало кого заинтересовало. Давно это было, сейчас я все пишу на ассемблере.
Хотелось вместить в мой камень, он меньше размером памяти.
А не подскажете, какой Вы камень использовали? - просто в заголовке темы указан Нано... В Нано-то скетч из примеров влезает легко, он по моему всего килобайт 10-12 занимает
все? на ардуине? Большие проекты с разветвленной логикой - на асме?
Простите, но по-моему это бессмысленная трата времени. Какие-то небольшие критичные к времени куски - да, но весь проект...
Кто-то играет в шахматы, кто-то пьет водку, кто-то мусорит в лесах и на озерах, много кто программирует на си++, я их не критикую. Не могу критиковать того, кого не понимаю. Материть - могу, а критиковать бесполезно.
Братцы, подскажите что сделать, что бы обновлялась дата и день недели при 00:00, а то я в программировании вообще никак? Когда нажимаю на монитор порта, то обновление происходит, а самостоятельно нет.
Скетч взял здесь из источника первого поста, дисплей от сотового из соседней темы:
#include <UTFT.h> #include <DS1307.h> //Подключения шрифта extern uint8_t BigFont[]; //Подключение дисплея TFT01-22SP UTFT myGLCD(31,A2,A1,A3,A4); //Подключение модуля DS1307 DS1307 rtc(A0, A5); Time t; //Центральные координаты для рисования стрелочных часов int clockCenterX=119; int clockCenterY=159; int oldsec=0; void setup(){ // myGLCD.InitLCD(0); // вертикальное отображение myGLCD.setFont(BigFont); rtc.halt(false); // второй pin для регулировки яркости дисплея analogWrite(12, 100); /*Для установки времени, введите ваши параметры и раскомментируйте 3 строки ниже и загрузите скетч на ардуино,а потом назад закомментируйте обратно*/ //rtc.setTime(23, 59, 0); //rtc.setDate(26, 01, 2020); //rtc.setDOW(7); } void drawDisplay() { // Очистка дисплея myGLCD.clrScr(); // Отображение текста myGLCD.setColor(0, 255, 0); myGLCD.print("Text", CENTER, 350); //Отображение текущей даты myGLCD.setColor(0, 255, 0); myGLCD.print(rtc.getDateStr(), CENTER, 5); //Отображение дня недели myGLCD.setColor(0, 255, 0); myGLCD.print(rtc.getDOWStr(), CENTER, 290); // Рисуем циферблат myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 0, 0); for (int i=0; i<5; i++) { myGLCD.drawCircle(clockCenterX, clockCenterY, 119-i); } for (int i=0; i<5; i++) { myGLCD.drawCircle(clockCenterX, clockCenterY, i); } //Отображаем числа на циферблате myGLCD.setColor(192, 192, 255); myGLCD.print("3", clockCenterX+92, clockCenterY-8); myGLCD.print("6", clockCenterX-8, clockCenterY+89); myGLCD.print("9", clockCenterX-109, clockCenterY-8); myGLCD.print("12", clockCenterX-16, clockCenterY-109); //Рисуем метки часов в виде рысочек for (int i=0; i<12; i++) { if ((i % 3)!=0) drawMark(i); } t = rtc.getTime(); drawMin(t.min); drawHour(t.hour, t.min); drawSec(t.sec); oldsec=t.sec; } void drawMark(int h)//Отрисовка меток { float x1, y1, x2, y2; h=h*30; h=h+270; x1=110*cos(h*0.0175); y1=110*sin(h*0.0175); x2=100*cos(h*0.0175); y2=100*sin(h*0.0175); myGLCD.drawLine(x1+clockCenterX, y1+clockCenterY, x2+clockCenterX, y2+clockCenterY); } void drawSec(int s)//отрисовка секундной стрелки { float x1, y1, x2, y2; int ps = s-1; myGLCD.setColor(0, 0, 0); if (ps==-1) ps=59; ps=ps*6; ps=ps+270; x1=95*cos(ps*0.0175); y1=95*sin(ps*0.0175); x2=5*cos(ps*0.0175); y2=5*sin(ps*0.0175); myGLCD.drawLine(x1+clockCenterX, y1+clockCenterY, x2+clockCenterX, y2+clockCenterY); myGLCD.setColor(255, 0, 0); s=s*6; s=s+270; x1=95*cos(s*0.0175); y1=95*sin(s*0.0175); x2=5*cos(s*0.0175); y2=5*sin(s*0.0175); myGLCD.drawLine(x1+clockCenterX, y1+clockCenterY, x2+clockCenterX, y2+clockCenterY); } void drawMin(int m)//отрисовка минутной стрелки { float x1, y1, x2, y2, x3, y3, x4, y4; int pm = m-1; myGLCD.setColor(0, 0, 0); if (pm==-1) pm=59; pm=pm*6; pm=pm+270; x1=80*cos(pm*0.0175); y1=80*sin(pm*0.0175); x2=5*cos(pm*0.0175); y2=5*sin(pm*0.0175); x3=30*cos((pm+4)*0.0175); y3=30*sin((pm+4)*0.0175); x4=30*cos((pm-4)*0.0175); y4=30*sin((pm-4)*0.0175); myGLCD.drawLine(x1+clockCenterX, y1+clockCenterY, x3+clockCenterX, y3+clockCenterY); myGLCD.drawLine(x3+clockCenterX, y3+clockCenterY, x2+clockCenterX, y2+clockCenterY); myGLCD.drawLine(x2+clockCenterX, y2+clockCenterY, x4+clockCenterX, y4+clockCenterY); myGLCD.drawLine(x4+clockCenterX, y4+clockCenterY, x1+clockCenterX, y1+clockCenterY); myGLCD.setColor(0, 255, 0); m=m*6; m=m+270; x1=80*cos(m*0.0175); y1=80*sin(m*0.0175); x2=5*cos(m*0.0175); y2=5*sin(m*0.0175); x3=30*cos((m+4)*0.0175); y3=30*sin((m+4)*0.0175); x4=30*cos((m-4)*0.0175); y4=30*sin((m-4)*0.0175); myGLCD.drawLine(x1+clockCenterX, y1+clockCenterY, x3+clockCenterX, y3+clockCenterY); myGLCD.drawLine(x3+clockCenterX, y3+clockCenterY, x2+clockCenterX, y2+clockCenterY); myGLCD.drawLine(x2+clockCenterX, y2+clockCenterY, x4+clockCenterX, y4+clockCenterY); myGLCD.drawLine(x4+clockCenterX, y4+clockCenterY, x1+clockCenterX, y1+clockCenterY); } 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=60*cos(ph*0.0175); y1=60*sin(ph*0.0175); x2=5*cos(ph*0.0175); y2=5*sin(ph*0.0175); x3=20*cos((ph+5)*0.0175); y3=20*sin((ph+5)*0.0175); x4=20*cos((ph-5)*0.0175); y4=20*sin((ph-5)*0.0175); myGLCD.drawLine(x1+clockCenterX, y1+clockCenterY, x3+clockCenterX, y3+clockCenterY); myGLCD.drawLine(x3+clockCenterX, y3+clockCenterY, x2+clockCenterX, y2+clockCenterY); myGLCD.drawLine(x2+clockCenterX, y2+clockCenterY, x4+clockCenterX, y4+clockCenterY); myGLCD.drawLine(x4+clockCenterX, y4+clockCenterY, x1+clockCenterX, y1+clockCenterY); myGLCD.setColor(255, 255, 0); h=(h*30)+(m/2); h=h+270; x1=60*cos(h*0.0175); y1=60*sin(h*0.0175); x2=5*cos(h*0.0175); y2=5*sin(h*0.0175); x3=20*cos((h+5)*0.0175); y3=20*sin((h+5)*0.0175); x4=20*cos((h-5)*0.0175); y4=20*sin((h-5)*0.0175); myGLCD.drawLine(x1+clockCenterX, y1+clockCenterY, x3+clockCenterX, y3+clockCenterY); myGLCD.drawLine(x3+clockCenterX, y3+clockCenterY, x2+clockCenterX, y2+clockCenterY); myGLCD.drawLine(x2+clockCenterX, y2+clockCenterY, x4+clockCenterX, y4+clockCenterY); myGLCD.drawLine(x4+clockCenterX, y4+clockCenterY, x1+clockCenterX, y1+clockCenterY); } void loop()//основной цикл работы стрелочных часов { int x, y; t = rtc.getTime(); drawDisplay(); while (true) { if (oldsec!=t.sec) { 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; } delay(10); t = rtc.getTime(); } }после строчки 233 вставьте
после строчки 233 вставьте
Спасибо большое b707, помогло. Пиво бы Вам за такое :)
Спасибо, b707, за помощь!