ili9431液晶 tft_espi图形库演示 时钟、天气、滚动、气象图标

米思齐tft_spi模块库演示程序。心知天气、阿里云时钟、WiFi信号强度检测、1分钟滚屏、更新天气时间为15分钟、加入天气图标。更新天气次数。断网检测 。此程序为tft_eSPI图形库演示、如感觉好可以自行优化。

ili9431tft_espi库是用于ESP32和ESP8266芯片的TFT LCD驱动程序库,可用于控制ILI9341和ILI9431 TFT显示屏。以下是配置ili9431tft_espi库的步骤:

  1. 下载并安装Arduino IDE。

  2. 在Arduino IDE中,导航到“文件”>“首选项”>“附加开发板管理器网址”并输入以下网址:

    https://dl.espressif.com/dl/package_esp32_index.json,http://arduino.esp8266.com/stable/package_esp8266com_index.json

  3. 点击“确定”按钮,关闭“首选项”窗口。

  4. 导航到“工具”>“开发板”>“开发板管理器”。

  5. 在搜索栏中输入“ESP32”或“ESP8266”,然后选择相应的开发板并安装。

  6. 连接ILI9341或ILI9431 TFT显示屏到ESP32或ESP8266芯片。

  7. 在Arduino IDE中,打开一个示例程序(例如:ILI9431test)。

  8. 在示例程序中,确保指定正确的引脚连接和显示屏类型:

    #define TFT_DC 15
    #define TFT_CS 14
    #define TFT_RST -1
    #define TFT_MOSI 23
    #define TFT_CLK 18
    #define TFT_MISO -1

    ESP_ILI9341 tft = ESP_ILI9341(TFT_CS, TFT_DC, TFT_RST, TFT_MOSI, TFT_CLK, TFT_MISO);

  9. 上传示例程序到开发板。

  10. 测试ILI9341或ILI9431 TFT显示屏是否能够正常工作。

程序图 mixly1.20版本,其它版本未测

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完整代码如下:

#include <zh_font20.h>
#include <FxLED_32.h>
#include <weathz.h>
#include <textmatrix.h>
#include <SPI.h>
#include <TFT_eSPI.h>
#include <ESP8266WiFi.h>
#include <TimeLib.h>
#include <NtpClientLib.h>
#include <TJpg_Decoder.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>volatile int shu;
volatile int start_xz;
volatile unsigned long dingshi_xz;
volatile unsigned long now_xz;
volatile int code_day;
volatile int code_ye;
volatile bool clear;
int8_t timeZone = 8;
const PROGMEM char *ntpServer = "ntp1.aliyun.com";char x_map[4] = "" ;
char x_night[12] = "" ;
char code_night[4] = "" ;
char x_day[12] = "" ;
char iconday[4] = "" ;
char x_wdhigh[6] = "" ;
char x_wdlow[6] = "" ;
char x_humidity[5] = "" ;
char x_wind_direction[20] = "" ;
char x_direction_degree[5] = "" ;
char x_scale[3] = "" ;
char x_speed[5] = "" ;
char x_rainfall[6] = "" ;
char x_precip[6] = "" ;
TFT_eSPI tft = TFT_eSPI();
bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t* bitmap)
{if (y >= tft.height()) return 0;tft.pushImage(x, y, w, h, bitmap);return 1;
}void dispaly_clear() {if (clear == false) {tft.fillScreen(TFT_BLACK);clear = true;}
}void nowifi() {int num = 0;while (!(WiFi.status() == WL_CONNECTED)) {dispaly_clear();tft.drawRect(28,98,180,11,TFT_WHITE);tft.fillRect(30,100,num,7,TFT_YELLOW);tft.loadFont(zh_font20);tft.setCursor(70,120);tft.setTextColor(TFT_GREEN,TFT_BLACK);tft.println("网络失败!!");tft.setCursor(60,150);tft.print("请配置网络!!!");tft.unloadFont();//卸载字库占用内存delay(80);num++;if (num >= 178) {num = 0;tft.fillScreen(TFT_BLACK);}if (WiFi.status() == WL_CONNECTED == 1) {tft.fillScreen(TFT_BLACK);break;}}
}void shibai() {tft.fillScreen(TFT_BLACK);tft.loadFont(zh_font20);tft.setCursor(30,120);tft.setTextColor(TFT_PURPLE,TFT_BLACK);tft.print("请配置 wifi  网络");tft.unloadFont();//卸载字库占用内存
}String getzhenshu(int zhs) {String s = "";if (zhs < 10) {s = String("0") + String(zhs);} else {s = zhs;}return s;
}uint8_t getwifiriis() {uint32_t db = WiFi.RSSI();if (db <= -100) {return 0;} else if (db >= -50) {return 100;} else {return (2 * (db + 100));}return db;
}String getday_yyr() {String s = "";s = String(NTP.getDateYear()) + String("年") + String(getzhenshu(NTP.getDateMonth())) + String("月") + String(getzhenshu(NTP.getDateDay())) + String("日");return s;
}String gettime_m() {String s = "";s = String(getzhenshu(NTP.getTimeSecond()));return s;
}String gettime_hf() {String s = "";s = String(getzhenshu(NTP.getTimeHour24())) + String(":") + String(getzhenshu(NTP.getTimeMinute()));return s;
}String getweek() {String s = "";switch (NTP.getDateWeekday()) {case 1:s = "星期一";break;case 2:s = "星期二";break;case 3:s = "星期三";break;case 4:s = "星期四";break;case 5:s = "星期五";break;case 6:s = "星期六";break;case 7:s = "星期日";break;default:break;}return s;
}TFT_eSprite spr = TFT_eSprite(&tft);
TFT_eSprite clk = TFT_eSprite(&tft);
void tft_weathr() {tft.setTextColor(TFT_SILVER ,TFT_BLACK);tft.setCursor(0,1,1);tft.print(String("up data:") + String(shu));tft.loadFont(zh_font20);tft.setTextColor(TFT_YELLOW,TFT_BLACK);tft.drawString(String("白天:") + String(x_day),1,155);tft.drawString(String("夜间:") + String(x_night),120,155);tft.drawString(String("高温:") + String(String(x_wdhigh) + String("℃")),1,176);tft.drawString(String("低温:") + String(String(x_wdlow) + String("℃")),120,176);tft.drawString(String("湿度:") + String(x_humidity),1,197);tft.drawString(String("等级:") + String(x_scale),120,197);tft.drawString(String("风速:") + String(x_speed),1,218);tft.drawString(String("角度:") + String(x_direction_degree),120,218);tft.drawString(String("雨量:") + String(x_rainfall),1,239);tft.drawString(String("雨概率:") + String(x_precip),120,239);tft.drawString(String("风向:") + String(x_wind_direction),1,260);tft.unloadFont();//卸载字库占用内存TJpgDec.drawJpg(15,96,weatherico(code_day), sizeof(wico10));TJpgDec.drawJpg(130,96,weatherico(code_ye), sizeof(wico10));
}void weathr_up() {// 40分钟更新一次if (millis() - dingshi_xz > 1500000 || start_xz == 0) {dingshi_xz = millis();shu++;String weather;WiFiClient client;HTTPClient http;BearSSL::WiFiClientSecure wificlient;wificlient.setInsecure();http.begin(client,"http://api.seniverse.com/v3/weather/daily.json?key=你的心知天气密钥&location=ip&language=zh-Hans&unit=c&start=0&days=1");int httpCode = http.GET();if (httpCode > 0) {Serial.printf("[HTTP] GET... code: %d", httpCode);Serial.println();if (httpCode == HTTP_CODE_OK) {String payload = http.getString();weather += payload;}}http.end();delay(10);StaticJsonDocument<1024> doc;DeserializationError error = deserializeJson(doc,weather);if (error) {Serial.print(F("deserializeJson() failed: "));Serial.println(error.f_str());return;}JsonObject results_0 = doc["results"][0];;JsonObject results_0_location = results_0["location"];;strcpy(x_map , results_0_location["name"]);JsonObject results_0_daily_0 = results_0["daily"][0];;strcpy(x_day , results_0_daily_0["text_day"]);strcpy(iconday , results_0_daily_0["code_day"]);strcpy(x_night , results_0_daily_0["text_night"]);strcpy(code_night , results_0_daily_0["code_night"]);strcpy(x_wdhigh , results_0_daily_0["high"]);strcpy(x_wdlow , results_0_daily_0["low"]);strcpy(x_humidity , results_0_daily_0["humidity"]);// 风向 东南西北风// 风向文字strcpy(x_wind_direction , results_0_daily_0["wind_direction"]);// 风向角度,范围0~360strcpy(x_direction_degree , results_0_daily_0["wind_direction_degree"]);// 风力等级strcpy(x_scale , results_0_daily_0["wind_scale"]);// 风速/mstrcpy(x_speed , results_0_daily_0["wind_speed"]);// 降水量,0.00 单位mmstrcpy(x_rainfall , results_0_daily_0["rainfall"]);// 降水量,0.00 单位mmstrcpy(x_precip , results_0_daily_0["precip"]);tft.fillScreen(TFT_BLACK);start_xz = 1;if (NTP.getTimeHour24() == 0) {shu = 0;}}
}void time_man() {clk.setColorDepth(8);clk.loadFont(zh_font20);clk.createSprite(140,21);clk.fillSprite(TFT_BLACK);clk.setTextDatum(CC_DATUM);clk.setTextColor(TFT_YELLOW,TFT_BLACK);clk.drawString((getday_yyr()),68,11);clk.pushSprite(50,14);clk.deleteSprite();clk.unloadFont();clk.setColorDepth(8);clk.setTextFont(7);clk.createSprite(135,48);clk.fillSprite(TFT_BLACK);clk.setTextDatum(CC_DATUM);clk.setTextColor(TFT_GREEN,TFT_BLACK);clk.drawString((gettime_hf()),67,24);clk.pushSprite(20,42);clk.deleteSprite();clk.unloadFont();clk.setColorDepth(8);clk.loadFont(zh_font20);clk.createSprite(61,21);clk.fillSprite(TFT_BLACK);clk.setTextDatum(CC_DATUM);clk.setTextColor(TFT_WHITE,TFT_BLACK);clk.drawString((getweek()),30,11);clk.pushSprite(173,40);clk.deleteSprite();clk.unloadFont();clk.setColorDepth(8);clk.loadFont(FxLED_32);clk.createSprite(38,30);clk.fillSprite(TFT_BLACK);clk.setTextDatum(CC_DATUM);clk.setTextColor(TFT_ORANGE,TFT_BLACK);clk.drawString((gettime_m()),19,16);clk.pushSprite(160,59);clk.deleteSprite();clk.unloadFont();
}void wifi_riis() {spr.setColorDepth(8);spr.createSprite(10,10);spr.fillSprite(TFT_BLACK);spr.setTextDatum(CC_DATUM);for(int i = 0;i<4;i ++){for(int j = 0;j<(2 * (i + 1));j++){if (getwifiriis() > i * 25 || j == 0) {spr.drawPixel((2 + 2 * i),(8 - j),TFT_GREEN);}}}spr.pushSprite(231,1);spr.deleteSprite();clk.setColorDepth(8);clk.setTextFont(1);clk.createSprite(22,10);clk.fillSprite(TFT_BLACK);clk.setTextDatum(CC_DATUM);clk.setTextColor(TFT_WHITE,TFT_BLACK);clk.drawString(String(((String)(getwifiriis()))) + String("%"),11,5);clk.pushSprite(207,1);clk.deleteSprite();clk.unloadFont();
}void setup(){shu = 0;start_xz = 0;dingshi_xz = 0;now_xz = 0;code_day = 0;code_ye = 0;clear = false;Serial.begin(9600);tft.begin();tft.setRotation(0);tft.fillScreen(TFT_BLACK);tfts.init();setupScrollArea(TOP_FIXED_AREA, BOT_FIXED_AREA);WiFi.mode(WIFI_STA);int cnt = 0;while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");if (cnt++ >= 10){WiFi.beginSmartConfig();while (1) {delay(1000);if (WiFi.smartConfigDone()) {Serial.println();Serial.println("SmartConfig: Success");break;}Serial.print("|");shibai();//无判断条件:可不创建函数。加判断条件:请创建shibai();。}}}WiFi.printDiag(Serial);Serial.println(WiFi.localIP());Serial.println("网络配置成功。可以上网啦!");NTP.setInterval (600);NTP.setNTPTimeout (1500);NTP.begin (ntpServer, timeZone, false);TJpgDec.setJpgScale(1);TJpgDec.setSwapBytes(true);TJpgDec.setCallback(tft_output);}void loop(){code_day = atoi(iconday);code_ye = atoi(code_night);nowifi();wifi_riis();weathr_up();time_man();tft_weathr();clear = false;if (String((gettime_m())).equals(String("00"))) {scroll_slow(62,30);}}

效果演示

在这里插入图片描述

#include <zh_font20.h> //自制中文字库

#include <FxLED_32.h>//段码时间小字库

#include <weathz.h> //气象图标

#include <textmatrix.h>//滚屏

#include <TJpg_Decoder.h>//图片库

如用arduino IDE需将上边库文件放到一个文件夹下即可编译。

如用mixly 米思齐编译器 上边文件必须放在这安装目录下。如:D:\Mixly1.20back\arduino\portable\sketchbook\libraries\Fonts 。Fonts这为新建文件夹名字。

在这里插入图片描述

总之比较麻烦,按步骤操作。打包送喜欢爱折腾的你。

注意这里: http.begin(client,“http://api.seniverse.com/v3/weather/daily.json?key=你的心知天气密钥&location=ip&language=zh-Hans&unit=c&start=0&days=1”);

下载地址:https://download.csdn.net/download/lnwqh/88388748

有问题可以私信或留言,没事点点赞或留个言多交流。哈哈哈

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端——html面试题(一)

文章目录 前言一、说说你对 html 语义化的理解。二、html的标签有哪些三、标签类型1、问题&#xff1a;请说说你对块级元素、行内元素、空元素的理解&#xff0c;它们分别都有哪些常见的标签&#xff1f; 总结 前言 说说对html语义化的理解html的标签标签类型 一、说说你对 ht…

国庆day5---QT实现TCP服务器客户端搭建的代码,现象

ser.h #ifndef SER_H #define SER_H#include <QWidget> #include<QTcpServer> //服务器头文件 #include<QTcpSocket> //客户端头文件 #include<QMessageBox> //消息对话框 #include<QList> //链表头文件QT_BEGIN_NAMESPACE nam…

孔雀东南飞:经济高质量发展与人才流动(数据复现)

数据简介&#xff1a;人才是经济高质量发展的动力源泉。中国ZF一直高度重视人才培养&#xff0c;积极发挥人才作用。“人才是第一资源”,“深入实施……人才强国战略”,“坚持……人才引领驱动”。与此同时&#xff0c;地方ZF大力引进人才&#xff0c;不断推出各类人才优待政策…

二十,镜面IBL--打印BRDF积分贴图

比起以往&#xff0c;这节应该是最轻松的了&#xff0c; 运行结果如下 代码如下&#xff1a; #include <osg/TextureCubeMap> #include <osg/TexGen> #include <osg/TexEnvCombine> #include <osgUtil/ReflectionMapGenerator> #include <osgDB/Re…

C#(CSharp)入门教程

目录 C#的第一个程序 变量 折叠代码 变量类型和声明变量 获取变量类型所占内存空间&#xff08;sizeof&#xff09; 常量 转义字符 隐式转换 显示转换 异常捕获 运算符 算术运算符 布尔逻辑运算符 关系运算符 位运算符 其他运算符 字符串拼接 …

《XSS-Labs》02. Level 11~20

XSS-Labs 索引Level-11题解 Level-12题解 Level-13题解 Level-14题解 Level-15题解 Level-16题解 Level-17题解 Level-18~20题解 靶场部署在 VMware - Win7。 靶场地址&#xff1a;https://github.com/do0dl3/xss-labs 只要手动注入恶意 JavaScript 脚本成功&#xff0c;就可以…

协议栈——连接服务器

如对方的ip和port配置信息&#xff0c;这里的连接是指通信前的准备工作 上一篇介绍查看套接字的命令时&#xff0c;可以看到很多信息&#xff0c;但是刚刚创建出来的套接字是什么信息都没有的&#xff0c;协议栈也因此不知道和谁通信&#xff1b; 客户端填补信息 这一步中调…

93、Redis 之 使用连接池管理Redis6.0以上的连接 及 消息的订阅与发布

★ 使用连接池管理Redis连接 从Redis 6.0开始&#xff0c;Redis可支持使用多线程来接收、处理客户端命令&#xff0c;因此应用程序可使用连接池来管理Redis连接。 上一章讲的是创建单个连接来操作redis数据库&#xff0c;这次使用连接池来操作redis数据库 Lettuce连接池 支持…

PHP图片文件管理功能系统源码

文件图库管理单PHP源码直接解压就能用&#xff0c;单文件&#xff0c;indexm.php文件可以重新命名&#xff0c;上传到需要访问的目录中&#xff0c; 可以查看目录以及各个文件&#xff0c;图片等和下载及修改管理服务。 源码下载&#xff1a;https://download.csdn.net/downloa…

数据结构--队列与循环队列的实现

数据结构–队列的实现 1.队列的定义 比如有一个人叫做张三,这天他要去医院看病,看病时就需要先挂号,由于他来的比较晚,所以他的号码就比较大,来的比较早的号码就比较小,需要到就诊窗口从小号到大依次排队,前面的小号就诊结束之后,才会轮到大号来,小号每就诊完毕就销毁,每新来…

零基础Linux_11(进程)进程程序替换+实现简单的shell

目录 1. 进程程序替换 1.1 程序替换原理 1.2 execl 接口 1.3 execv execlp execvp 1.4 exec 调各种程序 1.5 execle 接口 2. 实现简单的shell 2.1 打印提示和获取输入 2.2 拆开输入的命令和选项 2.3 创建进程和程序替换执行命令 2.4 内建命令实现路径切换 2.5 my…

数据结构: 数组与链表

目录 1 数组 1.1 数组常用操作 1. 初始化数组 2. 访问元素 3. 插入元素 4. 删除元素 5. 遍历数组 6. 查找元素 7. 扩容数组 1.2 数组优点与局限性 1.3 数组典型应用 2 链表 2.1 链表常用操作 1. 初始化链表 2. 插入节点 3. 删除…