ESP32/ESP8266基于Arduino框架下驱动1.8“tft_oled屏幕仿数码管时钟

news2024/11/26 17:28:43

ESP32/ESP8266基于Arduino框架下驱动1.8"tft_oled屏幕仿数码管时钟


  • 📍相关篇《ESP32基于Arduino框架下U8g2驱动I2C OLED 时间显示》
  • 📺效果演示:
    在这里插入图片描述
  • 🌿屏幕显示部分,采用使用TFT_eSPI库驱动,利用该库自带的特有字体显示。
  • 🌿屏幕采用128*160 1.8"tft_Oled屏幕。
  • 🌿本工程仅在esp32上做了验证,esp8266上显示应该也没有问题。
✨主要是熟悉对屏幕驱动显示库的使用,结合利用网络获取时间作为显示内容。

📓所需库

  • 🔖所依赖库都可以在Arduino IDE管理库中搜索并直接安装到。
  • 🌿TFT_eSPI(屏幕驱动显示)
  • 🌿NTPClient (获取网络时间)

⛳注意事项

  • 🌿安装好库后,需要自行手动修改TFT_eSPI库目录下的User_Setup.h配置。根据个人使用的屏幕进行修改。
    • 🔖如果是esp32:(引脚可以根据个人使用情况设定)
// For ESP32 Dev board (only tested with GC9A01 display)
// The hardware SPI can be mapped to any pins

#define TFT_MOSI 23 // In some display driver board, it might be written as "SDA" and so on.
#define TFT_SCLK 18
#define TFT_CS   5  // Chip select control pin
#define TFT_DC   19  // Data Command control pin
#define TFT_RST  21  // Reset pin (could connect to Arduino RESET pin)
#define TFT_BL   22  // LED back-light

– 🔖如果是esp8266

// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS   PIN_D8  // Chip select control pin D8
#define TFT_DC   PIN_D3  // Data Command control pin
#define TFT_RST  PIN_D4  // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST  -1    // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V

//#define TFT_BL PIN_D1  // LED back-light (only for ST7789 with backlight control pin)
//#define TOUCH_CS PIN_D2     // Chip select pin (T_CS) of touch screen

SDA ---- D7
SCL ---- D5
CS  ---- D8
DC  ---- D3
BL ---- 3.3V
RST ---- D4或3.3v

📝程序代码

/*
 An example digital clock using a TFT LCD screen to show the time.
 Demonstrates use of the font printing routines. (Time updates but date does not.)
 
 For a more accurate clock, it would be better to use the RTClib library.
 But this is just a demo. 
 
 This examples uses the hardware SPI only. Non-hardware SPI
 is just too slow (~8 times slower!)
 
 Based on clock sketch by Gilchrist 6/2/2014 1.0
 Updated by Bodmer
A few colour codes:
 
code	color
0x0000	Black
0xFFFF	White
0xBDF7	Light Gray
0x7BEF	Dark Gray
0xF800	Red
0xFFE0	Yellow
0xFBE0	Orange
0x79E0	Brown
0x7E0	Green
0x7FF	Cyan
0x1F	Blue
0xF81F	Pink

 */
#ifdef ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
//  #include <WiFiClient.h>//3.0.2新增
//  #include <ESP8266HTTPClient.h>
#endif
// 获取网络时间相关库
#include <NTPClient.h>
#include <WiFiUdp.h>//esp32/esp8266核心固件自带
#include <SPI.h>
//屏幕显示
#include <TFT_eSPI.h>  // Graphics and font library for ST7735 driver chip
#include <SPI.h>

#define SERIAL_DEBUG  //是否开启串口调试信息输出

TFT_eSPI tft = TFT_eSPI();               // Invoke library, pins defined in User_Setup.h
TFT_eSprite sprite = TFT_eSprite(&tft);  // 创建双缓冲区

// 定义一个字符串数组
const char weekdays_en[][4] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

// 网络时间相关定义
const char *ssid = "#######";  // 填写WiFi账号
const char *password = "********";   // WiFi密码
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ntp.aliyun.com");  // NTP服务器地址

uint32_t targetTime = 0;  // for next 1 second timeout
//定义时间用变量
int16_t currentYear = 0;
int16_t currentWeekDay = 0;
int16_t currentMonth = 0;
int16_t currentMonthDay = 0;
int16_t currentHour = 0;
int16_t currentMin = 0;
int16_t currentSec = 0;

byte omm = 99;
bool initial = 1;
byte xcolon = 0;
unsigned int colour = 0;
uint8_t ss,mm;
void updateTime();

void setup(void) {

#ifdef SERIAL_DEBUG
  Serial.begin(115200);  // 初始化串口通信,波特率为115200
#endif
  // ===网络时间初始化设定===
  // 连接WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {  // 等待WiFi连接成功
    delay(500);
#ifdef SERIAL_DEBUG
    Serial.print(".");
#endif
  }
  timeClient.begin();               // 初始化NTPClient
  timeClient.setTimeOffset(28800);  // 时区设置,时间偏移为28800秒(8小时)
  // ===TFT初始化设定===
  tft.begin();                    // 初始化显示寄存器
  tft.setRotation(1);             // 设置显示屏旋转角度(0表示不旋转,根据需要调整)0, 1, 2, 3 分别代表 0°、90°、180°、270°,可设置4为镜像。
  sprite.setColorDepth(16);       // 设置颜色深度(根据你的需求)
  sprite.setSwapBytes(true);      // 设置字节顺序,将RGB颜色顺序转换为BGR以正确显示颜色。
  sprite.createSprite(160, 128);  // 创建一个128x160像素的绘图窗口
  sprite.fillScreen(TFT_BLACK);

  sprite.setTextColor(TFT_YELLOW, TFT_BLACK);  // Note: the new fonts do not draw the background colour
  updateTime();//更新一次
  targetTime = millis() + 1000;
}

void loop() {
  if (targetTime < millis()) {
    targetTime = millis() + 1000;
    updateTime();
    byte Sec_Point = 82;
    if (ss != currentSec) {
      ss = currentSec;  // Advance second
      sprite.setTextColor(TFT_GREEN, TFT_BLACK);
      //    sprite.setCursor (8, 110);
      //sprite.println(timeClient.getFormattedTime());
      char buffer2[11];
      //  sprite.printf("%04d-%02d-%02d", currentYear, currentMonth, currentMonthDay);//显示日期
      sprintf_P(buffer2, "%04d-%02d-%02d", currentYear, currentMonth, currentMonthDay);
      sprite.drawString(buffer2, 16, 105, 4);     //显示日期
      sprite.setTextColor(TFT_BLUE, TFT_BLACK);  //橙色
      //sprite.setTextColor(0xF81F, TFT_BLACK); // Pink
      //   sprite.drawCentreString("",120,48,2); // (居中)Next size up font 2
      sprite.drawString(weekdays_en[currentWeekDay], 8, 64, 4);  //绘制字符串, 打印 星期几
      sprite.pushSprite(0, 0);
      //  sprite.setTextColor(0xFBE0);     // Orange
      sprite.setTextColor(TFT_GREEN, TFT_BLACK);     
      if (currentSec < 10) {//显示秒
        Sec_Point +=sprite.drawChar('0', Sec_Point, 50, 7);
      }
      sprite.drawNumber(currentSec, Sec_Point, 50, 7);  //显示秒
      sprite.pushSprite(0, 0);
    }

    // Update digital time
    byte xpos = 6;
    byte ypos = 0;
    if (omm != currentMin) {  // Only redraw every minute to minimise flicker
      sprite.setTextColor(0x39C4, TFT_BLACK);  // Leave a 7 segment ghost image, comment out next line!
      // Font 7 is to show a pseudo 7 segment display.
      // Font 7 only contains characters [space] 0 1 2 3 4 5 6 7 8 9 0 : .
      sprite.drawString("88:88", xpos, ypos, 7);  // Overwrite the text to clear it
      sprite.setTextColor(0xFBE0);                // Orange
      omm = currentMin;

      if (currentHour < 10) xpos += sprite.drawChar('0', xpos, ypos, 7);
      xpos += sprite.drawNumber(currentHour, xpos, ypos, 7);  //显示时
      sprite.pushSprite(0, 0);
      xcolon = xpos;
      xpos += sprite.drawChar(':', xpos, ypos, 7);
      if (currentMin < 10) xpos += sprite.drawChar('0', xpos, ypos, 7);
      sprite.drawNumber(currentMin, xpos, ypos, 7);  //显示分
      sprite.pushSprite(0, 0);
    }

    if (ss % 2) {  // Flash the colon
      sprite.setTextColor(0x39C4, TFT_BLACK);  //字体颜色
      xpos += sprite.drawChar(':', xcolon, ypos, 7);
      sprite.pushSprite(0, 0);

    } else {
      sprite.drawChar(':', xcolon, ypos, 7);
      sprite.pushSprite(0, 0);
      // Erase the old text with a rectangle, the disadvantage of this method is increased display flicker
      sprite.fillRect(0, 64, 160, 20, TFT_BLACK);//区域清除
    }
  }
}

void updateTime() {
  timeClient.update();                                  // 更新时间信息
  unsigned long epochTime = timeClient.getEpochTime();  // 获取当前时间的时间戳
#ifdef ESP32
  struct tm *ptm = gmtime((time_t *)&epochTime);  // 将时间戳转换为tm结构体
#else
  time_t ntpTime = (time_t)epochTime;
  struct tm *ptm = localtime(&ntpTime);  // 将时间戳转换为tm结构体
#endif
  // 将epochTime换算成年月日
  currentYear = ptm->tm_year + 1900;  // 获取年份
  currentMonth = ptm->tm_mon + 1;     // 获取月份
  currentMonthDay = ptm->tm_mday;     // 获取月份中的日期
#ifdef ESP32
  currentWeekDay = ptm->tm_wday;  // 获取星期几
  if (currentWeekDay < 0) {
    currentWeekDay += 7;  // 将负数转换为正数
  }
  currentHour = ptm->tm_hour;  // 获取时
  currentMin = ptm->tm_min;    // 获取分
  currentSec = ptm->tm_sec;    // 获取秒
#else
  currentHour = timeClient.getHours();   // 获取时
  currentMin = timeClient.getMinutes();  // 获取分
  currentSec = timeClient.getSeconds();  // 获取秒
  currentWeekDay = timeClient.getDay();  // 获取星期几
#endif
#ifdef SERIAL_DEBUG
  // 打印时间
  Serial.println("Epoch Time: " + String(epochTime));  // 打印时间戳
  Serial.println(timeClient.getFormattedTime());       // 打印时间格式
  Serial.printf("NTP Time: %04d-%02d-%02d\n", currentYear, currentMonth, currentMonthDay);
#endif
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1208023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2021年03月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 花花幼儿园有三个班。根据下面三句话,请你猜一猜,哪个班级人数最多? (1)中班比小班少 (2)中班比大班少 (3)大班比小班多 A:小班 B:中班 C:大班 D:三个班级一样多 答案:C 根据(1)(2)可以知道中班人数最少,根…

Power Automate-创建一个power Apps使用的流

创建即时云端流&#xff0c;选择Power Apps

口袋参谋:99.99%的商家,都不知道这个选品神器!!!

​至少有99.99%的商家是不知道如何选品的&#xff1f;很多人都是看人家卖什么&#xff0c;自己就卖什么&#xff1f;就比如卖连衣裙的&#xff0c;试问咱们卖之前都不做一下调查吗&#xff1f; 现在同质化的商品太多了&#xff0c;随便搜一个&#xff0c;就有成千上万的竞争者…

EasyA正在帮助Sui为新一代Web3 App培养构建者

最近&#xff0c;我们采访了Phil和Dom Kwok&#xff0c;他们是兄弟也是Web3教育移动应用EasyA的共同创始人。这个教育app通过学习模块和编码挑战的形式&#xff0c;向开发人员教授有关不同区块链及其独特特性的知识。他们在十月初推出了他们的第一个Sui模块&#xff0c;并在随后…

(个人实测保熟)记录Tecnomatix Process Simulate 16.1.2官方安装包及授权许可配置教程(Win10环境)

Tecnomatix Process Simulate 16是一款由西门子公司推出的一款工艺仿真解决方案,是虚拟制造仿真领域的领先解决方案,可帮助您数字化制造以及将创新思想和原材料转变为变革性产品的过程。在网上找了一些盗版的安装包&#xff0c;就很离谱。直接提示本"无法打开此安装程序包…

数字化时代,企业如何增加产品销售额

2023作为提振消费年&#xff0c;国民宏观经济环境正在复苏&#xff0c;而数字化技术的进步也使消费者的购买方式发生了翻天覆地的变化&#xff0c;对于企业而言&#xff0c;应该如何顺势而上增加产品销售额&#xff0c;成为其成功的关键。 今天媒介盒子就来和大家聊聊企业如何…

多商家签到打卡奖励免单霸王餐小程序开发

多商家签到打卡奖励免单霸王餐小程序开发 用户注册和登录&#xff1a;提供用户注册和登录功能&#xff0c;以便用户能够参与签到打卡活动。 商家入驻&#xff1a;商家可申请入驻平台&#xff0c;提交相关资料并等待平台审核&#xff0c;审核通过后即可发布活动和奖励。 签到打…

python读取txt格式的点云文件,可视化显示,保存ply格式

在计算机视觉和三维几何处理中&#xff0c;点云是一种重要的数据表示形式。点云由许多离散的点组成&#xff0c;每个点都有三维坐标&#xff0c;通常还包括其他信息。 空格形式的点云文件 import open3d as o3ddef read_txt_space(txt_file):# 读取点云数据pcd o3d.io.read_p…

智慧隧道:TSINGSEE青犀远程视频AI智能监管平台保障隧道施工安全

一、背景与需求分析 随着我国交通运输量的增加以及新基建的不断规划和建设&#xff0c;公路建设工作也在持续开展中。高速公路隧道属于特殊构造段&#xff0c;因为隧道空间小&#xff0c;密闭性强&#xff0c;施工过程中一旦发生火灾、事故等&#xff0c;将带来重大人员伤亡和…

计算机毕业设计选题推荐-记录生活微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Pytorch自动混合精度的计算:torch.cuda.amp.autocast

1 autocast介绍 1.1 什么是AMP? 默认情况下&#xff0c;大多数深度学习框架都采用32位浮点算法进行训练。2017年&#xff0c;NVIDIA研究了一种用于混合精度训练的方法&#xff0c;该方法在训练网络时将单精度&#xff08;FP32&#xff09;与半精度(FP16)结合在一起&#xff…

致刘家窑中医院龚洪海医生:患者的感谢与敬意

你们好!我曾经是咱们这的一名患者&#xff0c;我叫李刚&#xff0c;今年45岁&#xff0c;不知道你们还有印象吗?我曾去过一些医院进行就诊&#xff0c;但都没有得到恰当的治疗&#xff0c;症状一直没有消失。得了这个病之后对我的生活以及工作打击都十分的大。经朋友介绍说刘家…

Realistic fault detection of li-ion battery via dynamical deep learning

昇科能源、清华大学欧阳明高院士团队等的最新研究成果《动态深度学习实现锂离子电池异常检测》&#xff0c;用已经处理的整车充电段数据&#xff0c;分析车辆当前或近期是否存在故障。 思想步骤&#xff1a; 用正常电池的充电片段数据构造训练集&#xff0c;用如下的方式构造…

SwiftUI - 界面布局知识点

前言 SwiftUI采用的布局方式是和Flutter一样是弹性布局&#xff0c;而不是iOS之前的坐标轴的方式布局&#xff0c;不用准确的设置出位置大小&#xff0c;只需要设置当前视图大小及视图间排布的方式。灵活性增强&#xff0c;布局操作简便&#xff0c;SwiftUI与Flutter布局原理一…

基于SSM的供电所档案管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

交换机基础知识之安全配置

交换机在网络基础设施中扮演着重要角色&#xff0c;它促进了设备之间数据包的流动。正因此&#xff0c;采取适当的安全措施来保护网络免受未经授权的访问和潜在攻击至关重要。本文将全面解读交换机基础安全配置知识&#xff0c;并提供实践方案&#xff0c;以保证安全的网络环境…

Istio学习笔记-体验istio

参考Istio 入门(三)&#xff1a;体验 Istio、微服务部署、可观测性 - 痴者工良 - 博客园 (cnblogs.com) 在本章中&#xff0c;我们将会学习到如何部署一套微服务、如何使用 Istio 暴露服务到集群外&#xff0c;并且如何使用可观测性组件监测流量和系统指标。 本章教程示例使用…

Vue CLI脚手架安装、搭建、配置 和 CLI项目分析

目录 一、CLI快速入门 1. 官方介绍 : 2.安装Vue CLI : 3.搭建Vue CLI : 4.IDEA配置Vue CLI : 二、Vue CLI项目分析 1.结构分析 : 1.1 config 1.2 node_modules 1.3 src 1.4 static 2.流程分析 : 2.1 main.js 2.2 router/index.js 2.3 components/HelloWorld.vue 2.4 A…

Vue3源码reactive和readonly对象嵌套转换,及实现shallowReadonly

前言 官方文档中对reactive的描述&#xff1a; 响应式转换是“深层”的&#xff1a;它会影响到所有嵌套的属性。一个响应式对象也将深层地解包任何 ref 属性&#xff0c;同时保持响应性。 官方文档中对readonly的描述: 只读代理是深层的&#xff1a;对任何嵌套属性的访问都将是…

城市内涝监测仪的作用有哪些?

城市内涝近几年愈发频繁&#xff0c;它的出现不仅仅会导致财产损失&#xff0c;还可能危及公共安全。所以对路面积水进行实时监测刻不容缓。内涝积水监测仪的早期警报系统&#xff0c;有助于提高城市的紧急响应能力。政府远程监控城市路面水位&#xff0c;实现精准的系统化管理…