我们基于简单的ESP8266开发板和一块液晶显示屏来实现简单的时钟功能,出发点是为了熟悉TFT_eSPI这个库,设计一个简单的界面。
Esp8266+TFT显示屏(分辨率128*128,接口SPI,驱动:ST7735 )+杜邦线+USB数据转接线。
SPI和TFT_eSPI(程序需要几个库可以自行在arduino中安装,也可以直接使用压缩包里的libraries)。
把文件夹libraries里的库复制到你的Arduino的libraries下(已安装的可忽略)
针对此项目,检查并更改libraries\TFT_eSPI\User_Setup.h屏幕针脚的定义和一些初始化参数,如下所示:
选择ST7735芯片驱动(TFT_eSPI默认的ST7789);
选择BGR模式才能正常显示色彩,选择RGB时屏幕显示红色与蓝色是相反;
针对自己的ST7735显示屏更改宽高大小;
根据接线接口修改对应的Esp8266开发板的引脚;
每烧一次程序才会更新当前时间,然后可以实现自动计时功能
//使用TFT_eSPI库实现基本的时钟界面功能
#include
#include
TFT_eSPI tft = TFT_eSPI();
uint32_t targetTime = 0; //更新时间标志(本程序中为1秒更新)
byte omm = 99; //时间的背景阴影的刷新标志
bool initial = 1; //代码段初始化标志
byte xcolon = 0; //xpos的中间储存变量
unsigned int colour = 0;
static uint8_t conv2d(const char* p) //将字符串中的前两位取出并转换为数字
{
uint8_t v = 0;
if ('0' <= *p && *p <= '9') //比较字符的ASCII码是否在0和9之间
v = *p - '0'; //转化为数字
return 10 * v + *++p - '0'; //把两个字符转化为两位数字
}
//从编译时间中分别获取小时分钟秒,+3表示两位数字和冒号
uint8_t hh=conv2d(__TIME__), mm=conv2d(__TIME__+3), ss=conv2d(__TIME__+6);
void setup()
{
tft.init();
tft.setRotation(1); //旋转90度,屏幕旋转,参数为:0, 1, 2, 3,分别代表 0°、90°、180°、270°
tft.fillScreen(TFT_BLACK); //填满黑色
tft.setTextColor(TFT_YELLOW, TFT_BLACK); //文本颜色为黄,背景为黑
targetTime = millis(); //millis()函数用于返回开始运行当前程序以来的时间(毫秒数),累积到50天溢出
}
void loop()
{
if (targetTime + 1000 < millis()) //millis()+1000事先比millis()多1000ms,为否;直到millis()又累计1s,为真
{ //每秒
targetTime = millis();
ss++; // Advance second
if (ss==60)
{
ss=0;
omm = mm; //刷新标志,每分钟更新一次
mm++; // Advance minute
if(mm>59)
{
mm=0;
hh++; // Advance hour
if (hh>23)
{
hh=0;
}
}
}
}
if (ss==0 || initial)
{//每一分钟更新一次
initial = 0;
tft.setTextColor(TFT_GREEN, TFT_BLACK);
tft.drawCentreString(__DATE__,64,62,1); //以给定的x,y作为中心显示日期,2号类型字体
tft.drawFastHLine(4, 72, 120, TFT_WHITE);
tft.setTextColor(TFT_BLUE, TFT_BLACK);
tft.drawCentreString("It is windy",64,106,2);
}
byte xpos = 3; //设置时钟文本起始坐标
byte ypos = 10;
if (omm != mm)
{
tft.setTextColor(0x39C4, TFT_BLACK);
tft.drawString("88:88",xpos,ypos,6); //阴影灰色时钟(不变),5号字体
tft.setTextColor(0xFBE0); //电子时钟前景数字(橘色
omm = mm; //omm此处作为刷新标志,每分钟刷新分钟和小时这两个数
//tft.drawChar和tft.drawNumber会返回打印内容的x轴方向变化的长度
if (hh<10) xpos += tft.drawChar('0',xpos,ypos,6); //小时个位数,多绘制一个零
xpos += tft.drawNumber(hh,xpos,ypos,6); //写小时,并返回位置保存在xpos
xcolon=xpos; //记录小时后面的冒号x坐标位置
xpos += tft.drawChar(':',xpos,ypos,6); //写冒号
if (mm<10) xpos += tft.drawChar('0',xpos,ypos,6); //分个位数,多绘制一个零
tft.drawNumber(mm,xpos,ypos,6); //分钟
}
if (ss%2)
{ // Flash the colon每两秒刷新冒号
tft.setTextColor(0x39C4, TFT_BLACK);
xpos += tft.drawChar(':',xcolon,ypos,6);
tft.setTextColor(0xFBE0, TFT_BLACK);
}
else
{
tft.drawChar(':',xcolon,ypos,6);
colour = random(0xFFFF);
//用黑色矩形擦除旧文本,这种方法的有效的祛除了显示闪烁
tft.fillRect(0, 86, 128, 20, TFT_BLACK); //(x,y,w,h,color)
tft.setTextColor(colour);
tft.drawString("Colour:",22,86,2); // Right justified string drawing to x position 75
String scolour = String(colour,HEX);
scolour.toUpperCase(); //小写变大写
char buffer[20];
scolour.toCharArray(buffer,20);
tft.drawString(buffer,72,86,2); //打印Colour颜色的十六进制数值
}
}